src/HOL/Library/Multiset.thy
changeset 65031 52e2c99f3711
parent 65029 00731700e54f
child 65047 f6aea1a500ce
equal deleted inserted replaced
65030:7fd4130cd0a4 65031:52e2c99f3711
   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