src/HOL/Library/Multiset.thy
changeset 65029 00731700e54f
parent 65027 2b8583507891
child 65031 52e2c99f3711
equal deleted inserted replaced
65028:87e003397834 65029:00731700e54f
     7 *)
     7 *)
     8 
     8 
     9 section \<open>(Finite) multisets\<close>
     9 section \<open>(Finite) multisets\<close>
    10 
    10 
    11 theory Multiset
    11 theory Multiset
    12 imports Main
    12 imports Cancellation
    13 begin
    13 begin
    14 
    14 
    15 subsection \<open>The type of multisets\<close>
    15 subsection \<open>The type of multisets\<close>
    16 
    16 
    17 definition "multiset = {f :: 'a \<Rightarrow> nat. finite {x. f x > 0}}"
    17 definition "multiset = {f :: 'a \<Rightarrow> nat. finite {x. f x > 0}}"
   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