equal
deleted
inserted
replaced
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 |