# HG changeset patch # User paulson # Date 1621365919 -3600 # Node ID 2e3a60ce5a9f9e9cbc803bcb8202fdc3af2d35f2 # Parent 4b1386b2c23e7405a6ebcd748ae19804a3173241# Parent 06aeb9054c07772f376e92e1090aecfe3384b61b merged diff -r 4b1386b2c23e -r 2e3a60ce5a9f src/HOL/Library/RBT_Set.thy --- a/src/HOL/Library/RBT_Set.thy Mon May 17 09:07:30 2021 +0000 +++ b/src/HOL/Library/RBT_Set.thy Tue May 18 20:25:19 2021 +0100 @@ -790,7 +790,7 @@ then show "x \ y" using Cons[symmetric] by(auto simp add: set_keys Cons_eq_filter_iff) - (metis sorted.simps(2) sorted_append sorted_keys) + (metis sorted_wrt.simps(2) sorted_append sorted_keys) qed thus ?thesis using Cons by (simp add: Bleast_def) qed diff -r 4b1386b2c23e -r 2e3a60ce5a9f src/HOL/List.thy --- a/src/HOL/List.thy Mon May 17 09:07:30 2021 +0000 +++ b/src/HOL/List.thy Tue May 18 20:25:19 2021 +0100 @@ -370,18 +370,17 @@ context linorder begin -fun sorted :: "'a list \ bool" where -"sorted [] = True" | -"sorted (x # ys) = ((\y \ set ys. x \ y) \ sorted ys)" +abbreviation sorted :: "'a list \ bool" where + "sorted \ sorted_wrt (\)" abbreviation strict_sorted :: "'a list \ bool" where "strict_sorted \ sorted_wrt (<)" -lemma sorted_sorted_wrt: "sorted = sorted_wrt (\)" -proof (rule ext) - fix xs show "sorted xs = sorted_wrt (\) xs" - by(induction xs rule: sorted.induct) auto -qed +lemma sorted_simps: "sorted [] = True" "sorted (x # ys) = ((\y \ set ys. x\y) \ sorted ys)" + by auto + +lemma strict_sorted_simps: "strict_sorted [] = True" "strict_sorted (x # ys) = ((\y \ set ys. x strict_sorted ys)" + by auto primrec insort_key :: "('b \ 'a) \ 'b \ 'b list \ 'b list" where "insort_key f x [] = [x]" | @@ -5506,52 +5505,55 @@ should be removed and \sorted2_simps\ should be added instead. Executable code is one such use case.\ +lemma sorted0: "sorted [] = True" + by simp + lemma sorted1: "sorted [x] = True" -by simp + by simp lemma sorted2: "sorted (x # y # zs) = (x \ y \ sorted (y # zs))" -by(induction zs) auto + by(induction zs) auto lemmas sorted2_simps = sorted1 sorted2 -lemmas [code] = sorted.simps(1) sorted2_simps +lemmas [code] = sorted0 sorted2_simps lemma sorted_append: "sorted (xs@ys) = (sorted xs \ sorted ys \ (\x \ set xs. \y \ set ys. x\y))" -by (simp add: sorted_sorted_wrt sorted_wrt_append) +by (simp add: sorted_wrt_append) lemma sorted_map: "sorted (map f xs) = sorted_wrt (\x y. f x \ f y) xs" -by (simp add: sorted_sorted_wrt sorted_wrt_map) + by (simp add: sorted_wrt_map) lemma sorted01: "length xs \ 1 \ sorted xs" -by (simp add: sorted_sorted_wrt sorted_wrt01) + by (simp add: sorted_wrt01) lemma sorted_tl: "sorted xs \ sorted (tl xs)" -by (cases xs) (simp_all) + by (cases xs) (simp_all) lemma sorted_iff_nth_mono_less: "sorted xs = (\i j. i < j \ j < length xs \ xs ! i \ xs ! j)" -by (simp add: sorted_sorted_wrt sorted_wrt_iff_nth_less) + by (simp add: sorted_wrt_iff_nth_less) lemma sorted_iff_nth_mono: "sorted xs = (\i j. i \ j \ j < length xs \ xs ! i \ xs ! j)" -by (auto simp: sorted_iff_nth_mono_less nat_less_le) + by (auto simp: sorted_iff_nth_mono_less nat_less_le) lemma sorted_nth_mono: "sorted xs \ i \ j \ j < length xs \ xs!i \ xs!j" -by (auto simp: sorted_iff_nth_mono) + by (auto simp: sorted_iff_nth_mono) lemma sorted_iff_nth_Suc: "sorted xs \ (\i. Suc i < length xs \ xs!i \ xs!(Suc i))" -by(simp add: sorted_sorted_wrt sorted_wrt_iff_nth_Suc_transp) + by(simp add: sorted_wrt_iff_nth_Suc_transp) lemma sorted_rev_nth_mono: "sorted (rev xs) \ i \ j \ j < length xs \ xs!j \ xs!i" -using sorted_nth_mono[ of "rev xs" "length xs - j - 1" "length xs - i - 1"] - rev_nth[of "length xs - i - 1" "xs"] rev_nth[of "length xs - j - 1" "xs"] -by auto + using sorted_nth_mono[ of "rev xs" "length xs - j - 1" "length xs - i - 1"] + rev_nth[of "length xs - i - 1" "xs"] rev_nth[of "length xs - j - 1" "xs"] + by auto lemma sorted_rev_iff_nth_mono: "sorted (rev xs) \ (\ i j. i \ j \ j < length xs \ xs!j \ xs!i)" (is "?L = ?R") @@ -5713,10 +5715,10 @@ end lemma sorted_upt[simp]: "sorted [m..Sorting functions\ @@ -7590,7 +7592,7 @@ fix y assume "y \ set xs \ P y" hence "y \ set (filter P xs)" by auto thus "x \ y" - by (metis Cons eq_iff filter_sort set_ConsD set_sort sorted.simps(2) sorted_sort) + by (metis Cons eq_iff filter_sort set_ConsD set_sort sorted_wrt.simps(2) sorted_sort) qed thus ?thesis using Cons by (simp add: Bleast_def) qed