# HG changeset patch # User haftmann # Date 1455814389 -3600 # Node ID 95c6cf433c9188e55f279d71bcb16b3b6f5bf325 # Parent 8a105c235b1fa0bac9630f311a60039a357f11c4 more theorems diff -r 8a105c235b1f -r 95c6cf433c91 src/HOL/Library/Multiset.thy --- a/src/HOL/Library/Multiset.thy Thu Feb 18 17:52:53 2016 +0100 +++ b/src/HOL/Library/Multiset.thy Thu Feb 18 17:53:09 2016 +0100 @@ -1164,6 +1164,15 @@ "replicate (count (mset xs) k) k = filter (HOL.eq k) xs" by (induct xs) auto +lemma replicate_mset_eq_empty_iff [simp]: + "replicate_mset n a = {#} \ n = 0" + by (induct n) simp_all + +lemma replicate_mset_eq_iff: + "replicate_mset m a = replicate_mset n b \ + m = 0 \ n = 0 \ m = n \ a = b" + by (auto simp add: multiset_eq_iff) + subsection \Big operators\ @@ -1237,6 +1246,12 @@ (simp_all del: mem_set_mset_iff add: size_multiset_overloaded_eq setsum.distrib setsum.delta' insert_absorb, simp) qed +syntax (ASCII) + "_msetsum_image" :: "pttrn \ 'b set \ 'a \ 'a::comm_monoid_add" ("(3SUM _:#_. _)" [0, 51, 10] 10) +syntax + "_msetsum_image" :: "pttrn \ 'b set \ 'a \ 'a::comm_monoid_add" ("(3\_\#_. _)" [0, 51, 10] 10) +translations + "\i \# A. b" \ "CONST msetsum (CONST image_mset (\i. b) A)" abbreviation Union_mset :: "'a multiset multiset \ 'a multiset" ("\#_" [900] 900) where "\# MM \ msetsum MM" @@ -1247,12 +1262,14 @@ lemma in_Union_mset_iff[iff]: "x \# \# MM \ (\M. M \# MM \ x \# M)" by (induct MM) auto -syntax (ASCII) - "_msetsum_image" :: "pttrn \ 'b set \ 'a \ 'a::comm_monoid_add" ("(3SUM _:#_. _)" [0, 51, 10] 10) -syntax - "_msetsum_image" :: "pttrn \ 'b set \ 'a \ 'a::comm_monoid_add" ("(3\_\#_. _)" [0, 51, 10] 10) -translations - "\i \# A. b" \ "CONST msetsum (CONST image_mset (\i. b) A)" +lemma count_setsum: + "count (setsum f A) x = setsum (\a. count (f a) x) A" + by (induct A rule: infinite_finite_induct) simp_all + +lemma setsum_eq_empty_iff: + assumes "finite A" + shows "setsum f A = {#} \ (\a\A. f a = {#})" + using assms by induct simp_all context comm_monoid_mult begin @@ -1302,6 +1319,10 @@ then show ?thesis by simp qed +lemma (in semidom) msetprod_zero_iff: + "msetprod A = 0 \ (\a\set_mset A. a = 0)" + by (induct A) auto + subsection \Alternative representations\ diff -r 8a105c235b1f -r 95c6cf433c91 src/HOL/Number_Theory/Factorial_Ring.thy --- a/src/HOL/Number_Theory/Factorial_Ring.thy Thu Feb 18 17:52:53 2016 +0100 +++ b/src/HOL/Number_Theory/Factorial_Ring.thy Thu Feb 18 17:53:09 2016 +0100 @@ -8,27 +8,6 @@ imports Main Primes "~~/src/HOL/Library/Multiset" (*"~~/src/HOL/Library/Polynomial"*) begin -context algebraic_semidom -begin - -lemma is_unit_mult_iff: - "is_unit (a * b) \ is_unit a \ is_unit b" (is "?P \ ?Q") - by (auto dest: dvd_mult_left dvd_mult_right) - -lemma is_unit_power_iff: - "is_unit (a ^ n) \ is_unit a \ n = 0" - by (induct n) (auto simp add: is_unit_mult_iff) - -lemma subset_divisors_dvd: - "{c. c dvd a} \ {c. c dvd b} \ a dvd b" - by (auto simp add: subset_iff intro: dvd_trans) - -lemma strict_subset_divisors_dvd: - "{c. c dvd a} \ {c. c dvd b} \ a dvd b \ \ b dvd a" - by (auto simp add: subset_iff intro: dvd_trans) - -end - class factorial_semiring = normalization_semidom + assumes finite_divisors: "a \ 0 \ finite {b. b dvd a \ normalize b = b}" fixes is_prime :: "'a \ bool" diff -r 8a105c235b1f -r 95c6cf433c91 src/HOL/Power.thy --- a/src/HOL/Power.thy Thu Feb 18 17:52:53 2016 +0100 +++ b/src/HOL/Power.thy Thu Feb 18 17:53:09 2016 +0100 @@ -331,6 +331,10 @@ shows "(a div b) ^ n = a ^ n div b ^ n" using assms by (induct n) (simp_all add: div_mult_div_if_dvd dvd_power_same) +lemma is_unit_power_iff: + "is_unit (a ^ n) \ is_unit a \ n = 0" + by (induct n) (auto simp add: is_unit_mult_iff) + end context normalization_semidom diff -r 8a105c235b1f -r 95c6cf433c91 src/HOL/Rings.thy --- a/src/HOL/Rings.thy Thu Feb 18 17:52:53 2016 +0100 +++ b/src/HOL/Rings.thy Thu Feb 18 17:53:09 2016 +0100 @@ -10,7 +10,7 @@ section \Rings\ theory Rings -imports Groups +imports Groups Set begin class semiring = ab_semigroup_add + semigroup_mult + @@ -155,6 +155,14 @@ then show ?thesis .. qed +lemma subset_divisors_dvd: + "{c. c dvd a} \ {c. c dvd b} \ a dvd b" + by (auto simp add: subset_iff intro: dvd_trans) + +lemma strict_subset_divisors_dvd: + "{c. c dvd a} \ {c. c dvd b} \ a dvd b \ \ b dvd a" + by (auto simp add: subset_iff intro: dvd_trans) + lemma one_dvd [simp]: "1 dvd a" by (auto intro!: dvdI) @@ -847,6 +855,10 @@ "is_unit a \ is_unit b \ is_unit (a * b)" by (subst mult_1_left [of 1, symmetric]) (rule mult_dvd_mono) +lemma is_unit_mult_iff: + "is_unit (a * b) \ is_unit a \ is_unit b" (is "?P \ ?Q") + by (auto dest: dvd_mult_left dvd_mult_right) + lemma unit_div [intro]: "is_unit a \ is_unit b \ is_unit (a div b)" by (erule is_unitE [of b a]) (simp add: ac_simps unit_prod)