equal
deleted
inserted
replaced
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 subset_mset.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 \<open><\<close> 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 \<open>\<le>\<close>, this leads to three calls of \<open>\<le>\<close>. |
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 subset_mset.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: |