938 by (induction n) simp_all |
938 by (induction n) simp_all |
939 |
939 |
940 |
940 |
941 subsubsection \<open>Simprocs\<close> |
941 subsubsection \<open>Simprocs\<close> |
942 |
942 |
943 lemma mset_diff_add_eq1: |
943 lemma repeat_mset_iterate_add: \<open>repeat_mset n M = iterate_add n M\<close> |
944 "j \<le> (i::nat) \<Longrightarrow> ((repeat_mset i u + m) - (repeat_mset j u + n)) = ((repeat_mset (i-j) u + m) - n)" |
944 unfolding iterate_add_def by (induction n) auto |
945 by (auto simp: multiset_eq_iff nat_diff_add_eq1) |
|
946 |
|
947 lemma mset_diff_add_eq2: |
|
948 "i \<le> (j::nat) \<Longrightarrow> ((repeat_mset i u + m) - (repeat_mset j u + n)) = (m - (repeat_mset (j-i) u + n))" |
|
949 by (auto simp: multiset_eq_iff nat_diff_add_eq2) |
|
950 |
|
951 lemma mset_eq_add_iff1: |
|
952 "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m = repeat_mset j u + n) = (repeat_mset (i-j) u + m = n)" |
|
953 by (auto simp: multiset_eq_iff nat_eq_add_iff1) |
|
954 |
|
955 lemma mset_eq_add_iff2: |
|
956 "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m = repeat_mset j u + n) = (m = repeat_mset (j-i) u + n)" |
|
957 by (auto simp: multiset_eq_iff nat_eq_add_iff2) |
|
958 |
945 |
959 lemma mset_subseteq_add_iff1: |
946 lemma mset_subseteq_add_iff1: |
960 "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m \<subseteq># repeat_mset j u + n) = (repeat_mset (i-j) u + m \<subseteq># n)" |
947 "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m \<subseteq># repeat_mset j u + n) = (repeat_mset (i-j) u + m \<subseteq># n)" |
961 by (auto simp add: subseteq_mset_def nat_le_add_iff1) |
948 by (auto simp add: subseteq_mset_def nat_le_add_iff1) |
962 |
949 |
964 "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m \<subseteq># repeat_mset j u + n) = (m \<subseteq># repeat_mset (j-i) u + n)" |
951 "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m \<subseteq># repeat_mset j u + n) = (m \<subseteq># repeat_mset (j-i) u + n)" |
965 by (auto simp add: subseteq_mset_def nat_le_add_iff2) |
952 by (auto simp add: subseteq_mset_def nat_le_add_iff2) |
966 |
953 |
967 lemma mset_subset_add_iff1: |
954 lemma mset_subset_add_iff1: |
968 "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m \<subset># repeat_mset j u + n) = (repeat_mset (i-j) u + m \<subset># n)" |
955 "j \<le> (i::nat) \<Longrightarrow> (repeat_mset i u + m \<subset># repeat_mset j u + n) = (repeat_mset (i-j) u + m \<subset># n)" |
969 unfolding subset_mset_def by (simp add: mset_eq_add_iff1 mset_subseteq_add_iff1) |
956 unfolding subset_mset_def repeat_mset_iterate_add |
|
957 by (simp add: iterate_add_eq_add_iff1 mset_subseteq_add_iff1[unfolded repeat_mset_iterate_add]) |
970 |
958 |
971 lemma mset_subset_add_iff2: |
959 lemma mset_subset_add_iff2: |
972 "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m \<subset># repeat_mset j u + n) = (m \<subset># repeat_mset (j-i) u + n)" |
960 "i \<le> (j::nat) \<Longrightarrow> (repeat_mset i u + m \<subset># repeat_mset j u + n) = (m \<subset># repeat_mset (j-i) u + n)" |
973 unfolding subset_mset_def by (simp add: mset_eq_add_iff2 mset_subseteq_add_iff2) |
961 unfolding subset_mset_def repeat_mset_iterate_add |
974 |
962 by (simp add: iterate_add_eq_add_iff2 mset_subseteq_add_iff2[unfolded repeat_mset_iterate_add]) |
975 lemma repeat_mset_iterate_add: \<open>repeat_mset n M = iterate_add n M\<close> |
|
976 unfolding iterate_add_def by (induction n) auto |
|
977 |
963 |
978 ML_file "multiset_simprocs.ML" |
964 ML_file "multiset_simprocs.ML" |
979 |
965 |
980 lemma add_mset_replicate_mset_safe[cancelation_simproc_pre]: \<open>NO_MATCH {#} M \<Longrightarrow> add_mset a M = {#a#} + M\<close> |
966 lemma add_mset_replicate_mset_safe[cancelation_simproc_pre]: \<open>NO_MATCH {#} M \<Longrightarrow> add_mset a M = {#a#} + M\<close> |
981 by simp |
967 by simp |