11394
|
1 |
(* Title: HOL/GroupTheory/Coset
|
|
2 |
ID: $Id$
|
|
3 |
Author: Florian Kammueller, with new proofs by L C Paulson
|
|
4 |
Copyright 1998-2001 University of Cambridge
|
|
5 |
|
|
6 |
Theory of cosets, using locales
|
|
7 |
*)
|
|
8 |
|
|
9 |
(** these versions are useful for Sylow's Theorem **)
|
|
10 |
|
|
11 |
Goal "[|finite A; finite B; \\<exists>f \\<in> A\\<rightarrow>B. inj_on f A|] ==> card(A) <= card(B)";
|
|
12 |
by (Clarify_tac 1);
|
|
13 |
by (rtac card_inj_on_le 1);
|
|
14 |
by (auto_tac (claset(), simpset() addsimps [Pi_def]));
|
|
15 |
qed "card_inj";
|
|
16 |
|
|
17 |
Goal "[| finite A; finite B; \\<exists>f \\<in> A\\<rightarrow>B. inj_on f A; \
|
|
18 |
\ \\<exists>g \\<in> B\\<rightarrow>A. inj_on g B |] ==> card(A) = card(B)";
|
|
19 |
by (Clarify_tac 1);
|
|
20 |
by (rtac card_bij_eq 1);
|
|
21 |
by (auto_tac (claset(), simpset() addsimps [Pi_def]));
|
|
22 |
qed "card_bij";
|
|
23 |
|
|
24 |
|
|
25 |
|
|
26 |
Open_locale "coset";
|
11443
|
27 |
Addsimps [Group_G, simp_G];
|
11394
|
28 |
|
|
29 |
val rcos_def = thm "rcos_def";
|
|
30 |
val lcos_def = thm "lcos_def";
|
|
31 |
val setprod_def = thm "setprod_def";
|
|
32 |
val setinv_def = thm "setinv_def";
|
|
33 |
val setrcos_def = thm "setrcos_def";
|
|
34 |
|
|
35 |
val group_defs = [thm "binop_def", thm "inv_def", thm "e_def"];
|
|
36 |
val coset_defs = [thm "rcos_def", thm "lcos_def", thm "setprod_def"];
|
|
37 |
|
|
38 |
(** Alternative definitions, reducing to locale constants **)
|
|
39 |
|
|
40 |
Goal "H #> a = {b . \\<exists>h\\<in>H. h ## a = b}";
|
|
41 |
by (auto_tac (claset(),
|
|
42 |
simpset() addsimps [rcos_def, r_coset_def, binop_def]));
|
|
43 |
qed "r_coset_eq";
|
|
44 |
|
|
45 |
Goal "a <# H = {b . \\<exists>h\\<in>H. a ## h = b}";
|
|
46 |
by (auto_tac (claset(),
|
|
47 |
simpset() addsimps [lcos_def, l_coset_def, binop_def]));
|
|
48 |
qed "l_coset_eq";
|
|
49 |
|
|
50 |
Goal "{*H*} = {C . \\<exists>a\\<in>carrier G. C = H #> a}";
|
|
51 |
by (auto_tac (claset(),
|
|
52 |
simpset() addsimps [set_r_cos_def, setrcos_def, rcos_def, binop_def]));
|
|
53 |
qed "setrcos_eq";
|
|
54 |
|
|
55 |
Goal "H <#> K = {c . \\<exists>h\\<in>H. \\<exists>k\\<in>K. c = h ## k}";
|
|
56 |
by (simp_tac
|
|
57 |
(simpset() addsimps [setprod_def, set_prod_def, binop_def, image_def]) 1);
|
|
58 |
qed "set_prod_eq";
|
|
59 |
|
|
60 |
Goal "[| M <= carrier G; g\\<in>carrier G; h\\<in>carrier G |] \
|
|
61 |
\ ==> (M #> g) #> h = M #> (g ## h)";
|
|
62 |
by (force_tac (claset(), simpset() addsimps [r_coset_eq, binop_assoc]) 1);
|
|
63 |
qed "coset_mul_assoc";
|
|
64 |
|
|
65 |
Goal "[| M <= carrier G |] ==> M #> e = M";
|
|
66 |
by (force_tac (claset(), simpset() addsimps [r_coset_eq]) 1);
|
|
67 |
qed "coset_mul_e";
|
|
68 |
|
|
69 |
Goal "[| M #> (x ## (i y)) = M; x \\<in> carrier G ; y \\<in> carrier G;\
|
|
70 |
\ M <= carrier G |] ==> M #> x = M #> y";
|
|
71 |
by (eres_inst_tac [("P","%z. M #> x = z #> y")] subst 1);
|
|
72 |
by (asm_simp_tac (simpset() addsimps [coset_mul_assoc, binop_assoc]) 1);
|
|
73 |
qed "coset_mul_inv1";
|
|
74 |
|
|
75 |
Goal "[| M #> x = M #> y; x \\<in> carrier G; y \\<in> carrier G; M <= carrier G |] \
|
|
76 |
\ ==> M #> (x ## (i y)) = M ";
|
|
77 |
by (afs [coset_mul_assoc RS sym] 1);
|
|
78 |
by (afs [coset_mul_assoc, coset_mul_e] 1);
|
|
79 |
qed "coset_mul_invers2";
|
|
80 |
|
|
81 |
Goal "[| H #> x = H; x \\<in> carrier G; H <<= G |] ==> x\\<in>H";
|
|
82 |
by (etac subst 1);
|
|
83 |
by (simp_tac (simpset() addsimps [r_coset_eq]) 1);
|
|
84 |
by (blast_tac (claset() addIs [e_ax1, subgroup_e_closed]) 1);
|
|
85 |
qed "coset_join1";
|
|
86 |
|
|
87 |
Goal "[| x\\<in>carrier G; H <<= G; x\\<in>H |] ==> H #> x = H";
|
|
88 |
by (auto_tac (claset(), simpset() addsimps [r_coset_eq]));
|
|
89 |
by (res_inst_tac [("x","xa ## (i x)")] bexI 2);
|
|
90 |
by (auto_tac (claset(),
|
|
91 |
simpset() addsimps [subgroup_f_closed, subgroup_inv_closed,
|
|
92 |
binop_assoc, subgroup_imp_subset RS subsetD]));
|
|
93 |
qed "coset_join2";
|
|
94 |
|
|
95 |
Goal "[| H <= carrier G; x\\<in>carrier G |] ==> H #> x <= carrier G";
|
|
96 |
by (auto_tac (claset(), simpset() addsimps [r_coset_eq]));
|
|
97 |
qed "r_coset_subset_G";
|
|
98 |
|
|
99 |
Goal "[| h \\<in> H; H <= carrier G; x \\<in> carrier G|] ==> h ## x \\<in> H #> x";
|
|
100 |
by (auto_tac (claset(), simpset() addsimps [r_coset_eq]));
|
|
101 |
qed "rcosI";
|
|
102 |
|
|
103 |
Goal "[| H <= carrier G; x \\<in> carrier G |] ==> H #> x \\<in> {*H*}";
|
|
104 |
by (auto_tac (claset(), simpset() addsimps [setrcos_eq]));
|
|
105 |
qed "setrcosI";
|
|
106 |
|
|
107 |
|
|
108 |
Goal "[| x ## y = z; x \\<in> carrier G; y \\<in> carrier G; z\\<in>carrier G |] \
|
|
109 |
\ ==> (i x) ## z = y";
|
|
110 |
by (Clarify_tac 1);
|
|
111 |
by (asm_simp_tac (simpset() addsimps [binop_assoc RS sym]) 1);
|
|
112 |
qed "transpose_inv";
|
|
113 |
|
|
114 |
|
|
115 |
Goal "[| y \\<in> H #> x; x \\<in> carrier G; H <<= G |] ==> H #> x = H #> y";
|
|
116 |
by (auto_tac (claset(),
|
|
117 |
simpset() addsimps [r_coset_eq, binop_assoc RS sym,
|
|
118 |
right_cancellation_iff, subgroup_imp_subset RS subsetD,
|
|
119 |
subgroup_f_closed]));
|
|
120 |
by (res_inst_tac [("x","ha ## i h")] bexI 1);
|
|
121 |
by (auto_tac (claset(),
|
|
122 |
simpset() addsimps [binop_assoc, subgroup_imp_subset RS subsetD,
|
|
123 |
subgroup_inv_closed, subgroup_f_closed]));
|
|
124 |
qed "repr_independence";
|
|
125 |
|
|
126 |
Goal "[| x \\<in> carrier G; H <<= G |] ==> x \\<in> H #> x";
|
|
127 |
by (simp_tac (simpset() addsimps [r_coset_eq]) 1);
|
|
128 |
by (blast_tac (claset() addIs [e_ax1, subgroup_imp_subset RS subsetD,
|
|
129 |
subgroup_e_closed]) 1);
|
|
130 |
qed "rcos_self";
|
|
131 |
|
|
132 |
Goal "setinv H = INV`H";
|
|
133 |
by (simp_tac
|
|
134 |
(simpset() addsimps [image_def, setinv_def, set_inv_def, inv_def]) 1);
|
|
135 |
qed "setinv_eq_image_inv";
|
|
136 |
|
|
137 |
|
|
138 |
(*** normal subgroups ***)
|
|
139 |
|
|
140 |
Goal "(H <| G) = (H <<= G & (\\<forall>x \\<in> carrier G. H #> x = x <# H))";
|
|
141 |
by (afs [thm "lcos_def", thm "rcos_def", normal_def] 1);
|
|
142 |
qed "normal_iff";
|
|
143 |
|
|
144 |
Goal "H <| G ==> H <<= G";
|
|
145 |
by (afs [normal_def] 1);
|
|
146 |
qed "normal_imp_subgroup";
|
|
147 |
|
|
148 |
Goal "[| H <| G; x \\<in> carrier G |] ==> H #> x = x <# H";
|
|
149 |
by (afs [thm "lcos_def", thm "rcos_def", normal_def] 1);
|
|
150 |
qed "normal_imp_rcos_eq_lcos";
|
|
151 |
|
|
152 |
Goal "\\<lbrakk>H \\<lhd> G; x \\<in> (G .<cr>); h \\<in> H\\<rbrakk> \\<Longrightarrow> i x ## h ## x \\<in> H";
|
|
153 |
by (auto_tac (claset(),
|
|
154 |
simpset() addsimps [l_coset_eq, r_coset_eq, normal_iff]));
|
|
155 |
by (ball_tac 1);
|
|
156 |
by (dtac (equalityD1 RS subsetD) 1);
|
|
157 |
by (Blast_tac 1);
|
|
158 |
by (Clarify_tac 1);
|
|
159 |
by (etac subst 1);
|
|
160 |
by (asm_simp_tac
|
|
161 |
(simpset() addsimps [binop_assoc RS sym, subgroup_imp_subset RS subsetD]) 1);
|
|
162 |
qed "normal_inv_op_closed1";
|
|
163 |
|
|
164 |
Goal "\\<lbrakk>H \\<lhd> G; x \\<in> (G .<cr>); h \\<in> H\\<rbrakk> \\<Longrightarrow> x ## h ## i x \\<in> H";
|
|
165 |
by (dres_inst_tac [("x","i x")] normal_inv_op_closed1 1);
|
|
166 |
by Auto_tac;
|
|
167 |
qed "normal_inv_op_closed2";
|
|
168 |
|
|
169 |
Goal "[| M <= carrier G; g\\<in>carrier G; h\\<in>carrier G |] \
|
|
170 |
\ ==> g <# (h <# M) = (g ## h) <# M";
|
|
171 |
by (force_tac (claset(), simpset() addsimps [l_coset_eq, binop_assoc]) 1);
|
|
172 |
qed "lcos_mul_assoc";
|
|
173 |
|
|
174 |
Goal "M <= carrier G ==> e <# M = M";
|
|
175 |
by (force_tac (claset(), simpset() addsimps [l_coset_eq]) 1);
|
|
176 |
qed "lcos_mul_e";
|
|
177 |
|
|
178 |
Goal "[| H <= carrier G; x\\<in>carrier G |]\
|
|
179 |
\ ==> x <# H <= carrier G";
|
|
180 |
by (auto_tac (claset(), simpset() addsimps [l_coset_eq, subsetD]));
|
|
181 |
qed "lcosetGaH_subset_G";
|
|
182 |
|
|
183 |
Goal "[| y \\<in> x <# H; x \\<in> carrier G; H <<= G |] ==> x <# H = y <# H";
|
|
184 |
by (auto_tac (claset(),
|
|
185 |
simpset() addsimps [l_coset_eq, binop_assoc,
|
|
186 |
left_cancellation_iff, subgroup_imp_subset RS subsetD,
|
|
187 |
subgroup_f_closed]));
|
|
188 |
by (res_inst_tac [("x","i h ## ha")] bexI 1);
|
|
189 |
by (auto_tac (claset(),
|
|
190 |
simpset() addsimps [binop_assoc RS sym, subgroup_imp_subset RS subsetD,
|
|
191 |
subgroup_inv_closed, subgroup_f_closed]));
|
|
192 |
qed "l_repr_independence";
|
|
193 |
|
|
194 |
Goal "[| H1 <= carrier G; H2 <= carrier G |] ==> H1 <#> H2 <= carrier G";
|
|
195 |
by (auto_tac (claset(), simpset() addsimps [set_prod_eq, subsetD]));
|
|
196 |
qed "setprod_subset_G";
|
|
197 |
val set_prod_subset_G = export setprod_subset_G;
|
|
198 |
|
|
199 |
Goal "H <<= G ==> H <#> H = H";
|
|
200 |
by (auto_tac (claset(),
|
|
201 |
simpset() addsimps [set_prod_eq, Sigma_def,image_def]));
|
|
202 |
by (res_inst_tac [("x","x")] bexI 2);
|
|
203 |
by (res_inst_tac [("x","e")] bexI 2);
|
|
204 |
by (auto_tac (claset(),
|
|
205 |
simpset() addsimps [subgroup_f_closed, subgroup_e_closed, e_ax2,
|
|
206 |
subgroup_imp_subset RS subsetD]));
|
|
207 |
qed "subgroup_prod_id";
|
|
208 |
val Subgroup_prod_id = export subgroup_prod_id;
|
|
209 |
|
|
210 |
|
|
211 |
(* set of inverses of an r_coset *)
|
|
212 |
Goal "[| H <| G; x \\<in> carrier G |] ==> I(H #> x) = H #>(i x)";
|
|
213 |
by (ftac normal_imp_subgroup 1);
|
|
214 |
by (auto_tac (claset(),
|
|
215 |
simpset() addsimps [r_coset_eq, setinv_eq_image_inv, image_def]));
|
|
216 |
by (res_inst_tac [("x","i x ## i h ## x")] bexI 1);
|
|
217 |
by (asm_simp_tac (simpset() addsimps [binop_assoc, inv_prod,
|
|
218 |
subgroup_imp_subset RS subsetD]) 1);
|
|
219 |
by (res_inst_tac [("x","i(h ## i x)")] exI 2);
|
|
220 |
by (asm_simp_tac (simpset() addsimps [inv_inv, inv_prod,
|
|
221 |
subgroup_imp_subset RS subsetD]) 2);
|
|
222 |
by (res_inst_tac [("x","x ## i h ## i x")] bexI 2);
|
|
223 |
by (auto_tac (claset(),
|
|
224 |
simpset() addsimps [normal_inv_op_closed1, normal_inv_op_closed2,
|
|
225 |
binop_assoc, subgroup_imp_subset RS subsetD,
|
|
226 |
subgroup_inv_closed]));
|
|
227 |
qed "rcos_inv";
|
|
228 |
val r_coset_inv = export rcos_inv;
|
|
229 |
|
|
230 |
Goal "[| H <| G; H1\\<in>{*H*}; x \\<in> H1 |] ==> I(H1) = H #> (i x)";
|
|
231 |
by (afs [setrcos_eq] 1);
|
|
232 |
by (Clarify_tac 1);
|
|
233 |
by (subgoal_tac "x : carrier G" 1);
|
|
234 |
by (rtac subsetD 2);
|
|
235 |
by (assume_tac 3);
|
|
236 |
by (asm_full_simp_tac (simpset() addsimps [r_coset_subset_G,
|
|
237 |
subgroup_imp_subset,normal_imp_subgroup]) 2);
|
|
238 |
by (dtac repr_independence 1);
|
|
239 |
by (assume_tac 1);
|
|
240 |
by (etac normal_imp_subgroup 1);
|
|
241 |
by (asm_simp_tac (simpset() addsimps [rcos_inv]) 1);
|
|
242 |
qed "rcos_inv2";
|
|
243 |
val r_coset_inv2 = export rcos_inv2;
|
|
244 |
|
|
245 |
|
|
246 |
|
|
247 |
(* some rules for <#> with #> or <# *)
|
|
248 |
Goal "[| H1 <= carrier G; H2 <= carrier G; x \\<in> carrier G |]\
|
|
249 |
\ ==> H1 <#> (H2 #> x) = (H1 <#> H2) #> x";
|
|
250 |
by (auto_tac (claset(),
|
|
251 |
simpset() addsimps [rcos_def, r_coset_def,
|
|
252 |
setprod_def, set_prod_def, Sigma_def,image_def]));
|
|
253 |
by (auto_tac (claset() addSIs [bexI,exI],
|
|
254 |
simpset() addsimps [binop_assoc, subsetD]));
|
|
255 |
qed "setprod_rcos_assoc";
|
|
256 |
val set_prod_r_coset_assoc = export setprod_rcos_assoc;
|
|
257 |
|
|
258 |
Goal "[| H1 <= carrier G; H2 <= carrier G; x \\<in> carrier G |]\
|
|
259 |
\ ==> (H1 #> x) <#> H2 = H1 <#> (x <# H2)";
|
|
260 |
by (asm_simp_tac
|
|
261 |
(simpset() addsimps [rcos_def, r_coset_def, lcos_def, l_coset_def,
|
|
262 |
setprod_def, set_prod_def, Sigma_def,image_def]) 1);
|
|
263 |
by (force_tac (claset() addSIs [bexI,exI],
|
|
264 |
simpset() addsimps [binop_assoc, subsetD]) 1);
|
|
265 |
qed "rcos_prod_assoc_lcos";
|
|
266 |
val rcoset_prod_assoc_lcoset = export rcos_prod_assoc_lcos;
|
|
267 |
|
|
268 |
|
|
269 |
(* product of rcosets *)
|
|
270 |
(* To show H x H y = H x y. which is done by
|
|
271 |
H x H y =1= H (x H) y =2= H (H x) y =3= H H x y =4= H x y *)
|
|
272 |
|
|
273 |
Goal "[| H <| G; x \\<in> carrier G; y \\<in> carrier G |]\
|
|
274 |
\ ==> (H #> x) <#> (H #> y) = (H <#> (x <# H)) #> y";
|
|
275 |
by (afs [setprod_rcos_assoc, normal_imp_subgroup RS subgroup_imp_subset, r_coset_subset_G,
|
|
276 |
lcosetGaH_subset_G, rcos_prod_assoc_lcos] 1);
|
|
277 |
qed "rcos_prod_step1";
|
|
278 |
|
|
279 |
Goal "[| H <| G; x \\<in> carrier G; y \\<in> carrier G |]\
|
|
280 |
\ ==> (H <#> (x <# H)) #> y = (H <#> (H #> x)) #> y";
|
|
281 |
by (afs [normal_imp_rcos_eq_lcos] 1);
|
|
282 |
qed "rcos_prod_step2";
|
|
283 |
|
|
284 |
Goal "[| H <| G; x \\<in> carrier G; y \\<in> carrier G |]\
|
|
285 |
\ ==> (H <#> (H #> x)) #> y = H #> (x ## y)";
|
11443
|
286 |
by (afs [setprod_rcos_assoc,normal_imp_subgroup RS subgroup_imp_subset,
|
|
287 |
r_coset_subset_G, coset_mul_assoc, setprod_subset_G,
|
|
288 |
normal_imp_subgroup RS subgroup_imp_subset,subgroup_prod_id,
|
|
289 |
normal_imp_subgroup] 1);
|
11394
|
290 |
qed "rcos_prod_step3";
|
|
291 |
|
|
292 |
Goal "[| H <| G; x \\<in> carrier G; y \\<in> carrier G |]\
|
|
293 |
\ ==> (H #> x) <#> (H #> y) = H #> (x ## y)";
|
|
294 |
by (afs [rcos_prod_step1,rcos_prod_step2,rcos_prod_step3] 1);
|
|
295 |
qed "rcos_prod";
|
|
296 |
val rcoset_prod = export rcos_prod;
|
|
297 |
|
|
298 |
(* operations on cosets *)
|
|
299 |
Goal "[| H <| G; H1 \\<in> {*H*}; H2 \\<in> {*H*} |] ==> H1 <#> H2 \\<in> {*H*}";
|
|
300 |
by (auto_tac (claset(),
|
|
301 |
simpset() addsimps [normal_imp_subgroup RS subgroup_imp_subset,
|
|
302 |
rcos_prod, setrcos_eq]));
|
|
303 |
qed "setprod_closed";
|
|
304 |
|
|
305 |
Goal "[| H <| G; H1 \\<in> {*H*} |] ==> I(H1) \\<in> {*H*}";
|
|
306 |
by (auto_tac (claset(),
|
|
307 |
simpset() addsimps [normal_imp_subgroup RS subgroup_imp_subset,
|
|
308 |
rcos_inv, setrcos_eq]));
|
|
309 |
qed "setinv_closed";
|
|
310 |
|
|
311 |
Goal "H <<= G ==> H \\<in> {*H*}";
|
|
312 |
by (simp_tac (simpset() addsimps [setrcos_eq]) 1);
|
|
313 |
by (blast_tac (claset() delrules [equalityI]
|
|
314 |
addSIs [subgroup_e_closed, e_closed, coset_join2 RS sym]) 1);
|
|
315 |
qed "setrcos_unit_closed";
|
|
316 |
|
11443
|
317 |
Goal "[|H <| G; M \\<in> {*H*}|] ==> I M <#> M = H";
|
|
318 |
by (asm_full_simp_tac (simpset() addsimps [setrcos_eq]) 1);
|
|
319 |
by (Clarify_tac 1);
|
|
320 |
by (asm_simp_tac
|
|
321 |
(simpset() addsimps [rcos_inv, rcos_prod, normal_imp_subgroup,
|
|
322 |
subgroup_imp_subset, coset_mul_e]) 1);
|
|
323 |
qed "setrcos_inv_prod_eq";
|
|
324 |
|
|
325 |
(*generalizes subgroup_prod_id*)
|
|
326 |
Goal "[|H <| G; M \\<in> {*H*}|] ==> H <#> M = M";
|
|
327 |
by (asm_full_simp_tac (simpset() addsimps [setrcos_eq]) 1);
|
|
328 |
by (Clarify_tac 1);
|
|
329 |
by (asm_simp_tac
|
|
330 |
(simpset() addsimps [normal_imp_subgroup, subgroup_imp_subset,
|
|
331 |
setprod_rcos_assoc, subgroup_prod_id]) 1);
|
|
332 |
qed "setrcos_prod_eq";
|
|
333 |
|
|
334 |
Goal "[|H <| G; M1 \\<in> {*H*}; M2 \\<in> {*H*}; M3 \\<in> {*H*}|] \
|
|
335 |
\ ==> M1 <#> M2 <#> M3 = M1 <#> (M2 <#> M3)";
|
|
336 |
by (asm_full_simp_tac (simpset() addsimps [setrcos_eq]) 1);
|
|
337 |
by (Clarify_tac 1);
|
|
338 |
by (asm_simp_tac
|
|
339 |
(simpset() addsimps [rcos_prod, normal_imp_subgroup,
|
|
340 |
subgroup_imp_subset, binop_assoc]) 1);
|
|
341 |
qed "setrcos_prod_assoc";
|
|
342 |
|
11394
|
343 |
|
|
344 |
(**** back to Sylow again, i.e. direction Lagrange ****)
|
|
345 |
|
|
346 |
(* Theorems necessary for Lagrange *)
|
|
347 |
|
|
348 |
Goal "H <<= G ==> \\<Union> {*H*} = carrier G";
|
|
349 |
by (rtac equalityI 1);
|
|
350 |
by (force_tac (claset(),
|
|
351 |
simpset() addsimps [subgroup_imp_subset RS subsetD, setrcos_eq, r_coset_eq]) 1);
|
|
352 |
by (auto_tac (claset(),
|
|
353 |
simpset() addsimps [setrcos_eq, subgroup_imp_subset, rcos_self]));
|
|
354 |
qed "setrcos_part_G";
|
|
355 |
|
|
356 |
Goal "[| c \\<in> {*H*}; H <= carrier G; finite (carrier G) |] ==> finite c";
|
|
357 |
by (auto_tac (claset(), simpset() addsimps [setrcos_eq]));
|
|
358 |
by (asm_simp_tac (simpset() addsimps [r_coset_subset_G RS finite_subset]) 1);
|
|
359 |
qed "cosets_finite";
|
|
360 |
|
|
361 |
Goal "[| c \\<in> {*H*}; H <= carrier G; finite(carrier G) |] ==> card c = card H";
|
|
362 |
by (auto_tac (claset(), simpset() addsimps [setrcos_eq]));
|
|
363 |
by (res_inst_tac [("f", "%y. y ## i a"), ("g","%y. y ## a")] card_bij_eq 1);
|
|
364 |
by (afs [r_coset_subset_G RS finite_subset] 1);
|
|
365 |
by (blast_tac (claset() addIs [finite_subset]) 1);
|
|
366 |
(* injective maps *)
|
|
367 |
by (blast_tac (claset() addIs [restrictI, rcosI]) 3);
|
|
368 |
by (force_tac (claset(),
|
|
369 |
simpset() addsimps [inj_on_def, right_cancellation_iff, subsetD]) 3);
|
|
370 |
(*now for f*)
|
|
371 |
by (force_tac (claset(),
|
|
372 |
simpset() addsimps [binop_assoc, subsetD, r_coset_eq]) 1);
|
|
373 |
(* injective *)
|
|
374 |
by (rtac inj_onI 1);
|
|
375 |
by (subgoal_tac "x \\<in> carrier G & y \\<in> carrier G" 1);
|
|
376 |
by (blast_tac (claset() addIs [r_coset_subset_G RS subsetD]) 2);
|
|
377 |
by (rotate_tac ~1 1);
|
|
378 |
by (asm_full_simp_tac
|
|
379 |
(simpset() addsimps [right_cancellation_iff, subsetD]) 1);
|
|
380 |
qed "card_cosets_equal";
|
|
381 |
|
|
382 |
|
|
383 |
(** Two distinct right cosets are disjoint **)
|
|
384 |
|
|
385 |
Goal "[|H <<= G; a \\<in> (G .<cr>); b \\<in> (G .<cr>); ha ## a = h ## b; \
|
|
386 |
\ h \\<in> H; ha \\<in> H; hb \\<in> H|] \
|
|
387 |
\ ==> \\<exists>h\\<in>H. h ## b = hb ## a";
|
|
388 |
by (res_inst_tac [("x","hb ## ((i ha) ## h)")] bexI 1);
|
|
389 |
by (afs [subgroup_f_closed, subgroup_inv_closed] 2);
|
|
390 |
by (asm_simp_tac (simpset() addsimps [binop_assoc, left_cancellation_iff,
|
|
391 |
transpose_inv, subgroup_imp_subset RS subsetD]) 1);
|
|
392 |
qed "rcos_equation";
|
|
393 |
|
|
394 |
Goal "[|H <<= G; c1 \\<in> {*H*}; c2 \\<in> {*H*}; c1 \\<noteq> c2|] ==> c1 \\<inter> c2 = {}";
|
|
395 |
by (asm_full_simp_tac (simpset() addsimps [setrcos_eq, r_coset_eq]) 1);
|
|
396 |
by (blast_tac (claset() addIs [rcos_equation, sym]) 1);
|
|
397 |
qed "rcos_disjoint";
|
|
398 |
|
|
399 |
Goal "H <<= G ==> {*H*} <= Pow(carrier G)";
|
|
400 |
by (simp_tac (simpset() addsimps [setrcos_eq]) 1);
|
|
401 |
by (blast_tac (claset() addDs [r_coset_subset_G,subgroup_imp_subset]) 1);
|
|
402 |
qed "setrcos_subset_PowG";
|
|
403 |
|
|
404 |
Goal "[| finite(carrier G); H <<= G |]\
|
|
405 |
\ ==> card({*H*}) * card(H) = order(G)";
|
|
406 |
by (asm_simp_tac (simpset() addsimps [order_def, setrcos_part_G RS sym]) 1);
|
|
407 |
by (stac mult_commute 1);
|
|
408 |
by (rtac card_partition 1);
|
|
409 |
by (asm_full_simp_tac
|
|
410 |
(simpset() addsimps [setrcos_subset_PowG RS finite_subset]) 1);
|
|
411 |
by (asm_full_simp_tac (simpset() addsimps [setrcos_part_G]) 1);
|
|
412 |
by (asm_full_simp_tac
|
|
413 |
(simpset() addsimps [card_cosets_equal, subgroup_def]) 1);
|
|
414 |
by (asm_full_simp_tac (simpset() addsimps [rcos_disjoint, subgroup_def]) 1);
|
|
415 |
qed "lagrange";
|
|
416 |
val Lagrange = export lagrange;
|
|
417 |
|
|
418 |
Close_locale "coset";
|
|
419 |
Close_locale "group";
|
|
420 |
|
|
421 |
|
|
422 |
|