author | nipkow |
Wed, 10 Jan 2018 15:25:09 +0100 | |
changeset 67399 | eab6ce8368fa |
parent 66804 | 3f9bb52082c4 |
child 67764 | 0f8cb5568b63 |
permissions | -rw-r--r-- |
58197 | 1 |
(* Author: Florian Haftmann, TU Muenchen *) |
2 |
||
58881 | 3 |
section \<open>Big sum and product over function bodies\<close> |
58197 | 4 |
|
5 |
theory Groups_Big_Fun |
|
6 |
imports |
|
7 |
Main |
|
8 |
begin |
|
9 |
||
10 |
subsection \<open>Abstract product\<close> |
|
11 |
||
12 |
locale comm_monoid_fun = comm_monoid |
|
13 |
begin |
|
14 |
||
15 |
definition G :: "('b \<Rightarrow> 'a) \<Rightarrow> 'a" |
|
16 |
where |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
17 |
expand_set: "G g = comm_monoid_set.F f \<^bold>1 g {a. g a \<noteq> \<^bold>1}" |
58197 | 18 |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
19 |
interpretation F: comm_monoid_set f "\<^bold>1" |
58197 | 20 |
.. |
21 |
||
22 |
lemma expand_superset: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
23 |
assumes "finite A" and "{a. g a \<noteq> \<^bold>1} \<subseteq> A" |
58197 | 24 |
shows "G g = F.F g A" |
25 |
apply (simp add: expand_set) |
|
26 |
apply (rule F.same_carrierI [of A]) |
|
27 |
apply (simp_all add: assms) |
|
28 |
done |
|
29 |
||
30 |
lemma conditionalize: |
|
31 |
assumes "finite A" |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
32 |
shows "F.F g A = G (\<lambda>a. if a \<in> A then g a else \<^bold>1)" |
58197 | 33 |
using assms |
34 |
apply (simp add: expand_set) |
|
35 |
apply (rule F.same_carrierI [of A]) |
|
36 |
apply auto |
|
37 |
done |
|
38 |
||
39 |
lemma neutral [simp]: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
40 |
"G (\<lambda>a. \<^bold>1) = \<^bold>1" |
58197 | 41 |
by (simp add: expand_set) |
42 |
||
43 |
lemma update [simp]: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
44 |
assumes "finite {a. g a \<noteq> \<^bold>1}" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
45 |
assumes "g a = \<^bold>1" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
46 |
shows "G (g(a := b)) = b \<^bold>* G g" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
47 |
proof (cases "b = \<^bold>1") |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
48 |
case True with \<open>g a = \<^bold>1\<close> show ?thesis |
58197 | 49 |
by (simp add: expand_set) (rule F.cong, auto) |
50 |
next |
|
51 |
case False |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
52 |
moreover have "{a'. a' \<noteq> a \<longrightarrow> g a' \<noteq> \<^bold>1} = insert a {a. g a \<noteq> \<^bold>1}" |
58197 | 53 |
by auto |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
54 |
moreover from \<open>g a = \<^bold>1\<close> have "a \<notin> {a. g a \<noteq> \<^bold>1}" |
58197 | 55 |
by simp |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
56 |
moreover have "F.F (\<lambda>a'. if a' = a then b else g a') {a. g a \<noteq> \<^bold>1} = F.F g {a. g a \<noteq> \<^bold>1}" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
57 |
by (rule F.cong) (auto simp add: \<open>g a = \<^bold>1\<close>) |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
58 |
ultimately show ?thesis using \<open>finite {a. g a \<noteq> \<^bold>1}\<close> by (simp add: expand_set) |
58197 | 59 |
qed |
60 |
||
61 |
lemma infinite [simp]: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
62 |
"\<not> finite {a. g a \<noteq> \<^bold>1} \<Longrightarrow> G g = \<^bold>1" |
58197 | 63 |
by (simp add: expand_set) |
64 |
||
65 |
lemma cong: |
|
66 |
assumes "\<And>a. g a = h a" |
|
67 |
shows "G g = G h" |
|
68 |
using assms by (simp add: expand_set) |
|
69 |
||
70 |
lemma strong_cong [cong]: |
|
71 |
assumes "\<And>a. g a = h a" |
|
72 |
shows "G (\<lambda>a. g a) = G (\<lambda>a. h a)" |
|
73 |
using assms by (fact cong) |
|
74 |
||
75 |
lemma not_neutral_obtains_not_neutral: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
76 |
assumes "G g \<noteq> \<^bold>1" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
77 |
obtains a where "g a \<noteq> \<^bold>1" |
58197 | 78 |
using assms by (auto elim: F.not_neutral_contains_not_neutral simp add: expand_set) |
79 |
||
80 |
lemma reindex_cong: |
|
81 |
assumes "bij l" |
|
82 |
assumes "g \<circ> l = h" |
|
83 |
shows "G g = G h" |
|
84 |
proof - |
|
85 |
from assms have unfold: "h = g \<circ> l" by simp |
|
60500 | 86 |
from \<open>bij l\<close> have "inj l" by (rule bij_is_inj) |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
87 |
then have "inj_on l {a. h a \<noteq> \<^bold>1}" by (rule subset_inj_on) simp |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
88 |
moreover from \<open>bij l\<close> have "{a. g a \<noteq> \<^bold>1} = l ` {a. h a \<noteq> \<^bold>1}" |
58197 | 89 |
by (auto simp add: image_Collect unfold elim: bij_pointE) |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
90 |
moreover have "\<And>x. x \<in> {a. h a \<noteq> \<^bold>1} \<Longrightarrow> g (l x) = h x" |
58197 | 91 |
by (simp add: unfold) |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
92 |
ultimately have "F.F g {a. g a \<noteq> \<^bold>1} = F.F h {a. h a \<noteq> \<^bold>1}" |
58197 | 93 |
by (rule F.reindex_cong) |
94 |
then show ?thesis by (simp add: expand_set) |
|
95 |
qed |
|
96 |
||
97 |
lemma distrib: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
98 |
assumes "finite {a. g a \<noteq> \<^bold>1}" and "finite {a. h a \<noteq> \<^bold>1}" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
99 |
shows "G (\<lambda>a. g a \<^bold>* h a) = G g \<^bold>* G h" |
58197 | 100 |
proof - |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
101 |
from assms have "finite ({a. g a \<noteq> \<^bold>1} \<union> {a. h a \<noteq> \<^bold>1})" by simp |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
102 |
moreover have "{a. g a \<^bold>* h a \<noteq> \<^bold>1} \<subseteq> {a. g a \<noteq> \<^bold>1} \<union> {a. h a \<noteq> \<^bold>1}" |
58197 | 103 |
by auto (drule sym, simp) |
104 |
ultimately show ?thesis |
|
105 |
using assms |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
106 |
by (simp add: expand_superset [of "{a. g a \<noteq> \<^bold>1} \<union> {a. h a \<noteq> \<^bold>1}"] F.distrib) |
58197 | 107 |
qed |
108 |
||
66804
3f9bb52082c4
avoid name clashes on interpretation of abstract locales
haftmann
parents:
64272
diff
changeset
|
109 |
lemma swap: |
58197 | 110 |
assumes "finite C" |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
111 |
assumes subset: "{a. \<exists>b. g a b \<noteq> \<^bold>1} \<times> {b. \<exists>a. g a b \<noteq> \<^bold>1} \<subseteq> C" (is "?A \<times> ?B \<subseteq> C") |
58197 | 112 |
shows "G (\<lambda>a. G (g a)) = G (\<lambda>b. G (\<lambda>a. g a b))" |
113 |
proof - |
|
60500 | 114 |
from \<open>finite C\<close> subset |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
115 |
have "finite ({a. \<exists>b. g a b \<noteq> \<^bold>1} \<times> {b. \<exists>a. g a b \<noteq> \<^bold>1})" |
58197 | 116 |
by (rule rev_finite_subset) |
117 |
then have fins: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
118 |
"finite {b. \<exists>a. g a b \<noteq> \<^bold>1}" "finite {a. \<exists>b. g a b \<noteq> \<^bold>1}" |
58197 | 119 |
by (auto simp add: finite_cartesian_product_iff) |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
120 |
have subsets: "\<And>a. {b. g a b \<noteq> \<^bold>1} \<subseteq> {b. \<exists>a. g a b \<noteq> \<^bold>1}" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
121 |
"\<And>b. {a. g a b \<noteq> \<^bold>1} \<subseteq> {a. \<exists>b. g a b \<noteq> \<^bold>1}" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
122 |
"{a. F.F (g a) {b. \<exists>a. g a b \<noteq> \<^bold>1} \<noteq> \<^bold>1} \<subseteq> {a. \<exists>b. g a b \<noteq> \<^bold>1}" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
123 |
"{a. F.F (\<lambda>aa. g aa a) {a. \<exists>b. g a b \<noteq> \<^bold>1} \<noteq> \<^bold>1} \<subseteq> {b. \<exists>a. g a b \<noteq> \<^bold>1}" |
58197 | 124 |
by (auto elim: F.not_neutral_contains_not_neutral) |
66804
3f9bb52082c4
avoid name clashes on interpretation of abstract locales
haftmann
parents:
64272
diff
changeset
|
125 |
from F.swap have |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
126 |
"F.F (\<lambda>a. F.F (g a) {b. \<exists>a. g a b \<noteq> \<^bold>1}) {a. \<exists>b. g a b \<noteq> \<^bold>1} = |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
127 |
F.F (\<lambda>b. F.F (\<lambda>a. g a b) {a. \<exists>b. g a b \<noteq> \<^bold>1}) {b. \<exists>a. g a b \<noteq> \<^bold>1}" . |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
128 |
with subsets fins have "G (\<lambda>a. F.F (g a) {b. \<exists>a. g a b \<noteq> \<^bold>1}) = |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
129 |
G (\<lambda>b. F.F (\<lambda>a. g a b) {a. \<exists>b. g a b \<noteq> \<^bold>1})" |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
130 |
by (auto simp add: expand_superset [of "{b. \<exists>a. g a b \<noteq> \<^bold>1}"] |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
131 |
expand_superset [of "{a. \<exists>b. g a b \<noteq> \<^bold>1}"]) |
58197 | 132 |
with subsets fins show ?thesis |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
133 |
by (auto simp add: expand_superset [of "{b. \<exists>a. g a b \<noteq> \<^bold>1}"] |
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
134 |
expand_superset [of "{a. \<exists>b. g a b \<noteq> \<^bold>1}"]) |
58197 | 135 |
qed |
136 |
||
137 |
lemma cartesian_product: |
|
138 |
assumes "finite C" |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
139 |
assumes subset: "{a. \<exists>b. g a b \<noteq> \<^bold>1} \<times> {b. \<exists>a. g a b \<noteq> \<^bold>1} \<subseteq> C" (is "?A \<times> ?B \<subseteq> C") |
58197 | 140 |
shows "G (\<lambda>a. G (g a)) = G (\<lambda>(a, b). g a b)" |
141 |
proof - |
|
60500 | 142 |
from subset \<open>finite C\<close> have fin_prod: "finite (?A \<times> ?B)" |
58197 | 143 |
by (rule finite_subset) |
144 |
from fin_prod have "finite ?A" and "finite ?B" |
|
145 |
by (auto simp add: finite_cartesian_product_iff) |
|
146 |
have *: "G (\<lambda>a. G (g a)) = |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
147 |
(F.F (\<lambda>a. F.F (g a) {b. \<exists>a. g a b \<noteq> \<^bold>1}) {a. \<exists>b. g a b \<noteq> \<^bold>1})" |
58197 | 148 |
apply (subst expand_superset [of "?B"]) |
60500 | 149 |
apply (rule \<open>finite ?B\<close>) |
58197 | 150 |
apply auto |
151 |
apply (subst expand_superset [of "?A"]) |
|
60500 | 152 |
apply (rule \<open>finite ?A\<close>) |
58197 | 153 |
apply auto |
154 |
apply (erule F.not_neutral_contains_not_neutral) |
|
155 |
apply auto |
|
156 |
done |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
157 |
have "{p. (case p of (a, b) \<Rightarrow> g a b) \<noteq> \<^bold>1} \<subseteq> ?A \<times> ?B" |
58197 | 158 |
by auto |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
159 |
with subset have **: "{p. (case p of (a, b) \<Rightarrow> g a b) \<noteq> \<^bold>1} \<subseteq> C" |
58197 | 160 |
by blast |
161 |
show ?thesis |
|
162 |
apply (simp add: *) |
|
163 |
apply (simp add: F.cartesian_product) |
|
164 |
apply (subst expand_superset [of C]) |
|
60500 | 165 |
apply (rule \<open>finite C\<close>) |
58197 | 166 |
apply (simp_all add: **) |
167 |
apply (rule F.same_carrierI [of C]) |
|
60500 | 168 |
apply (rule \<open>finite C\<close>) |
58197 | 169 |
apply (simp_all add: subset) |
170 |
apply auto |
|
171 |
done |
|
172 |
qed |
|
173 |
||
174 |
lemma cartesian_product2: |
|
175 |
assumes fin: "finite D" |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
176 |
assumes subset: "{(a, b). \<exists>c. g a b c \<noteq> \<^bold>1} \<times> {c. \<exists>a b. g a b c \<noteq> \<^bold>1} \<subseteq> D" (is "?AB \<times> ?C \<subseteq> D") |
58197 | 177 |
shows "G (\<lambda>(a, b). G (g a b)) = G (\<lambda>(a, b, c). g a b c)" |
178 |
proof - |
|
179 |
have bij: "bij (\<lambda>(a, b, c). ((a, b), c))" |
|
180 |
by (auto intro!: bijI injI simp add: image_def) |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
181 |
have "{p. \<exists>c. g (fst p) (snd p) c \<noteq> \<^bold>1} \<times> {c. \<exists>p. g (fst p) (snd p) c \<noteq> \<^bold>1} \<subseteq> D" |
61424
c3658c18b7bc
prod_case as canonical name for product type eliminator
haftmann
parents:
61378
diff
changeset
|
182 |
by auto (insert subset, blast) |
58197 | 183 |
with fin have "G (\<lambda>p. G (g (fst p) (snd p))) = G (\<lambda>(p, c). g (fst p) (snd p) c)" |
184 |
by (rule cartesian_product) |
|
185 |
then have "G (\<lambda>(a, b). G (g a b)) = G (\<lambda>((a, b), c). g a b c)" |
|
186 |
by (auto simp add: split_def) |
|
187 |
also have "G (\<lambda>((a, b), c). g a b c) = G (\<lambda>(a, b, c). g a b c)" |
|
188 |
using bij by (rule reindex_cong [of "\<lambda>(a, b, c). ((a, b), c)"]) (simp add: fun_eq_iff) |
|
189 |
finally show ?thesis . |
|
190 |
qed |
|
191 |
||
192 |
lemma delta [simp]: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
193 |
"G (\<lambda>b. if b = a then g b else \<^bold>1) = g a" |
58197 | 194 |
proof - |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
195 |
have "{b. (if b = a then g b else \<^bold>1) \<noteq> \<^bold>1} \<subseteq> {a}" by auto |
58197 | 196 |
then show ?thesis by (simp add: expand_superset [of "{a}"]) |
197 |
qed |
|
198 |
||
199 |
lemma delta' [simp]: |
|
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
200 |
"G (\<lambda>b. if a = b then g b else \<^bold>1) = g a" |
58197 | 201 |
proof - |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
202 |
have "(\<lambda>b. if a = b then g b else \<^bold>1) = (\<lambda>b. if b = a then g b else \<^bold>1)" |
58197 | 203 |
by (simp add: fun_eq_iff) |
63290
9ac558ab0906
boldify syntax in abstract algebraic structures, to avoid clashes with concrete syntax in corresponding type classes
haftmann
parents:
61955
diff
changeset
|
204 |
then have "G (\<lambda>b. if a = b then g b else \<^bold>1) = G (\<lambda>b. if b = a then g b else \<^bold>1)" |
58197 | 205 |
by (simp cong del: strong_cong) |
206 |
then show ?thesis by simp |
|
207 |
qed |
|
208 |
||
209 |
end |
|
210 |
||
211 |
||
212 |
subsection \<open>Concrete sum\<close> |
|
213 |
||
214 |
context comm_monoid_add |
|
215 |
begin |
|
216 |
||
61776 | 217 |
sublocale Sum_any: comm_monoid_fun plus 0 |
63433 | 218 |
defines Sum_any = Sum_any.G |
64267 | 219 |
rewrites "comm_monoid_set.F plus 0 = sum" |
58197 | 220 |
proof - |
221 |
show "comm_monoid_fun plus 0" .. |
|
61605 | 222 |
then interpret Sum_any: comm_monoid_fun plus 0 . |
64267 | 223 |
from sum_def show "comm_monoid_set.F plus 0 = sum" by (auto intro: sym) |
58197 | 224 |
qed |
225 |
||
226 |
end |
|
227 |
||
61955
e96292f32c3c
former "xsymbols" syntax is used by default, and ASCII replacement syntax with print mode "ASCII";
wenzelm
parents:
61776
diff
changeset
|
228 |
syntax (ASCII) |
58197 | 229 |
"_Sum_any" :: "pttrn \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_add" ("(3SUM _. _)" [0, 10] 10) |
61955
e96292f32c3c
former "xsymbols" syntax is used by default, and ASCII replacement syntax with print mode "ASCII";
wenzelm
parents:
61776
diff
changeset
|
230 |
syntax |
58197 | 231 |
"_Sum_any" :: "pttrn \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_add" ("(3\<Sum>_. _)" [0, 10] 10) |
232 |
translations |
|
61955
e96292f32c3c
former "xsymbols" syntax is used by default, and ASCII replacement syntax with print mode "ASCII";
wenzelm
parents:
61776
diff
changeset
|
233 |
"\<Sum>a. b" \<rightleftharpoons> "CONST Sum_any (\<lambda>a. b)" |
58197 | 234 |
|
235 |
lemma Sum_any_left_distrib: |
|
236 |
fixes r :: "'a :: semiring_0" |
|
237 |
assumes "finite {a. g a \<noteq> 0}" |
|
238 |
shows "Sum_any g * r = (\<Sum>n. g n * r)" |
|
239 |
proof - |
|
240 |
note assms |
|
241 |
moreover have "{a. g a * r \<noteq> 0} \<subseteq> {a. g a \<noteq> 0}" by auto |
|
242 |
ultimately show ?thesis |
|
64267 | 243 |
by (simp add: sum_distrib_right Sum_any.expand_superset [of "{a. g a \<noteq> 0}"]) |
58197 | 244 |
qed |
245 |
||
246 |
lemma Sum_any_right_distrib: |
|
247 |
fixes r :: "'a :: semiring_0" |
|
248 |
assumes "finite {a. g a \<noteq> 0}" |
|
249 |
shows "r * Sum_any g = (\<Sum>n. r * g n)" |
|
250 |
proof - |
|
251 |
note assms |
|
252 |
moreover have "{a. r * g a \<noteq> 0} \<subseteq> {a. g a \<noteq> 0}" by auto |
|
253 |
ultimately show ?thesis |
|
64267 | 254 |
by (simp add: sum_distrib_left Sum_any.expand_superset [of "{a. g a \<noteq> 0}"]) |
58197 | 255 |
qed |
256 |
||
257 |
lemma Sum_any_product: |
|
258 |
fixes f g :: "'b \<Rightarrow> 'a::semiring_0" |
|
259 |
assumes "finite {a. f a \<noteq> 0}" and "finite {b. g b \<noteq> 0}" |
|
260 |
shows "Sum_any f * Sum_any g = (\<Sum>a. \<Sum>b. f a * g b)" |
|
261 |
proof - |
|
262 |
have subset_f: "{a. (\<Sum>b. f a * g b) \<noteq> 0} \<subseteq> {a. f a \<noteq> 0}" |
|
263 |
by rule (simp, rule, auto) |
|
264 |
moreover have subset_g: "\<And>a. {b. f a * g b \<noteq> 0} \<subseteq> {b. g b \<noteq> 0}" |
|
265 |
by rule (simp, rule, auto) |
|
266 |
ultimately show ?thesis using assms |
|
267 |
by (auto simp add: Sum_any.expand_set [of f] Sum_any.expand_set [of g] |
|
268 |
Sum_any.expand_superset [of "{a. f a \<noteq> 0}"] Sum_any.expand_superset [of "{b. g b \<noteq> 0}"] |
|
64267 | 269 |
sum_product) |
58197 | 270 |
qed |
271 |
||
58437 | 272 |
lemma Sum_any_eq_zero_iff [simp]: |
273 |
fixes f :: "'a \<Rightarrow> nat" |
|
274 |
assumes "finite {a. f a \<noteq> 0}" |
|
275 |
shows "Sum_any f = 0 \<longleftrightarrow> f = (\<lambda>_. 0)" |
|
276 |
using assms by (simp add: Sum_any.expand_set fun_eq_iff) |
|
277 |
||
58197 | 278 |
|
279 |
subsection \<open>Concrete product\<close> |
|
280 |
||
281 |
context comm_monoid_mult |
|
282 |
begin |
|
283 |
||
61776 | 284 |
sublocale Prod_any: comm_monoid_fun times 1 |
63433 | 285 |
defines Prod_any = Prod_any.G |
64272 | 286 |
rewrites "comm_monoid_set.F times 1 = prod" |
58197 | 287 |
proof - |
288 |
show "comm_monoid_fun times 1" .. |
|
61605 | 289 |
then interpret Prod_any: comm_monoid_fun times 1 . |
64272 | 290 |
from prod_def show "comm_monoid_set.F times 1 = prod" by (auto intro: sym) |
58197 | 291 |
qed |
292 |
||
293 |
end |
|
294 |
||
61955
e96292f32c3c
former "xsymbols" syntax is used by default, and ASCII replacement syntax with print mode "ASCII";
wenzelm
parents:
61776
diff
changeset
|
295 |
syntax (ASCII) |
e96292f32c3c
former "xsymbols" syntax is used by default, and ASCII replacement syntax with print mode "ASCII";
wenzelm
parents:
61776
diff
changeset
|
296 |
"_Prod_any" :: "pttrn \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_mult" ("(3PROD _. _)" [0, 10] 10) |
58197 | 297 |
syntax |
61955
e96292f32c3c
former "xsymbols" syntax is used by default, and ASCII replacement syntax with print mode "ASCII";
wenzelm
parents:
61776
diff
changeset
|
298 |
"_Prod_any" :: "pttrn \<Rightarrow> 'a \<Rightarrow> 'a::comm_monoid_mult" ("(3\<Prod>_. _)" [0, 10] 10) |
58197 | 299 |
translations |
300 |
"\<Prod>a. b" == "CONST Prod_any (\<lambda>a. b)" |
|
301 |
||
302 |
lemma Prod_any_zero: |
|
303 |
fixes f :: "'b \<Rightarrow> 'a :: comm_semiring_1" |
|
304 |
assumes "finite {a. f a \<noteq> 1}" |
|
305 |
assumes "f a = 0" |
|
306 |
shows "(\<Prod>a. f a) = 0" |
|
307 |
proof - |
|
60500 | 308 |
from \<open>f a = 0\<close> have "f a \<noteq> 1" by simp |
309 |
with \<open>f a = 0\<close> have "\<exists>a. f a \<noteq> 1 \<and> f a = 0" by blast |
|
310 |
with \<open>finite {a. f a \<noteq> 1}\<close> show ?thesis |
|
64272 | 311 |
by (simp add: Prod_any.expand_set prod_zero) |
58197 | 312 |
qed |
313 |
||
314 |
lemma Prod_any_not_zero: |
|
315 |
fixes f :: "'b \<Rightarrow> 'a :: comm_semiring_1" |
|
316 |
assumes "finite {a. f a \<noteq> 1}" |
|
317 |
assumes "(\<Prod>a. f a) \<noteq> 0" |
|
318 |
shows "f a \<noteq> 0" |
|
319 |
using assms Prod_any_zero [of f] by blast |
|
320 |
||
58437 | 321 |
lemma power_Sum_any: |
322 |
assumes "finite {a. f a \<noteq> 0}" |
|
323 |
shows "c ^ (\<Sum>a. f a) = (\<Prod>a. c ^ f a)" |
|
324 |
proof - |
|
325 |
have "{a. c ^ f a \<noteq> 1} \<subseteq> {a. f a \<noteq> 0}" |
|
326 |
by (auto intro: ccontr) |
|
327 |
with assms show ?thesis |
|
64267 | 328 |
by (simp add: Sum_any.expand_set Prod_any.expand_superset power_sum) |
58437 | 329 |
qed |
330 |
||
58197 | 331 |
end |