src/HOL/Library/Multiset.thy
changeset 73047 ab9e27da0e85
parent 72607 feebdaa346e5
child 73052 c03a148110cc
equal deleted inserted replaced
73046:32edc2b4e243 73047:ab9e27da0e85
  2291   "sum f A = sum_mset (image_mset f (mset_set A))"
  2291   "sum f A = sum_mset (image_mset f (mset_set A))"
  2292   by (cases "finite A") (induct A rule: finite_induct, simp_all)
  2292   by (cases "finite A") (induct A rule: finite_induct, simp_all)
  2293 
  2293 
  2294 end
  2294 end
  2295 
  2295 
       
  2296 notation sum_mset ("\<Sum>\<^sub>#")
       
  2297 
  2296 syntax (ASCII)
  2298 syntax (ASCII)
  2297   "_sum_mset_image" :: "pttrn \<Rightarrow> 'b set \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_add"  ("(3SUM _:#_. _)" [0, 51, 10] 10)
  2299   "_sum_mset_image" :: "pttrn \<Rightarrow> 'b set \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_add"  ("(3SUM _:#_. _)" [0, 51, 10] 10)
  2298 syntax
  2300 syntax
  2299   "_sum_mset_image" :: "pttrn \<Rightarrow> 'b set \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_add"  ("(3\<Sum>_\<in>#_. _)" [0, 51, 10] 10)
  2301   "_sum_mset_image" :: "pttrn \<Rightarrow> 'b set \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_add"  ("(3\<Sum>_\<in>#_. _)" [0, 51, 10] 10)
  2300 translations
  2302 translations
  2387 lemma sum_mset_constant [simp]:
  2389 lemma sum_mset_constant [simp]:
  2388   fixes y :: "'b::semiring_1"
  2390   fixes y :: "'b::semiring_1"
  2389   shows \<open>(\<Sum>x\<in>#A. y) = of_nat (size A) * y\<close>
  2391   shows \<open>(\<Sum>x\<in>#A. y) = of_nat (size A) * y\<close>
  2390   by (induction A) (auto simp: algebra_simps)
  2392   by (induction A) (auto simp: algebra_simps)
  2391 
  2393 
  2392 abbreviation Union_mset :: "'a multiset multiset \<Rightarrow> 'a multiset"  ("\<Union>#")
  2394 lemma set_mset_Union_mset[simp]: "set_mset (\<Sum>\<^sub># MM) = (\<Union>M \<in> set_mset MM. set_mset M)"
  2393   where "\<Union># MM \<equiv> sum_mset MM" \<comment> \<open>FIXME ambiguous notation --
       
  2394     could likewise refer to \<open>\<Squnion>#\<close>\<close>
       
  2395 
       
  2396 lemma set_mset_Union_mset[simp]: "set_mset (\<Union># MM) = (\<Union>M \<in> set_mset MM. set_mset M)"
       
  2397   by (induct MM) auto
  2395   by (induct MM) auto
  2398 
  2396 
  2399 lemma in_Union_mset_iff[iff]: "x \<in># \<Union># MM \<longleftrightarrow> (\<exists>M. M \<in># MM \<and> x \<in># M)"
  2397 lemma in_Union_mset_iff[iff]: "x \<in># \<Sum>\<^sub># MM \<longleftrightarrow> (\<exists>M. M \<in># MM \<and> x \<in># M)"
  2400   by (induct MM) auto
  2398   by (induct MM) auto
  2401 
  2399 
  2402 lemma count_sum:
  2400 lemma count_sum:
  2403   "count (sum f A) x = sum (\<lambda>a. count (f a) x) A"
  2401   "count (sum f A) x = sum (\<lambda>a. count (f a) x) A"
  2404   by (induct A rule: infinite_finite_induct) simp_all
  2402   by (induct A rule: infinite_finite_induct) simp_all
  2406 lemma sum_eq_empty_iff:
  2404 lemma sum_eq_empty_iff:
  2407   assumes "finite A"
  2405   assumes "finite A"
  2408   shows "sum f A = {#} \<longleftrightarrow> (\<forall>a\<in>A. f a = {#})"
  2406   shows "sum f A = {#} \<longleftrightarrow> (\<forall>a\<in>A. f a = {#})"
  2409   using assms by induct simp_all
  2407   using assms by induct simp_all
  2410 
  2408 
  2411 lemma Union_mset_empty_conv[simp]: "\<Union># M = {#} \<longleftrightarrow> (\<forall>i\<in>#M. i = {#})"
  2409 lemma Union_mset_empty_conv[simp]: "\<Sum>\<^sub># M = {#} \<longleftrightarrow> (\<forall>i\<in>#M. i = {#})"
  2412   by (induction M) auto
  2410   by (induction M) auto
  2413 
  2411 
  2414 lemma Union_image_single_mset[simp]: "\<Union># (image_mset (\<lambda>x. {#x#}) m) = m"
  2412 lemma Union_image_single_mset[simp]: "\<Sum>\<^sub># (image_mset (\<lambda>x. {#x#}) m) = m"
  2415 by(induction m) auto
  2413 by(induction m) auto
  2416 
  2414 
  2417 
  2415 
  2418 context comm_monoid_mult
  2416 context comm_monoid_mult
  2419 begin
  2417 begin