# HG changeset patch # User paulson # Date 1606423780 0 # Node ID 98fe7a10ace3c9002b4f8eea7d0983e9093e18f5 # Parent e0ceaca7344a31dce6a3bdc8590c1b37f1f6bd71# Parent 7553c18808158682ea5639b3aada19dba066d674 merged diff -r 7553c1880815 -r 98fe7a10ace3 CONTRIBUTORS --- a/CONTRIBUTORS Thu Nov 26 18:09:15 2020 +0000 +++ b/CONTRIBUTORS Thu Nov 26 20:49:40 2020 +0000 @@ -5,6 +5,8 @@ Contributions to this Isabelle version -------------------------------------- +* November 2020: Stepan Holub + Removed preconditions from lemma comm_append_are_replicate * November 2020: Florian Haftmann Bundle mixins for locale and class expressions. diff -r 7553c1880815 -r 98fe7a10ace3 src/HOL/Data_Structures/Interval_Tree.thy --- a/src/HOL/Data_Structures/Interval_Tree.thy Thu Nov 26 18:09:15 2020 +0000 +++ b/src/HOL/Data_Structures/Interval_Tree.thy Thu Nov 26 20:49:40 2020 +0000 @@ -265,10 +265,13 @@ fixes has_overlap :: "'t \ 'a::linorder ivl \ bool" assumes set_overlap: "invar s \ has_overlap s x = Interval_Tree.has_overlap (set s) x" +fun invar :: "('a::{linorder,order_bot}) ivl_tree \ bool" where +"invar t = (inv_max_hi t \ sorted(inorder t))" + interpretation S: Interval_Set where empty = Leaf and insert = insert and delete = delete and has_overlap = search and isin = isin and set = set_tree - and invar = "\t. inv_max_hi t \ sorted (inorder t)" + and invar = invar proof (standard, goal_cases) case 1 then show ?case by auto diff -r 7553c1880815 -r 98fe7a10ace3 src/HOL/List.thy --- a/src/HOL/List.thy Thu Nov 26 18:09:15 2020 +0000 +++ b/src/HOL/List.thy Thu Nov 26 20:49:40 2020 +0000 @@ -4542,27 +4542,25 @@ "replicate (length (filter (\y. x = y) xs)) x = filter (\y. x = y) xs" by (induct xs) auto -text \This stronger version is thanks to Stepan Holub\ lemma comm_append_are_replicate: - "xs @ ys = ys @ xs - \ \m n zs. concat (replicate m zs) = xs \ concat (replicate n zs) = ys" + "xs @ ys = ys @ xs \ \m n zs. concat (replicate m zs) = xs \ concat (replicate n zs) = ys" proof (induction "length (xs @ ys) + length xs" arbitrary: xs ys rule: less_induct) case less - consider "length ys < length xs" | "xs = []" | "length xs \ length ys \ xs \ []" + consider (1) "length ys < length xs" | (2) "xs = []" | (3) "length xs \ length ys \ xs \ []" by linarith then show ?case proof (cases) - assume "length ys < length xs" + case 1 then show ?thesis using less.hyps[OF _ less.prems[symmetric]] nat_add_left_cancel_less by auto next - assume "xs = []" + case 2 then have "concat (replicate 0 ys) = xs \ concat (replicate 1 ys) = ys" by simp - then show ?case + then show ?thesis by blast next - assume "length xs \ length ys \ xs \ []" + case 3 then have "length xs \ length ys" and "xs \ []" by blast+ from \length xs \ length ys\ and \xs @ ys = ys @ xs\ @@ -4580,7 +4578,7 @@ then have "concat (replicate (m+n') zs) = ys" using \ys = xs @ ws\ by (simp add: replicate_add) - then show ?case + then show ?thesis using \concat (replicate m zs) = xs\ by blast qed qed @@ -4593,7 +4591,7 @@ proof - obtain m n zs where "concat (replicate m zs) = xs" and "concat (replicate n zs) = ys" - using comm_append_are_replicate[of xs ys] assms by blast + using comm_append_are_replicate[OF assms(3)] by blast then have "m + n > 1" and "concat (replicate (m+n) zs) = xs @ ys" using \xs \ []\ and \ys \ []\ by (auto simp: replicate_add)