221 by (auto simp: less_eq_multiset_def less_multiset\<^sub>H\<^sub>O) |
221 by (auto simp: less_eq_multiset_def less_multiset\<^sub>H\<^sub>O) |
222 |
222 |
223 lemma wf_less_multiset: "wf {(M :: ('a :: wellorder) multiset, N). M < N}" |
223 lemma wf_less_multiset: "wf {(M :: ('a :: wellorder) multiset, N). M < N}" |
224 unfolding less_multiset_def by (auto intro: wf_mult wf) |
224 unfolding less_multiset_def by (auto intro: wf_mult wf) |
225 |
225 |
226 lemma order_multiset: "class.order |
226 instantiation multiset :: (linorder) linorder |
227 (op \<le> :: ('a :: order) multiset \<Rightarrow> ('a :: order) multiset \<Rightarrow> bool) |
227 begin |
228 (op < :: ('a :: order) multiset \<Rightarrow> ('a :: order) multiset \<Rightarrow> bool)" |
228 instance by standard (metis less_eq_multiset\<^sub>H\<^sub>O not_less_iff_gr_or_eq) |
229 by unfold_locales |
229 end |
230 |
230 |
231 lemma linorder_multiset: "class.linorder |
231 instantiation multiset :: (wellorder) wellorder |
232 (op \<le> :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool) |
232 begin |
233 (op < :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool)" |
233 instance by standard (metis less_multiset_def wf wf_def wf_mult) |
234 by unfold_locales (fastforce simp add: less_multiset\<^sub>H\<^sub>O less_eq_multiset_def not_less_iff_gr_or_eq) |
234 end |
235 |
|
236 interpretation multiset_linorder: linorder |
|
237 "op \<le> :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool" |
|
238 "op < :: ('a :: linorder) multiset \<Rightarrow> ('a :: linorder) multiset \<Rightarrow> bool" |
|
239 by (rule linorder_multiset) |
|
240 |
|
241 interpretation multiset_wellorder: wellorder |
|
242 "op \<le> :: ('a :: wellorder) multiset \<Rightarrow> ('a :: wellorder) multiset \<Rightarrow> bool" |
|
243 "op < :: ('a :: wellorder) multiset \<Rightarrow> ('a :: wellorder) multiset \<Rightarrow> bool" |
|
244 by unfold_locales (blast intro: wf_less_multiset [unfolded wf_def, simplified, rule_format]) |
|
245 |
235 |
246 lemma less_eq_multiset_total: |
236 lemma less_eq_multiset_total: |
247 fixes M N :: "('a :: linorder) multiset" |
237 fixes M N :: "('a :: linorder) multiset" |
248 shows "\<not> M \<le> N \<Longrightarrow> N \<le> M" |
238 shows "\<not> M \<le> N \<Longrightarrow> N \<le> M" |
249 by (metis multiset_linorder.le_cases) |
239 by simp |
250 |
240 |
251 lemma subset_eq_imp_le_multiset: |
241 lemma subset_eq_imp_le_multiset: |
252 fixes M N :: "('a :: linorder) multiset" |
242 fixes M N :: "('a :: linorder) multiset" |
253 shows "M \<le># N \<Longrightarrow> M \<le> N" |
243 shows "M \<le># N \<Longrightarrow> M \<le> N" |
254 unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O |
244 unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O |
255 by (simp add: less_le_not_le subseteq_mset_def) |
245 by (simp add: less_le_not_le subseteq_mset_def) |
256 |
246 |
257 lemma le_multiset_right_total: |
247 lemma le_multiset_right_total: |
258 fixes M :: "('a :: linorder) multiset" |
248 fixes M :: "('a :: linorder) multiset" |
259 shows "M < M + {#undefined#}" |
249 shows "M < M + {#x#}" |
260 unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O by simp |
250 unfolding less_eq_multiset_def less_multiset\<^sub>H\<^sub>O by simp |
261 |
251 |
262 lemma less_eq_multiset_empty_left[simp]: |
252 lemma less_eq_multiset_empty_left[simp]: |
263 fixes M :: "('a :: linorder) multiset" |
253 fixes M :: "('a :: linorder) multiset" |
264 shows "{#} \<le> M" |
254 shows "{#} \<le> M" |
292 le_multiset_plus_plus_left_iff[simp]: "M + N < M' + N \<longleftrightarrow> M < M'" and |
282 le_multiset_plus_plus_left_iff[simp]: "M + N < M' + N \<longleftrightarrow> M < M'" and |
293 le_multiset_plus_plus_right_iff[simp]: "M + N < M + N' \<longleftrightarrow> N < N'" |
283 le_multiset_plus_plus_right_iff[simp]: "M + N < M + N' \<longleftrightarrow> N < N'" |
294 unfolding less_multiset\<^sub>H\<^sub>O by auto |
284 unfolding less_multiset\<^sub>H\<^sub>O by auto |
295 |
285 |
296 lemma add_eq_self_empty_iff: "M + N = M \<longleftrightarrow> N = {#}" |
286 lemma add_eq_self_empty_iff: "M + N = M \<longleftrightarrow> N = {#}" |
297 by (metis add.commute add_diff_cancel_right' monoid_add_class.add.left_neutral) |
287 by (rule cancel_comm_monoid_add_class.add_cancel_left_right) |
298 |
288 |
299 lemma |
289 lemma |
300 fixes M N :: "('a :: linorder) multiset" |
290 fixes M N :: "('a :: linorder) multiset" |
301 shows |
291 shows |
302 le_multiset_plus_left_nonempty[simp]: "M \<noteq> {#} \<Longrightarrow> N < M + N" and |
292 le_multiset_plus_left_nonempty[simp]: "M \<noteq> {#} \<Longrightarrow> N < M + N" and |