more operations for lexicographic ordering;
authorwenzelm
Sun, 23 Apr 2023 21:31:00 +0200
changeset 77912 430e6c477ba4
parent 77911 b83a561086d3
child 77913 019186a60c84
child 77932 1c7ce7943396
more operations for lexicographic ordering;
src/Pure/General/set.ML
src/Pure/library.ML
--- a/src/Pure/General/set.ML	Sun Apr 23 20:15:53 2023 +0200
+++ b/src/Pure/General/set.ML	Sun Apr 23 21:31:00 2023 +0200
@@ -24,6 +24,7 @@
   val member: T -> elem -> bool
   val subset: T * T -> bool
   val eq_set: T * T -> bool
+  val ord: T ord
   val insert: elem -> T -> T
   val make: elem list -> T
   val merge: T * T -> T
@@ -278,9 +279,24 @@
 
 fun subset (set1, set2) = forall (member set2) set1;
 
+
+(* equality and order *)
+
 fun eq_set (set1, set2) =
   pointer_eq (set1, set2) orelse size set1 = size set2 andalso subset (set1, set2);
 
+val ord =
+  pointer_eq_ord (fn (set1, set2) =>
+    (case int_ord (size set1, size set2) of
+      EQUAL =>
+        (case get_first (fn a => if member set2 a then NONE else SOME a) set1 of
+          NONE => EQUAL
+        | SOME a =>
+            (case get_first (fn b => if member set1 b then NONE else SOME b) set2 of
+              NONE => EQUAL
+            | SOME b => Key.ord (a, b)))
+    | order => order));
+
 
 (* insert *)
 
--- a/src/Pure/library.ML	Sun Apr 23 20:15:53 2023 +0200
+++ b/src/Pure/library.ML	Sun Apr 23 21:31:00 2023 +0200
@@ -210,6 +210,8 @@
   val dict_ord: ('a * 'b -> order) -> 'a list * 'b list -> order
   val length_ord: 'a list * 'b list -> order
   val list_ord: ('a * 'b -> order) -> 'a list * 'b list -> order
+  val vector_ord: 'a ord -> 'a vector ord
+  val array_ord: 'a ord -> 'a array ord
   val sort: 'a ord -> 'a list -> 'a list
   val sort_distinct: 'a ord -> 'a list -> 'a list
   val sort_strings: string list -> string list
@@ -957,6 +959,12 @@
 fun length_ord (xs, ys) = int_ord (length xs, length ys);
 fun list_ord elem_ord = length_ord ||| dict_ord elem_ord;
 
+fun vector_ord ord =
+  pointer_eq_ord (int_ord o apply2 Vector.length ||| Vector.collate ord);
+
+fun array_ord ord =
+  pointer_eq_ord (int_ord o apply2 Array.length ||| Array.collate ord);
+
 
 (* sorting *)