16 |
16 |
17 lemma [code, code del]: "plus = (plus :: 'a multiset \<Rightarrow> _)" .. |
17 lemma [code, code del]: "plus = (plus :: 'a multiset \<Rightarrow> _)" .. |
18 |
18 |
19 lemma [code, code del]: "minus = (minus :: 'a multiset \<Rightarrow> _)" .. |
19 lemma [code, code del]: "minus = (minus :: 'a multiset \<Rightarrow> _)" .. |
20 |
20 |
21 lemma [code, code del]: "inf = (inf :: 'a multiset \<Rightarrow> _)" .. |
21 lemma [code, code del]: "inf_subset_mset = (inf_subset_mset :: 'a multiset \<Rightarrow> _)" .. |
22 |
22 |
23 lemma [code, code del]: "sup = (sup :: 'a multiset \<Rightarrow> _)" .. |
23 lemma [code, code del]: "sup_subset_mset = (sup_subset_mset :: 'a multiset \<Rightarrow> _)" .. |
24 |
24 |
25 lemma [code, code del]: "image_mset = image_mset" .. |
25 lemma [code, code del]: "image_mset = image_mset" .. |
26 |
26 |
27 lemma [code, code del]: "filter_mset = filter_mset" .. |
27 lemma [code, code del]: "filter_mset = filter_mset" .. |
28 |
28 |
36 |
36 |
37 lemma [code, code del]: "set_of = set_of" .. |
37 lemma [code, code del]: "set_of = set_of" .. |
38 |
38 |
39 lemma [code, code del]: "sorted_list_of_multiset = sorted_list_of_multiset" .. |
39 lemma [code, code del]: "sorted_list_of_multiset = sorted_list_of_multiset" .. |
40 |
40 |
41 lemma [code, code del]: "ord_multiset_inst.less_eq_multiset = ord_multiset_inst.less_eq_multiset" .. |
41 lemma [code, code del]: "subset_mset = subset_mset" .. |
42 |
42 |
43 lemma [code, code del]: "ord_multiset_inst.less_multiset = ord_multiset_inst.less_multiset" .. |
43 lemma [code, code del]: "subseteq_mset = subseteq_mset" .. |
44 |
44 |
45 lemma [code, code del]: "equal_multiset_inst.equal_multiset = equal_multiset_inst.equal_multiset" .. |
45 lemma [code, code del]: "equal_multiset_inst.equal_multiset = equal_multiset_inst.equal_multiset" .. |
46 |
46 |
47 |
47 |
48 text \<open>Raw operations on lists\<close> |
48 text \<open>Raw operations on lists\<close> |
201 |
201 |
202 lemma filter_Bag [code]: "filter_mset P (Bag xs) = Bag (DAList.filter (P \<circ> fst) xs)" |
202 lemma filter_Bag [code]: "filter_mset P (Bag xs) = Bag (DAList.filter (P \<circ> fst) xs)" |
203 by (rule multiset_eqI) (simp add: count_of_filter DAList.filter.rep_eq) |
203 by (rule multiset_eqI) (simp add: count_of_filter DAList.filter.rep_eq) |
204 |
204 |
205 |
205 |
206 lemma mset_eq [code]: "HOL.equal (m1::'a::equal multiset) m2 \<longleftrightarrow> m1 \<le> m2 \<and> m2 \<le> m1" |
206 lemma mset_eq [code]: "HOL.equal (m1::'a::equal multiset) m2 \<longleftrightarrow> m1 \<le># m2 \<and> m2 \<le># m1" |
207 by (metis equal_multiset_def eq_iff) |
207 by (metis equal_multiset_def subset_mset.eq_iff) |
208 |
208 |
209 text \<open>By default the code for @{text "<"} is @{prop"xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> xs = ys"}. |
209 text \<open>By default the code for @{text "<"} is @{prop"xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> xs = ys"}. |
210 With equality implemented by @{text"\<le>"}, this leads to three calls of @{text"\<le>"}. |
210 With equality implemented by @{text"\<le>"}, this leads to three calls of @{text"\<le>"}. |
211 Here is a more efficient version:\<close> |
211 Here is a more efficient version:\<close> |
212 lemma mset_less[code]: "xs < (ys :: 'a multiset) \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs" |
212 lemma mset_less[code]: "xs <# (ys :: 'a multiset) \<longleftrightarrow> xs \<le># ys \<and> \<not> ys \<le># xs" |
213 by (rule less_le_not_le) |
213 by (rule subset_mset.less_le_not_le) |
214 |
214 |
215 lemma mset_less_eq_Bag0: |
215 lemma mset_less_eq_Bag0: |
216 "Bag xs \<le> A \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). count_of (DAList.impl_of xs) x \<le> count A x)" |
216 "Bag xs \<le># A \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). count_of (DAList.impl_of xs) x \<le> count A x)" |
217 (is "?lhs \<longleftrightarrow> ?rhs") |
217 (is "?lhs \<longleftrightarrow> ?rhs") |
218 proof |
218 proof |
219 assume ?lhs |
219 assume ?lhs |
220 then show ?rhs by (auto simp add: mset_le_def) |
220 then show ?rhs by (auto simp add: subseteq_mset_def) |
221 next |
221 next |
222 assume ?rhs |
222 assume ?rhs |
223 show ?lhs |
223 show ?lhs |
224 proof (rule mset_less_eqI) |
224 proof (rule mset_less_eqI) |
225 fix x |
225 fix x |
226 from \<open>?rhs\<close> have "count_of (DAList.impl_of xs) x \<le> count A x" |
226 from \<open>?rhs\<close> have "count_of (DAList.impl_of xs) x \<le> count A x" |
227 by (cases "x \<in> fst ` set (DAList.impl_of xs)") (auto simp add: count_of_empty) |
227 by (cases "x \<in> fst ` set (DAList.impl_of xs)") (auto simp add: count_of_empty) |
228 then show "count (Bag xs) x \<le> count A x" by (simp add: mset_le_def) |
228 then show "count (Bag xs) x \<le> count A x" by (simp add: subset_mset_def) |
229 qed |
229 qed |
230 qed |
230 qed |
231 |
231 |
232 lemma mset_less_eq_Bag [code]: |
232 lemma mset_less_eq_Bag [code]: |
233 "Bag xs \<le> (A :: 'a multiset) \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). n \<le> count A x)" |
233 "Bag xs \<le># (A :: 'a multiset) \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). n \<le> count A x)" |
234 proof - |
234 proof - |
235 { |
235 { |
236 fix x n |
236 fix x n |
237 assume "(x,n) \<in> set (DAList.impl_of xs)" |
237 assume "(x,n) \<in> set (DAList.impl_of xs)" |
238 then have "count_of (DAList.impl_of xs) x = n" |
238 then have "count_of (DAList.impl_of xs) x = n" |
264 then show ?thesis |
264 then show ?thesis |
265 unfolding mset_less_eq_Bag0 by auto |
265 unfolding mset_less_eq_Bag0 by auto |
266 qed |
266 qed |
267 |
267 |
268 declare multiset_inter_def [code] |
268 declare multiset_inter_def [code] |
269 declare sup_multiset_def [code] |
269 declare sup_subset_mset_def [code] |
270 declare multiset_of.simps [code] |
270 declare multiset_of.simps [code] |
271 |
271 |
272 |
272 |
273 fun fold_impl :: "('a \<Rightarrow> nat \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'b \<Rightarrow> ('a \<times> nat) list \<Rightarrow> 'b" |
273 fun fold_impl :: "('a \<Rightarrow> nat \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'b \<Rightarrow> ('a \<times> nat) list \<Rightarrow> 'b" |
274 where |
274 where |