# HG changeset patch # User eberlm # Date 1466175733 -7200 # Node ID b5bbf61b792f5e226150b2a460831aa3c485fbdd # Parent bc8793d7bd217972e32648b09c965cc61bfaaa00# Parent caaacf37943f8ad9ce2ce5a78cd5baf148487a8c Merged diff -r bc8793d7bd21 -r b5bbf61b792f NEWS --- a/NEWS Fri Jun 17 11:33:52 2016 +0200 +++ b/NEWS Fri Jun 17 17:02:13 2016 +0200 @@ -253,6 +253,37 @@ INCOMPATIBILITY. +* The names of multiset theorems have been normalised to distinguish which + ordering the theorems are about + mset_less_eqI ~> mset_subset_eqI + mset_less_insertD ~> mset_subset_insertD + mset_less_eq_count ~> mset_subset_eq_count + mset_less_diff_self ~> mset_subset_diff_self + mset_le_exists_conv ~> mset_subset_eq_exists_conv + mset_le_mono_add_right_cancel ~> mset_subset_eq_mono_add_right_cancel + mset_le_mono_add_left_cancel ~> mset_subset_eq_mono_add_left_cancel + mset_le_mono_add ~> mset_subset_eq_mono_add + mset_le_add_left ~> mset_subset_eq_add_left + mset_le_add_right ~> mset_subset_eq_add_right + mset_le_single ~> mset_subset_eq_single + mset_le_multiset_union_diff_commute ~> mset_subset_eq_multiset_union_diff_commute + diff_le_self ~> diff_subset_eq_self + mset_leD ~> mset_subset_eqD + mset_lessD ~> mset_subsetD + mset_le_insertD ~> mset_subset_eq_insertD + mset_less_of_empty ~> mset_subset_of_empty + le_empty ~> subset_eq_empty + mset_less_add_bothsides ~> mset_subset_add_bothsides + mset_less_empty_nonempty ~> mset_subset_empty_nonempty + mset_less_size ~> mset_subset_size + wf_less_mset_rel ~> wf_subset_mset_rel + count_le_replicate_mset_le ~> count_le_replicate_mset_subset_eq + mset_remdups_le ~> mset_remdups_subset_eq + ms_lesseq_impl ~> subset_eq_mset_impl + + Some functions have been renamed: + ms_lesseq_impl -> subset_eq_mset_impl + * Compound constants INFIMUM and SUPREMUM are mere abbreviations now. INCOMPATIBILITY. diff -r bc8793d7bd21 -r b5bbf61b792f src/HOL/Library/DAList_Multiset.thy --- a/src/HOL/Library/DAList_Multiset.thy Fri Jun 17 11:33:52 2016 +0200 +++ b/src/HOL/Library/DAList_Multiset.thy Fri Jun 17 17:02:13 2016 +0200 @@ -244,7 +244,7 @@ next assume ?rhs show ?lhs - proof (rule mset_less_eqI) + proof (rule mset_subset_eqI) fix x from \?rhs\ have "count_of (DAList.impl_of xs) x \ count A x" by (cases "x \ fst ` set (DAList.impl_of xs)") (auto simp add: count_of_empty) diff -r bc8793d7bd21 -r b5bbf61b792f src/HOL/Library/Multiset.thy --- a/src/HOL/Library/Multiset.thy Fri Jun 17 11:33:52 2016 +0200 +++ b/src/HOL/Library/Multiset.thy Fri Jun 17 17:02:13 2016 +0200 @@ -456,15 +456,15 @@ by standard (auto simp add: subset_mset_def subseteq_mset_def multiset_eq_iff intro: order_trans antisym) \ \FIXME: avoid junk stemming from type class interpretation\ -lemma mset_less_eqI: +lemma mset_subset_eqI: "(\a. count A a \ count B a) \ A \# B" by (simp add: subseteq_mset_def) -lemma mset_less_eq_count: +lemma mset_subset_eq_count: "A \# B \ count A a \ count B a" by (simp add: subseteq_mset_def) -lemma mset_le_exists_conv: "(A::'a multiset) \# B \ (\C. B = A + C)" +lemma mset_subset_eq_exists_conv: "(A::'a multiset) \# B \ (\C. B = A + C)" unfolding subseteq_mset_def apply (rule iffI) apply (rule exI [where x = "B - A"]) @@ -472,31 +472,28 @@ done interpretation subset_mset: ordered_cancel_comm_monoid_diff "op +" 0 "op \#" "op <#" "op -" - by standard (simp, fact mset_le_exists_conv) - -declare subset_mset.zero_order[simp del] - \ \this removes some simp rules not in the usual order for multisets\ - -lemma mset_le_mono_add_right_cancel [simp]: "(A::'a multiset) + C \# B + C \ A \# B" + by standard (simp, fact mset_subset_eq_exists_conv) + +lemma mset_subset_eq_mono_add_right_cancel [simp]: "(A::'a multiset) + C \# B + C \ A \# B" by (fact subset_mset.add_le_cancel_right) -lemma mset_le_mono_add_left_cancel [simp]: "C + (A::'a multiset) \# C + B \ A \# B" +lemma mset_subset_eq_mono_add_left_cancel [simp]: "C + (A::'a multiset) \# C + B \ A \# B" by (fact subset_mset.add_le_cancel_left) -lemma mset_le_mono_add: "(A::'a multiset) \# B \ C \# D \ A + C \# B + D" +lemma mset_subset_eq_mono_add: "(A::'a multiset) \# B \ C \# D \ A + C \# B + D" by (fact subset_mset.add_mono) -lemma mset_le_add_left [simp]: "(A::'a multiset) \# A + B" +lemma mset_subset_eq_add_left [simp]: "(A::'a multiset) \# A + B" unfolding subseteq_mset_def by auto -lemma mset_le_add_right [simp]: "B \# (A::'a multiset) + B" +lemma mset_subset_eq_add_right [simp]: "B \# (A::'a multiset) + B" unfolding subseteq_mset_def by auto lemma single_subset_iff [simp]: "{#a#} \# M \ a \# M" by (auto simp add: subseteq_mset_def Suc_le_eq) -lemma mset_le_single: "a \# B \ {#a#} \# B" +lemma mset_subset_eq_single: "a \# B \ {#a#} \# B" by (simp add: subseteq_mset_def Suc_le_eq) lemma multiset_diff_union_assoc: @@ -504,16 +501,16 @@ shows "C \# B \ A + B - C = A + (B - C)" by (fact subset_mset.diff_add_assoc) -lemma mset_le_multiset_union_diff_commute: +lemma mset_subset_eq_multiset_union_diff_commute: fixes A B C D :: "'a multiset" shows "B \# A \ A - B + C = A + C - B" by (fact subset_mset.add_diff_assoc2) -lemma diff_le_self[simp]: +lemma diff_subset_eq_self[simp]: "(M::'a multiset) - N \# M" by (simp add: subseteq_mset_def) -lemma mset_leD: +lemma mset_subset_eqD: assumes "A \# B" and "x \# A" shows "x \# B" proof - @@ -523,33 +520,33 @@ finally show ?thesis by simp qed -lemma mset_lessD: +lemma mset_subsetD: "A \# B \ x \# A \ x \# B" - by (auto intro: mset_leD [of A]) + by (auto intro: mset_subset_eqD [of A]) lemma set_mset_mono: "A \# B \ set_mset A \ set_mset B" - by (metis mset_leD subsetI) - -lemma mset_le_insertD: + by (metis mset_subset_eqD subsetI) + +lemma mset_subset_eq_insertD: "A + {#x#} \# B \ x \# B \ A \# B" apply (rule conjI) - apply (simp add: mset_leD) + apply (simp add: mset_subset_eqD) apply (clarsimp simp: subset_mset_def subseteq_mset_def) apply safe apply (erule_tac x = a in allE) apply (auto split: if_split_asm) done -lemma mset_less_insertD: +lemma mset_subset_insertD: "A + {#x#} \# B \ x \# B \ A \# B" - by (rule mset_le_insertD) simp - -lemma mset_less_of_empty[simp]: "A \# {#} \ False" + by (rule mset_subset_eq_insertD) simp + +lemma mset_subset_of_empty[simp]: "A \# {#} \ False" by (auto simp add: subseteq_mset_def subset_mset_def multiset_eq_iff) lemma empty_le [simp]: "{#} \# A" - unfolding mset_le_exists_conv by auto + unfolding mset_subset_eq_exists_conv by auto lemma insert_subset_eq_iff: "{#a#} + A \# B \ a \# B \ A \# B - {#a#}" @@ -567,8 +564,8 @@ "A - C \# B \ A \# B + C" by (simp add: subseteq_mset_def le_diff_conv) -lemma le_empty [simp]: "M \# {#} \ M = {#}" - unfolding mset_le_exists_conv by auto +lemma subset_eq_empty [simp]: "M \# {#} \ M = {#}" + unfolding mset_subset_eq_exists_conv by auto lemma multi_psub_of_add_self[simp]: "A \# A + {#x#}" by (auto simp: subset_mset_def subseteq_mset_def) @@ -576,13 +573,13 @@ lemma multi_psub_self[simp]: "(A::'a multiset) \# A = False" by simp -lemma mset_less_add_bothsides: "N + {#x#} \# M + {#x#} \ N \# M" +lemma mset_subset_add_bothsides: "N + {#x#} \# M + {#x#} \ N \# M" by (fact subset_mset.add_less_imp_less_right) -lemma mset_less_empty_nonempty: "{#} \# S \ S \ {#}" +lemma mset_subset_empty_nonempty: "{#} \# S \ S \ {#}" by (fact subset_mset.zero_less_iff_neq_zero) -lemma mset_less_diff_self: "c \# B \ B - {#c#} \# B" +lemma mset_subset_diff_self: "c \# B \ B - {#c#} \# B" by (auto simp: subset_mset_def elim: mset_add) @@ -822,13 +819,13 @@ by (rule multiset_eqI) simp lemma multiset_filter_subset[simp]: "filter_mset f M \# M" - by (simp add: mset_less_eqI) + by (simp add: mset_subset_eqI) lemma multiset_filter_mono: assumes "A \# B" shows "filter_mset f A \# filter_mset f B" proof - - from assms[unfolded mset_le_exists_conv] + from assms[unfolded mset_subset_eq_exists_conv] obtain C where B: "B = A + C" by auto show ?thesis unfolding B by auto qed @@ -840,7 +837,7 @@ next assume ?Q then obtain Q where M: "M = N + Q" - by (auto simp add: mset_le_exists_conv) + by (auto simp add: mset_subset_eq_exists_conv) then have MN: "M - N = Q" by simp show ?P proof (rule multiset_eqI) @@ -943,7 +940,7 @@ assumes "A \# B" shows "size A \ size B" proof - - from assms[unfolded mset_le_exists_conv] + from assms[unfolded mset_subset_eq_exists_conv] obtain C where B: "B = A + C" by auto show ?thesis unfolding B by (induct C) auto qed @@ -953,7 +950,7 @@ lemma size_Diff_submset: "M \# M' \ size (M' - M) = size M' - size(M::'a multiset)" -by (metis add_diff_cancel_left' size_union mset_le_exists_conv) +by (metis add_diff_cancel_left' size_union mset_subset_eq_exists_conv) subsection \Induction and case splits\ @@ -988,10 +985,10 @@ apply auto done -lemma mset_less_size: "(A::'a multiset) \# B \ size A < size B" +lemma mset_subset_size: "(A::'a multiset) \# B \ size A < size B" proof (induct A arbitrary: B) case (empty M) - then have "M \ {#}" by (simp add: mset_less_empty_nonempty) + then have "M \ {#}" by (simp add: mset_subset_empty_nonempty) then obtain M' x where "M = M' + {#x#}" by (blast dest: multi_nonempty_split) then show ?case by simp @@ -1000,11 +997,11 @@ have IH: "\B. S \# B \ size S < size B" by fact have SxsubT: "S + {#x#} \# T" by fact then have "x \# T" and "S \# T" - by (auto dest: mset_less_insertD) + by (auto dest: mset_subset_insertD) then obtain T' where T: "T = T' + {#x#}" by (blast dest: multi_member_split) then have "S \# T'" using SxsubT - by (blast intro: mset_less_add_bothsides) + by (blast intro: mset_subset_add_bothsides) then have "size S < size T'" using IH by simp then show ?case using T by simp qed @@ -1017,15 +1014,15 @@ text \Well-foundedness of strict subset relation\ -lemma wf_less_mset_rel: "wf {(M, N :: 'a multiset). M \# N}" +lemma wf_subset_mset_rel: "wf {(M, N :: 'a multiset). M \# N}" apply (rule wf_measure [THEN wf_subset, where f1=size]) -apply (clarsimp simp: measure_def inv_image_def mset_less_size) +apply (clarsimp simp: measure_def inv_image_def mset_subset_size) done lemma full_multiset_induct [case_names less]: assumes ih: "\B. \(A::'a multiset). A \# B \ P A \ P B" shows "P B" -apply (rule wf_less_mset_rel [THEN wf_induct]) +apply (rule wf_subset_mset_rel [THEN wf_induct]) apply (rule ih, auto) done @@ -1044,8 +1041,8 @@ assume P: "F \# A \ P F" and i: "F + {#x#} \# A" show "P (F + {#x#})" proof (rule insert) - from i show "x \# A" by (auto dest: mset_le_insertD) - from i have "F \# A" by (auto dest: mset_le_insertD) + from i show "x \# A" by (auto dest: mset_subset_eq_insertD) + from i have "F \# A" by (auto dest: mset_subset_eq_insertD) with P show "P F" . qed qed @@ -1540,8 +1537,8 @@ lemma size_replicate_mset[simp]: "size (replicate_mset n M) = n" by (induct n, simp_all) -lemma count_le_replicate_mset_le: "n \ count M x \ replicate_mset n x \# M" - by (auto simp add: mset_less_eqI) (metis count_replicate_mset subseteq_mset_def) +lemma count_le_replicate_mset_subset_eq: "n \ count M x \ replicate_mset n x \# M" + by (auto simp add: mset_subset_eqI) (metis count_replicate_mset subseteq_mset_def) lemma filter_eq_replicate_mset: "{#y \# D. y = x#} = replicate_mset (count D x) x" by (induct D) simp_all @@ -1914,7 +1911,7 @@ hide_const (open) part -lemma mset_remdups_le: "mset (remdups xs) \# mset xs" +lemma mset_remdups_subset_eq: "mset (remdups xs) \# mset xs" by (induct xs) (auto intro: subset_mset.order_trans) lemma mset_update: @@ -1934,8 +1931,8 @@ apply (subst add.commute [of "{#v#}" "{#x#}"]) apply (subst add.assoc [symmetric]) apply simp - apply (rule mset_le_multiset_union_diff_commute) - apply (simp add: mset_le_single nth_mem_mset) + apply (rule mset_subset_eq_multiset_union_diff_commute) + apply (simp add: mset_subset_eq_single nth_mem_mset) done qed qed @@ -2524,7 +2521,7 @@ lemma multi_union_self_other_eq: "(A::'a multiset) + X = A + Y \ X = Y" by (fact add_left_imp_eq) -lemma mset_less_trans: "(M::'a multiset) \# K \ K \# N \ M \# N" +lemma mset_subset_trans: "(M::'a multiset) \# K \ K \# N \ M \# N" by (fact subset_mset.less_trans) lemma multiset_inter_commute: "A #\ B = B #\ A" @@ -2650,18 +2647,18 @@ declare size_mset [code] -fun ms_lesseq_impl :: "'a list \ 'a list \ bool option" where - "ms_lesseq_impl [] ys = Some (ys \ [])" -| "ms_lesseq_impl (Cons x xs) ys = (case List.extract (op = x) ys of +fun subset_eq_mset_impl :: "'a list \ 'a list \ bool option" where + "subset_eq_mset_impl [] ys = Some (ys \ [])" +| "subset_eq_mset_impl (Cons x xs) ys = (case List.extract (op = x) ys of None \ None - | Some (ys1,_,ys2) \ ms_lesseq_impl xs (ys1 @ ys2))" - -lemma ms_lesseq_impl: "(ms_lesseq_impl xs ys = None \ \ mset xs \# mset ys) \ - (ms_lesseq_impl xs ys = Some True \ mset xs \# mset ys) \ - (ms_lesseq_impl xs ys = Some False \ mset xs = mset ys)" + | Some (ys1,_,ys2) \ subset_eq_mset_impl xs (ys1 @ ys2))" + +lemma subset_eq_mset_impl: "(subset_eq_mset_impl xs ys = None \ \ mset xs \# mset ys) \ + (subset_eq_mset_impl xs ys = Some True \ mset xs \# mset ys) \ + (subset_eq_mset_impl xs ys = Some False \ mset xs = mset ys)" proof (induct xs arbitrary: ys) case (Nil ys) - show ?case by (auto simp: mset_less_empty_nonempty) + show ?case by (auto simp: mset_subset_empty_nonempty) next case (Cons x xs ys) show ?case @@ -2686,7 +2683,7 @@ from extract_SomeE[OF Some] have "ys = ys1 @ x # ys2" by simp hence id: "mset ys = mset (ys1 @ ys2) + {#x#}" by (auto simp: ac_simps) - show ?thesis unfolding ms_lesseq_impl.simps + show ?thesis unfolding subset_eq_mset_impl.simps unfolding Some option.simps split unfolding id using Cons[of "ys1 @ ys2"] @@ -2694,20 +2691,20 @@ qed qed -lemma [code]: "mset xs \# mset ys \ ms_lesseq_impl xs ys \ None" - using ms_lesseq_impl[of xs ys] by (cases "ms_lesseq_impl xs ys", auto) - -lemma [code]: "mset xs \# mset ys \ ms_lesseq_impl xs ys = Some True" - using ms_lesseq_impl[of xs ys] by (cases "ms_lesseq_impl xs ys", auto) +lemma [code]: "mset xs \# mset ys \ subset_eq_mset_impl xs ys \ None" + using subset_eq_mset_impl[of xs ys] by (cases "subset_eq_mset_impl xs ys", auto) + +lemma [code]: "mset xs \# mset ys \ subset_eq_mset_impl xs ys = Some True" + using subset_eq_mset_impl[of xs ys] by (cases "subset_eq_mset_impl xs ys", auto) instantiation multiset :: (equal) equal begin definition [code del]: "HOL.equal A (B :: 'a multiset) \ A = B" -lemma [code]: "HOL.equal (mset xs) (mset ys) \ ms_lesseq_impl xs ys = Some False" +lemma [code]: "HOL.equal (mset xs) (mset ys) \ subset_eq_mset_impl xs ys = Some False" unfolding equal_multiset_def - using ms_lesseq_impl[of xs ys] by (cases "ms_lesseq_impl xs ys", auto) + using subset_eq_mset_impl[of xs ys] by (cases "subset_eq_mset_impl xs ys", auto) instance by standard (simp add: equal_multiset_def) diff -r bc8793d7bd21 -r b5bbf61b792f src/HOL/Library/Multiset_Order.thy --- a/src/HOL/Library/Multiset_Order.thy Fri Jun 17 11:33:52 2016 +0200 +++ b/src/HOL/Library/Multiset_Order.thy Fri Jun 17 17:02:13 2016 +0200 @@ -277,14 +277,14 @@ lemma less_multiset_empty_right[simp]: fixes M :: "('a :: linorder) multiset" shows "\ M #\# {#}" - using le_empty less_multiset\<^sub>D\<^sub>M by blast + using subset_eq_empty less_multiset\<^sub>D\<^sub>M by blast lemma fixes M N :: "('a :: linorder) multiset" shows le_multiset_plus_left[simp]: "N #\# (M + N)" and le_multiset_plus_right[simp]: "M #\# (M + N)" - using [[metis_verbose = false]] by (metis less_eq_imp_le_multiset mset_le_add_left add.commute)+ + using [[metis_verbose = false]] by (metis less_eq_imp_le_multiset mset_subset_eq_add_left add.commute)+ lemma fixes M N :: "('a :: linorder) multiset" diff -r bc8793d7bd21 -r b5bbf61b792f src/HOL/Library/Permutation.thy --- a/src/HOL/Library/Permutation.thy Fri Jun 17 11:33:52 2016 +0200 +++ b/src/HOL/Library/Permutation.thy Fri Jun 17 17:02:13 2016 +0200 @@ -135,7 +135,7 @@ done proposition mset_le_perm_append: "mset xs \# mset ys \ (\zs. xs @ zs <~~> ys)" - apply (auto simp: mset_eq_perm[THEN sym] mset_le_exists_conv) + apply (auto simp: mset_eq_perm[THEN sym] mset_subset_eq_exists_conv) apply (insert surj_mset) apply (drule surjD) apply (blast intro: sym)+