970 |
970 |
971 lemma mset_subset_add_iff2: |
971 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)" |
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)" |
973 unfolding subset_mset_def by (simp add: mset_eq_add_iff2 mset_subseteq_add_iff2) |
973 unfolding subset_mset_def by (simp add: mset_eq_add_iff2 mset_subseteq_add_iff2) |
974 |
974 |
975 ML_file "multiset_simprocs_util.ML" |
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 |
976 ML_file "multiset_simprocs.ML" |
978 ML_file "multiset_simprocs.ML" |
|
979 |
|
980 lemma add_mset_replicate_mset_safe[cancelation_simproc_pre]: \<open>NO_MATCH {#} M \<Longrightarrow> add_mset a M = {#a#} + M\<close> |
|
981 by simp |
|
982 |
|
983 declare repeat_mset_iterate_add[cancelation_simproc_pre] |
|
984 |
|
985 declare iterate_add_distrib[cancelation_simproc_pre] |
|
986 declare repeat_mset_iterate_add[symmetric, cancelation_simproc_post] |
|
987 |
|
988 declare add_mset_not_empty[cancelation_simproc_eq_elim] |
|
989 empty_not_add_mset[cancelation_simproc_eq_elim] |
|
990 subset_mset.le_zero_eq[cancelation_simproc_eq_elim] |
|
991 empty_not_add_mset[cancelation_simproc_eq_elim] |
|
992 add_mset_not_empty[cancelation_simproc_eq_elim] |
|
993 subset_mset.le_zero_eq[cancelation_simproc_eq_elim] |
|
994 le_zero_eq[cancelation_simproc_eq_elim] |
977 |
995 |
978 simproc_setup mseteq_cancel |
996 simproc_setup mseteq_cancel |
979 ("(l::'a multiset) + m = n" | "(l::'a multiset) = m + n" | |
997 ("(l::'a multiset) + m = n" | "(l::'a multiset) = m + n" | |
980 "add_mset a m = n" | "m = add_mset a n" | |
998 "add_mset a m = n" | "m = add_mset a n" | |
981 "replicate_mset p a = n" | "m = replicate_mset p a" | |
999 "replicate_mset p a = n" | "m = replicate_mset p a" | |
982 "repeat_mset p m = n" | "m = repeat_mset p m") = |
1000 "repeat_mset p m = n" | "m = repeat_mset p m") = |
983 \<open>fn phi => Multiset_Simprocs.eq_cancel_msets\<close> |
1001 \<open>fn phi => Cancel_Simprocs.eq_cancel\<close> |
984 |
1002 |
985 simproc_setup msetsubset_cancel |
1003 simproc_setup msetsubset_cancel |
986 ("(l::'a multiset) + m \<subset># n" | "(l::'a multiset) \<subset># m + n" | |
1004 ("(l::'a multiset) + m \<subset># n" | "(l::'a multiset) \<subset># m + n" | |
987 "add_mset a m \<subset># n" | "m \<subset># add_mset a n" | |
1005 "add_mset a m \<subset># n" | "m \<subset># add_mset a n" | |
988 "replicate_mset p r \<subset># n" | "m \<subset># replicate_mset p r" | |
1006 "replicate_mset p r \<subset># n" | "m \<subset># replicate_mset p r" | |
999 simproc_setup msetdiff_cancel |
1017 simproc_setup msetdiff_cancel |
1000 ("((l::'a multiset) + m) - n" | "(l::'a multiset) - (m + n)" | |
1018 ("((l::'a multiset) + m) - n" | "(l::'a multiset) - (m + n)" | |
1001 "add_mset a m - n" | "m - add_mset a n" | |
1019 "add_mset a m - n" | "m - add_mset a n" | |
1002 "replicate_mset p r - n" | "m - replicate_mset p r" | |
1020 "replicate_mset p r - n" | "m - replicate_mset p r" | |
1003 "repeat_mset p m - n" | "m - repeat_mset p m") = |
1021 "repeat_mset p m - n" | "m - repeat_mset p m") = |
1004 \<open>fn phi => Multiset_Simprocs.diff_cancel_msets\<close> |
1022 \<open>fn phi => Cancel_Simprocs.diff_cancel\<close> |
1005 |
1023 |
1006 |
1024 |
1007 subsubsection \<open>Conditionally complete lattice\<close> |
1025 subsubsection \<open>Conditionally complete lattice\<close> |
1008 |
1026 |
1009 instantiation multiset :: (type) Inf |
1027 instantiation multiset :: (type) Inf |