src/HOL/Library/DAList_Multiset.thy
changeset 60397 f8a513fedb31
parent 59998 c54d36be22ef
child 60495 d7ff0a1df90a
equal deleted inserted replaced
60393:b640770117fd 60397:f8a513fedb31
    16 
    16 
    17 lemma [code, code del]: "plus = (plus :: 'a multiset \<Rightarrow> _)" ..
    17 lemma [code, code del]: "plus = (plus :: 'a multiset \<Rightarrow> _)" ..
    18 
    18 
    19 lemma [code, code del]: "minus = (minus :: 'a multiset \<Rightarrow> _)" ..
    19 lemma [code, code del]: "minus = (minus :: 'a multiset \<Rightarrow> _)" ..
    20 
    20 
    21 lemma [code, code del]: "inf = (inf :: 'a multiset \<Rightarrow> _)" ..
    21 lemma [code, code del]: "inf_subset_mset = (inf_subset_mset :: 'a multiset \<Rightarrow> _)" ..
    22 
    22 
    23 lemma [code, code del]: "sup = (sup :: 'a multiset \<Rightarrow> _)" ..
    23 lemma [code, code del]: "sup_subset_mset = (sup_subset_mset :: 'a multiset \<Rightarrow> _)" ..
    24 
    24 
    25 lemma [code, code del]: "image_mset = image_mset" ..
    25 lemma [code, code del]: "image_mset = image_mset" ..
    26 
    26 
    27 lemma [code, code del]: "filter_mset = filter_mset" ..
    27 lemma [code, code del]: "filter_mset = filter_mset" ..
    28 
    28 
    36 
    36 
    37 lemma [code, code del]: "set_of = set_of" ..
    37 lemma [code, code del]: "set_of = set_of" ..
    38 
    38 
    39 lemma [code, code del]: "sorted_list_of_multiset = sorted_list_of_multiset" ..
    39 lemma [code, code del]: "sorted_list_of_multiset = sorted_list_of_multiset" ..
    40 
    40 
    41 lemma [code, code del]: "ord_multiset_inst.less_eq_multiset = ord_multiset_inst.less_eq_multiset" ..
    41 lemma [code, code del]: "subset_mset = subset_mset" ..
    42 
    42 
    43 lemma [code, code del]: "ord_multiset_inst.less_multiset = ord_multiset_inst.less_multiset" ..
    43 lemma [code, code del]: "subseteq_mset = subseteq_mset" ..
    44 
    44 
    45 lemma [code, code del]: "equal_multiset_inst.equal_multiset = equal_multiset_inst.equal_multiset" ..
    45 lemma [code, code del]: "equal_multiset_inst.equal_multiset = equal_multiset_inst.equal_multiset" ..
    46 
    46 
    47 
    47 
    48 text \<open>Raw operations on lists\<close>
    48 text \<open>Raw operations on lists\<close>
   201 
   201 
   202 lemma filter_Bag [code]: "filter_mset P (Bag xs) = Bag (DAList.filter (P \<circ> fst) xs)"
   202 lemma filter_Bag [code]: "filter_mset P (Bag xs) = Bag (DAList.filter (P \<circ> fst) xs)"
   203   by (rule multiset_eqI) (simp add: count_of_filter DAList.filter.rep_eq)
   203   by (rule multiset_eqI) (simp add: count_of_filter DAList.filter.rep_eq)
   204 
   204 
   205 
   205 
   206 lemma mset_eq [code]: "HOL.equal (m1::'a::equal multiset) m2 \<longleftrightarrow> m1 \<le> m2 \<and> m2 \<le> m1"
   206 lemma mset_eq [code]: "HOL.equal (m1::'a::equal multiset) m2 \<longleftrightarrow> m1 \<le># m2 \<and> m2 \<le># m1"
   207   by (metis equal_multiset_def eq_iff)
   207   by (metis equal_multiset_def subset_mset.eq_iff)
   208 
   208 
   209 text \<open>By default the code for @{text "<"} is @{prop"xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> xs = ys"}.
   209 text \<open>By default the code for @{text "<"} is @{prop"xs < ys \<longleftrightarrow> xs \<le> ys \<and> \<not> xs = ys"}.
   210 With equality implemented by @{text"\<le>"}, this leads to three calls of  @{text"\<le>"}.
   210 With equality implemented by @{text"\<le>"}, this leads to three calls of  @{text"\<le>"}.
   211 Here is a more efficient version:\<close>
   211 Here is a more efficient version:\<close>
   212 lemma mset_less[code]: "xs < (ys :: 'a multiset) \<longleftrightarrow> xs \<le> ys \<and> \<not> ys \<le> xs"
   212 lemma mset_less[code]: "xs <# (ys :: 'a multiset) \<longleftrightarrow> xs \<le># ys \<and> \<not> ys \<le># xs"
   213   by (rule less_le_not_le)
   213   by (rule subset_mset.less_le_not_le)
   214 
   214 
   215 lemma mset_less_eq_Bag0:
   215 lemma mset_less_eq_Bag0:
   216   "Bag xs \<le> A \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). count_of (DAList.impl_of xs) x \<le> count A x)"
   216   "Bag xs \<le># A \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). count_of (DAList.impl_of xs) x \<le> count A x)"
   217     (is "?lhs \<longleftrightarrow> ?rhs")
   217     (is "?lhs \<longleftrightarrow> ?rhs")
   218 proof
   218 proof
   219   assume ?lhs
   219   assume ?lhs
   220   then show ?rhs by (auto simp add: mset_le_def)
   220   then show ?rhs by (auto simp add: subseteq_mset_def)
   221 next
   221 next
   222   assume ?rhs
   222   assume ?rhs
   223   show ?lhs
   223   show ?lhs
   224   proof (rule mset_less_eqI)
   224   proof (rule mset_less_eqI)
   225     fix x
   225     fix x
   226     from \<open>?rhs\<close> have "count_of (DAList.impl_of xs) x \<le> count A x"
   226     from \<open>?rhs\<close> have "count_of (DAList.impl_of xs) x \<le> count A x"
   227       by (cases "x \<in> fst ` set (DAList.impl_of xs)") (auto simp add: count_of_empty)
   227       by (cases "x \<in> fst ` set (DAList.impl_of xs)") (auto simp add: count_of_empty)
   228     then show "count (Bag xs) x \<le> count A x" by (simp add: mset_le_def)
   228     then show "count (Bag xs) x \<le> count A x" by (simp add: subset_mset_def)
   229   qed
   229   qed
   230 qed
   230 qed
   231 
   231 
   232 lemma mset_less_eq_Bag [code]:
   232 lemma mset_less_eq_Bag [code]:
   233   "Bag xs \<le> (A :: 'a multiset) \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). n \<le> count A x)"
   233   "Bag xs \<le># (A :: 'a multiset) \<longleftrightarrow> (\<forall>(x, n) \<in> set (DAList.impl_of xs). n \<le> count A x)"
   234 proof -
   234 proof -
   235   {
   235   {
   236     fix x n
   236     fix x n
   237     assume "(x,n) \<in> set (DAList.impl_of xs)"
   237     assume "(x,n) \<in> set (DAList.impl_of xs)"
   238     then have "count_of (DAList.impl_of xs) x = n"
   238     then have "count_of (DAList.impl_of xs) x = n"
   264   then show ?thesis
   264   then show ?thesis
   265     unfolding mset_less_eq_Bag0 by auto
   265     unfolding mset_less_eq_Bag0 by auto
   266 qed
   266 qed
   267 
   267 
   268 declare multiset_inter_def [code]
   268 declare multiset_inter_def [code]
   269 declare sup_multiset_def [code]
   269 declare sup_subset_mset_def [code]
   270 declare multiset_of.simps [code]
   270 declare multiset_of.simps [code]
   271 
   271 
   272 
   272 
   273 fun fold_impl :: "('a \<Rightarrow> nat \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'b \<Rightarrow> ('a \<times> nat) list \<Rightarrow> 'b"
   273 fun fold_impl :: "('a \<Rightarrow> nat \<Rightarrow> 'b \<Rightarrow> 'b) \<Rightarrow> 'b \<Rightarrow> ('a \<times> nat) list \<Rightarrow> 'b"
   274 where
   274 where