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 |