diff -r b161057bdd41 -r 88064da0ae76 src/HOL/Library/Comparator.thy --- a/src/HOL/Library/Comparator.thy Tue Apr 01 10:20:14 2025 +0200 +++ b/src/HOL/Library/Comparator.thy Tue Apr 01 12:10:45 2025 +0200 @@ -188,6 +188,18 @@ end +lemma compare_default_eq_Less_iff [simp]: + \compare default x y = Less \ x < y\ + by transfer simp + +lemma compare_default_eq_Equiv_iff [simp]: + \compare default x y = Equiv \ x = y\ + by transfer auto + +lemma compare_default_eq_Greater_iff [simp]: + \compare default x y = Greater \ x > y\ + by transfer auto + text \A rudimentary quickcheck setup\ instantiation comparator :: (enum) equal @@ -237,6 +249,10 @@ by standard (auto intro: trans_equiv trans_less simp: greater_iff_sym_less) qed +lemma compare_reversed_apply [simp]: + \compare (reversed cmp) x y = compare cmp y x\ + by transfer simp + lift_definition key :: \('b \ 'a) \ 'a comparator \ 'b comparator\ is \\f cmp a b. cmp (f a) (f b)\ proof - @@ -247,6 +263,43 @@ by standard (auto intro: trans_equiv trans_less simp: greater_iff_sym_less) qed +lemma compare_key_apply [simp]: + \compare (key f cmp) x y = compare cmp (f x) (f y)\ + by transfer simp + +lift_definition prod_lex :: \'a comparator \ 'b comparator \ ('a \ 'b) comparator\ + is \\f g (a, c) (b, d). case f a b of Less \ Less | Equiv \ g c d | Greater \ Greater\ +proof - + fix f :: \'a \ 'a \ comp\ and g :: \'b \ 'b \ comp\ + assume \comparator f\ + then interpret f: comparator f . + assume \comparator g\ + then interpret g: comparator g . + define h where \h = (\(a, c) (b, d). case f a b of Less \ Less | Equiv \ g c d | Greater \ Greater)\ + then have h_apply [simp]: \h (a, c) (b, d) = (case f a b of Less \ Less | Equiv \ g c d | Greater \ Greater)\ for a b c d + by simp + have h_equiv: \h p q = Equiv \ f (fst p) (fst q) = Equiv \ g (snd p) (snd q) = Equiv\ for p q + by (cases p; cases q) (simp split: comp.split) + have h_less: \h p q = Less \ f (fst p) (fst q) = Less \ f (fst p) (fst q) = Equiv \ g (snd p) (snd q) = Less\ for p q + by (cases p; cases q) (simp split: comp.split) + have h_greater: \h p q = Greater \ f (fst p) (fst q) = Greater \ f (fst p) (fst q) = Equiv \ g (snd p) (snd q) = Greater\ for p q + by (cases p; cases q) (simp split: comp.split) + have \comparator h\ + apply standard + apply (simp_all add: h_equiv h_less h_greater f.greater_iff_sym_less g.greater_iff_sym_less f.sym g.sym) + apply (auto intro: f.trans_equiv g.trans_equiv f.trans_less g.trans_less f.trans_less_equiv f.trans_equiv_less) + done + then show \comparator (\(a, c) (b, d). case f a b of Less \ Less + | Equiv \ g c d + | Greater \ Greater)\ + by (simp add: h_def) +qed + +lemma compare_prod_lex_apply: + \compare (prod_lex cmp1 cmp2) p q = + (case compare (key fst cmp1) p q of Less \ Less | Equiv \ compare (key snd cmp2) p q | Greater \ Greater)\ + by transfer (simp add: split_def) + subsection \Direct implementations for linear orders on selected types\ @@ -257,7 +310,7 @@ \compare comparator_bool = (\p q. if p then if q then Equiv else Greater else if q then Less else Equiv)\ - by (auto simp add: fun_eq_iff) (transfer; simp)+ + by (auto simp add: fun_eq_iff) definition raw_comparator_nat :: \nat \ nat \ comp\ where [simp]: \raw_comparator_nat = compare default\