src/HOL/Library/Multiset.thy
changeset 64017 6e7bf7678518
parent 63924 f91766530e13
child 64075 3d4c3eec5143
equal deleted inserted replaced
64016:5c2c559f01eb 64017:6e7bf7678518
   542    apply (auto intro: multiset_eq_iff [THEN iffD2])
   542    apply (auto intro: multiset_eq_iff [THEN iffD2])
   543   done
   543   done
   544 
   544 
   545 interpretation subset_mset: ordered_cancel_comm_monoid_diff "op +" 0 "op \<le>#" "op <#" "op -"
   545 interpretation subset_mset: ordered_cancel_comm_monoid_diff "op +" 0 "op \<le>#" "op <#" "op -"
   546   by standard (simp, fact mset_subset_eq_exists_conv)
   546   by standard (simp, fact mset_subset_eq_exists_conv)
       
   547 
       
   548 declare subset_mset.add_diff_assoc[simp] subset_mset.add_diff_assoc2[simp]
   547 
   549 
   548 lemma mset_subset_eq_mono_add_right_cancel: "(A::'a multiset) + C \<subseteq># B + C \<longleftrightarrow> A \<subseteq># B"
   550 lemma mset_subset_eq_mono_add_right_cancel: "(A::'a multiset) + C \<subseteq># B + C \<longleftrightarrow> A \<subseteq># B"
   549    by (fact subset_mset.add_le_cancel_right)
   551    by (fact subset_mset.add_le_cancel_right)
   550 
   552 
   551 lemma mset_subset_eq_mono_add_left_cancel: "C + (A::'a multiset) \<subseteq># C + B \<longleftrightarrow> A \<subseteq># B"
   553 lemma mset_subset_eq_mono_add_left_cancel: "C + (A::'a multiset) \<subseteq># C + B \<longleftrightarrow> A \<subseteq># B"
  2647     case True
  2649     case True
  2648     moreover have "\<exists>j\<in>#J. (k, j) \<in> r" if "k \<in># K'" for k
  2650     moreover have "\<exists>j\<in>#J. (k, j) \<in> r" if "k \<in># K'" for k
  2649       using K N trans True by (meson that transE)
  2651       using K N trans True by (meson that transE)
  2650     ultimately show ?thesis
  2652     ultimately show ?thesis
  2651       by (rule_tac x = I in exI, rule_tac x = J in exI, rule_tac x = "(K - {#a#}) + K'" in exI)
  2653       by (rule_tac x = I in exI, rule_tac x = J in exI, rule_tac x = "(K - {#a#}) + K'" in exI)
  2652         (use z y N in \<open>auto simp: subset_mset.add_diff_assoc dest: in_diffD\<close>)
  2654         (use z y N in \<open>auto simp del: subset_mset.add_diff_assoc2 dest: in_diffD\<close>)
  2653   next
  2655   next
  2654     case False
  2656     case False
  2655     then have "a \<in># I" by (metis N(2) union_iff union_single_eq_member z)
  2657     then have "a \<in># I" by (metis N(2) union_iff union_single_eq_member z)
  2656     moreover have "M0 = I + K - {#a#}"
  2658     moreover have "M0 = I + K - {#a#}"
  2657       using N(2) z by force
  2659       using N(2) z by force
  2658     ultimately show ?thesis
  2660     ultimately show ?thesis
  2659       by (rule_tac x = "I - {#a#}" in exI, rule_tac x = "add_mset a J" in exI,
  2661       by (rule_tac x = "I - {#a#}" in exI, rule_tac x = "add_mset a J" in exI,
  2660           rule_tac x = "K + K'" in exI)
  2662           rule_tac x = "K + K'" in exI)
  2661         (use z y N False K in \<open>auto simp: subset_mset.diff_add_assoc2\<close>)
  2663         (use z y N False K in \<open>auto simp: add.assoc\<close>)
  2662   qed
  2664   qed
  2663 qed
  2665 qed
  2664 
  2666 
  2665 lemma one_step_implies_mult:
  2667 lemma one_step_implies_mult:
  2666   assumes
  2668   assumes