author | nipkow |
Mon, 13 May 2002 15:27:28 +0200 | |
changeset 13145 | 59bc43b51aa2 |
parent 12459 | 6978ab7cac64 |
child 13572 | 1681c5b58766 |
permissions | -rw-r--r-- |
11394 | 1 |
(* Title: HOL/GroupTheory/Sylow |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
2 |
ID: $Id$ |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
3 |
Author: Florian Kammueller, with new proofs by L C Paulson |
11394 | 4 |
Copyright 1998-2001 University of Cambridge |
5 |
||
6 |
Sylow's theorem using locales (combinatorial argument in Exponent.thy) |
|
11443 | 7 |
|
8 |
See Florian Kamm\"uller and L. C. Paulson, |
|
9 |
A Formal Proof of Sylow's theorem: |
|
10 |
An Experiment in Abstract Algebra with Isabelle HOL |
|
11 |
J. Automated Reasoning 23 (1999), 235-264 |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
12 |
*) |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
13 |
|
11394 | 14 |
Open_locale "sylow"; |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
15 |
|
11394 | 16 |
val prime_p = thm "prime_p"; |
17 |
val order_G = thm "order_G"; |
|
18 |
val finite_G = thm "finite_G"; |
|
19 |
val calM_def = thm "calM_def"; |
|
20 |
val RelM_def = thm "RelM_def"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
21 |
|
11394 | 22 |
AddIffs [finite_G]; |
23 |
Addsimps [coset_mul_e]; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
24 |
|
11394 | 25 |
Goalw [refl_def, RelM_def] "refl calM RelM"; |
26 |
by Auto_tac; |
|
27 |
by (asm_full_simp_tac (simpset() addsimps [calM_def]) 1); |
|
28 |
by (res_inst_tac [("x","e")] bexI 1); |
|
29 |
by (auto_tac (claset(), simpset() addsimps [e_closed])); |
|
30 |
qed "RelM_refl"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
31 |
|
11394 | 32 |
Goalw [sym_def, RelM_def] "sym RelM"; |
33 |
by Auto_tac; |
|
34 |
by (res_inst_tac [("x","i g")] bexI 1); |
|
35 |
by (etac inv_closed 2); |
|
36 |
by (asm_full_simp_tac |
|
37 |
(simpset() addsimps [coset_mul_assoc, calM_def, inv_closed]) 1); |
|
38 |
qed "RelM_sym"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
39 |
|
11394 | 40 |
Goalw [trans_def, RelM_def] "trans RelM"; |
41 |
by Auto_tac; |
|
42 |
by (res_inst_tac [("x","ga ## g")] bexI 1); |
|
43 |
by (ALLGOALS (asm_full_simp_tac |
|
44 |
(simpset() addsimps [coset_mul_assoc, calM_def, binop_closed]))); |
|
45 |
qed "RelM_trans"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
46 |
|
11394 | 47 |
Goalw [equiv_def] "equiv calM RelM"; |
48 |
by (blast_tac (claset() addIs [RelM_refl, RelM_sym, RelM_trans]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
49 |
qed "RelM_equiv"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
50 |
|
11394 | 51 |
Goalw [RelM_def] "M \\<in> calM // RelM ==> M <= calM"; |
52 |
by (blast_tac (claset() addSEs [quotientE]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
53 |
qed "M_subset_calM_prep"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
54 |
|
11394 | 55 |
(*** Central Part of the Proof ***) |
56 |
||
57 |
Open_locale "sylow_central"; |
|
58 |
||
59 |
val M_in_quot = thm "M_in_quot"; |
|
60 |
val not_dvd_M = thm "not_dvd_M"; |
|
61 |
val M1_in_M = thm "M1_in_M"; |
|
62 |
val H_def = thm "H_def"; |
|
63 |
||
64 |
Goal "M <= calM"; |
|
65 |
by (rtac (M_in_quot RS M_subset_calM_prep) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
66 |
qed "M_subset_calM"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
67 |
|
11394 | 68 |
Goal "card(M1) = p^a"; |
69 |
by (cut_facts_tac [M_subset_calM, M1_in_M] 1); |
|
70 |
by (asm_full_simp_tac (simpset() addsimps [calM_def]) 1); |
|
71 |
by (Blast_tac 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
72 |
qed "card_M1"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
73 |
|
11394 | 74 |
Goal "\\<exists>x. x\\<in>M1"; |
75 |
by (rtac (card_nonempty RS NotEmpty_ExEl) 1); |
|
12196 | 76 |
by (cut_facts_tac [prime_p RS prime_imp_one_less] 1); |
77 |
by (asm_simp_tac (simpset() addsimps [card_M1]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
78 |
qed "exists_x_in_M1"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
79 |
|
11394 | 80 |
Goal "M1 <= carrier G"; |
81 |
by (rtac (subsetD RS PowD) 1); |
|
82 |
by (rtac M1_in_M 2); |
|
83 |
by (rtac (M_subset_calM RS subset_trans) 1); |
|
84 |
by (auto_tac (claset(), simpset() addsimps [calM_def])); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
85 |
qed "M1_subset_G"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
86 |
|
11394 | 87 |
Goal "\\<exists>f \\<in> H\\<rightarrow>M1. inj_on f H"; |
88 |
by (rtac (exists_x_in_M1 RS exE) 1); |
|
12459
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
12196
diff
changeset
|
89 |
by (res_inst_tac [("x", "%z: H. x ## z")] bexI 1); |
11394 | 90 |
by (rtac restrictI 2); |
91 |
by (asm_full_simp_tac (simpset() addsimps [H_def]) 2); |
|
92 |
by (Clarify_tac 2); |
|
93 |
by (etac subst 2); |
|
94 |
by (asm_full_simp_tac (simpset() addsimps [rcosI, M1_subset_G]) 2); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
95 |
by (rtac inj_onI 1); |
11394 | 96 |
by (rtac left_cancellation 1); |
97 |
by (auto_tac (claset(), simpset() addsimps [H_def, M1_subset_G RS subsetD])); |
|
98 |
qed "M1_inj_H"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
99 |
|
11394 | 100 |
Goal "{} \\<notin> calM // RelM"; |
101 |
by (blast_tac (claset() addSEs [quotientE] |
|
102 |
addDs [RelM_equiv RS equiv_class_self]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
103 |
qed "EmptyNotInEquivSet"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
104 |
|
11394 | 105 |
Goal "\\<exists>M1. M1\\<in>M"; |
106 |
by (cut_facts_tac [M_in_quot, EmptyNotInEquivSet] 1); |
|
107 |
by (blast_tac (claset() addIs [NotEmpty_ExEl]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
108 |
qed "existsM1inM"; |
11394 | 109 |
val ExistsM1inM = Export existsM1inM; |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
110 |
|
11394 | 111 |
Goalw [order_def] "0 < order(G)"; |
112 |
by (cut_facts_tac [e_closed] 1); |
|
113 |
by (blast_tac (claset() addIs [zero_less_card_empty]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
114 |
qed "zero_less_o_G"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
115 |
|
11394 | 116 |
Goal "0 < m"; |
117 |
by (cut_facts_tac [zero_less_o_G] 1); |
|
118 |
by (asm_full_simp_tac (simpset() addsimps [order_G]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
119 |
qed "zero_less_m"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
120 |
|
11394 | 121 |
Goal "card(calM) = (p^a) * m choose p^a"; |
122 |
by (simp_tac (simpset() addsimps [calM_def, n_subsets, |
|
123 |
order_G RS sym, order_def]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
124 |
qed "card_calM"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
125 |
|
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
126 |
Goal "0 < card calM"; |
11394 | 127 |
by (simp_tac (simpset() addsimps [card_calM, zero_less_binomial, |
128 |
le_extend_mult, zero_less_m]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
129 |
qed "zero_less_card_calM"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
130 |
|
11468 | 131 |
Goal "~ (p ^ Suc(exponent p m) dvd card(calM))"; |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
132 |
by (subgoal_tac "exponent p m = exponent p (card calM)" 1); |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
133 |
by (asm_full_simp_tac (simpset() addsimps [card_calM, |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
134 |
zero_less_m RS const_p_fac]) 2); |
11394 | 135 |
by (cut_facts_tac [zero_less_card_calM, prime_p] 1); |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
136 |
by (force_tac (claset() addDs [power_Suc_exponent_Not_dvd], simpset()) 1); |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
137 |
qed "max_p_div_calM"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
138 |
|
11394 | 139 |
Goalw [calM_def] "finite calM"; |
140 |
by (res_inst_tac [("B", "Pow (carrier G)")] finite_subset 1); |
|
141 |
by Auto_tac; |
|
142 |
qed "finite_calM"; |
|
143 |
||
11468 | 144 |
Goal "\\<exists>M \\<in> calM // RelM. ~ (p ^ Suc(exponent p m) dvd card(M))"; |
11394 | 145 |
by (rtac (max_p_div_calM RS contrapos_np) 1); |
146 |
by (asm_full_simp_tac (simpset() addsimps [finite_calM, |
|
147 |
RelM_equiv RSN(2, equiv_imp_dvd_card)]) 1); |
|
148 |
qed "lemma_A1"; |
|
149 |
val Lemma_A1 = Export lemma_A1; |
|
150 |
||
151 |
Goal "x \\<in> H ==> x \\<in> carrier G"; |
|
152 |
by (afs [H_def] 1); |
|
153 |
qed "H_into_carrier_G"; |
|
154 |
||
155 |
Goal "g : H ==> M1 #> g = M1"; |
|
156 |
by (asm_full_simp_tac (simpset() addsimps [H_def]) 1); |
|
157 |
qed "in_H_imp_eq"; |
|
158 |
||
159 |
Goalw [H_def] "[| x\\<in>H; xa\\<in>H|] ==> x ## xa\\<in>H"; |
|
160 |
by (asm_full_simp_tac (simpset() addsimps [coset_mul_assoc RS sym, |
|
161 |
binop_closed, M1_subset_G]) 1); |
|
162 |
qed "bin_op_closed_lemma"; |
|
163 |
||
164 |
Goal "H \\<noteq> {}"; |
|
165 |
by (asm_full_simp_tac (simpset() addsimps [H_def]) 1); |
|
166 |
by (res_inst_tac [("x","e")] exI 1); |
|
167 |
by (asm_full_simp_tac (simpset() addsimps [e_closed, M1_subset_G]) 1); |
|
168 |
qed "H_not_empty"; |
|
169 |
||
170 |
Goal "H <<= G"; |
|
171 |
by (rtac subgroupI 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
172 |
by (rtac subsetI 1); |
11394 | 173 |
by (etac H_into_carrier_G 1); |
174 |
by (rtac H_not_empty 1); |
|
175 |
by (afs [H_def, inv_closed] 1); |
|
176 |
by (Clarify_tac 1); |
|
177 |
by (eres_inst_tac [("P","%z. z #> i a = M1")] subst 1); |
|
178 |
by (asm_simp_tac (simpset() addsimps [coset_mul_assoc, inv_closed, |
|
179 |
inv_ax1, coset_mul_e, M1_subset_G]) 1); |
|
180 |
by (blast_tac (claset() addIs [bin_op_closed_lemma]) 1); |
|
181 |
qed "H_is_SG"; |
|
182 |
val H_is_subgroup = Export H_is_SG; |
|
183 |
||
184 |
Goal "[| g\\<in>carrier G; x\\<in>M1 #> g |] ==> x\\<in>carrier G"; |
|
185 |
by (rtac (r_coset_subset_G RS subsetD) 1); |
|
186 |
by (assume_tac 3); |
|
187 |
by (assume_tac 2); |
|
188 |
by (rtac M1_subset_G 1); |
|
189 |
qed "rcosetGM1g_subset_G"; |
|
190 |
||
191 |
Goal "finite M1"; |
|
192 |
by (rtac ([ M1_subset_G, finite_G] MRS finite_subset) 1); |
|
193 |
qed "finite_M1"; |
|
194 |
||
195 |
Goal "g\\<in>carrier G ==> finite (M1 #> g)"; |
|
196 |
by (rtac finite_subset 1); |
|
197 |
by (rtac subsetI 1); |
|
198 |
by (etac rcosetGM1g_subset_G 1); |
|
199 |
by (assume_tac 1); |
|
200 |
by (rtac finite_G 1); |
|
201 |
qed "finite_rcosetGM1g"; |
|
202 |
||
203 |
Goal "g\\<in>carrier G ==> card(M1 #> g) = card(M1)"; |
|
204 |
by (asm_simp_tac |
|
205 |
(simpset() addsimps [M1_subset_G, card_cosets_equal, setrcosI]) 1); |
|
206 |
qed "M1_cardeq_rcosetGM1g"; |
|
207 |
||
208 |
Goal "g \\<in> carrier G ==> (M1, M1 #> g) \\<in> RelM"; |
|
209 |
by (simp_tac (simpset() addsimps [RelM_def,calM_def,card_M1,M1_subset_G]) 1); |
|
210 |
by (rtac conjI 1); |
|
211 |
by (blast_tac (claset() addIs [rcosetGM1g_subset_G]) 1); |
|
212 |
by (asm_simp_tac (simpset() addsimps [card_M1, M1_cardeq_rcosetGM1g]) 1); |
|
213 |
by (res_inst_tac [("x","i g")] bexI 1); |
|
214 |
by (asm_full_simp_tac (simpset() addsimps [coset_mul_assoc, M1_subset_G, |
|
215 |
inv_closed, inv_ax1]) 1); |
|
216 |
by (asm_simp_tac (simpset() addsimps [inv_closed]) 1); |
|
217 |
qed "M1_RelM_rcosetGM1g"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
218 |
|
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
219 |
|
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
220 |
|
11394 | 221 |
(*** A pair of injections between M and {*H*} shows their cardinalities are |
222 |
equal ***) |
|
223 |
||
224 |
Goal "M2 \\<in> M ==> \\<exists>g. g \\<in> carrier G & M1 #> g = M2"; |
|
225 |
by (cut_facts_tac [M1_in_M, M_in_quot RS (RelM_equiv RS ElemClassEquiv)] 1); |
|
226 |
by (asm_full_simp_tac (simpset() addsimps [RelM_def]) 1); |
|
227 |
by (blast_tac (claset() addSDs [bspec]) 1); |
|
228 |
qed "M_elem_map"; |
|
229 |
||
230 |
val M_elem_map_carrier = M_elem_map RS someI_ex RS conjunct1; |
|
231 |
val M_elem_map_eq = M_elem_map RS someI_ex RS conjunct2; |
|
232 |
||
12459
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
12196
diff
changeset
|
233 |
Goal "(%x:M. H #> (SOME g. g \\<in> carrier G & M1 #> g = x)) \\<in> M \\<rightarrow> {* H *}"; |
11394 | 234 |
by (rtac (setrcosI RS restrictI) 1); |
235 |
by (rtac (H_is_SG RS subgroup_imp_subset) 1); |
|
236 |
by (etac M_elem_map_carrier 1); |
|
237 |
qed "M_funcset_setrcos_H"; |
|
238 |
||
239 |
Goal "\\<exists>f \\<in> M\\<rightarrow>{* H *}. inj_on f M"; |
|
240 |
by (rtac bexI 1); |
|
241 |
by (rtac M_funcset_setrcos_H 2); |
|
242 |
by (rtac inj_onI 1); |
|
243 |
by (Asm_full_simp_tac 1); |
|
244 |
by (rtac ([asm_rl,M_elem_map_eq] MRS trans) 1); |
|
245 |
by (assume_tac 2); |
|
246 |
by (rtac ((M_elem_map_eq RS sym) RS trans) 1); |
|
247 |
by (assume_tac 1); |
|
248 |
by (rtac coset_mul_inv1 1); |
|
249 |
by (REPEAT (etac M_elem_map_carrier 2)); |
|
250 |
by (rtac M1_subset_G 2); |
|
251 |
by (rtac (coset_join1 RS in_H_imp_eq) 1); |
|
252 |
by (rtac H_is_SG 3); |
|
253 |
by (blast_tac (claset() addIs [binop_closed,M_elem_map_carrier,inv_closed]) 2); |
|
254 |
by (asm_full_simp_tac (simpset() addsimps [coset_mul_invers2, H_def, |
|
255 |
M_elem_map_carrier, subset_def]) 1); |
|
256 |
qed "inj_M_GmodH"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
257 |
|
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
258 |
|
11394 | 259 |
(** the opposite injection **) |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
260 |
|
11394 | 261 |
Goal "H1\\<in>{* H *} ==> \\<exists>g. g \\<in> carrier G & H #> g = H1"; |
262 |
by (auto_tac (claset(), simpset() addsimps [setrcos_eq])); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
263 |
qed "H_elem_map"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
264 |
|
11394 | 265 |
val H_elem_map_carrier = H_elem_map RS someI_ex RS conjunct1; |
266 |
val H_elem_map_eq = H_elem_map RS someI_ex RS conjunct2; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
267 |
|
12459
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
12196
diff
changeset
|
268 |
Goal "(%C:{*H*}. M1 #> (@g. g \\<in> (G .<cr>) \\<and> H #> g = C)) \\<in> {* H *} \\<rightarrow> M"; |
11394 | 269 |
by (simp_tac (simpset() addsimps [setrcos_eq]) 1); |
270 |
by (deepen_tac (claset() addIs [someI2] |
|
271 |
addSIs [restrictI, RelM_equiv, M_in_quot, |
|
272 |
M1_RelM_rcosetGM1g RSN (4, EquivElemClass),M1_in_M]) 0 1); |
|
273 |
qed "setrcos_H_funcset_M"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
274 |
|
11394 | 275 |
Goal "\\<exists>g \\<in> {* H *}\\<rightarrow>M. inj_on g ({* H *})"; |
276 |
by (rtac bexI 1); |
|
277 |
by (rtac setrcos_H_funcset_M 2); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
278 |
by (rtac inj_onI 1); |
11394 | 279 |
by (rotate_tac ~2 1); |
280 |
by (Asm_full_simp_tac 1); |
|
281 |
by (rtac ([asm_rl,H_elem_map_eq] MRS trans) 1); |
|
282 |
by (assume_tac 2); |
|
283 |
by (rtac ((H_elem_map_eq RS sym) RS trans) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
284 |
by (assume_tac 1); |
11394 | 285 |
by (rtac coset_mul_inv1 1); |
286 |
by (REPEAT (etac H_elem_map_carrier 2)); |
|
287 |
by (rtac (H_is_SG RS subgroup_imp_subset) 2); |
|
288 |
by (rtac coset_join2 1); |
|
289 |
by (blast_tac (claset() addIs [binop_closed,inv_closed,H_elem_map_carrier]) 1); |
|
290 |
by (rtac H_is_SG 1); |
|
291 |
by (asm_full_simp_tac (simpset() addsimps [H_def, coset_mul_invers2, |
|
292 |
M1_subset_G, H_elem_map_carrier]) 1); |
|
293 |
qed "inj_GmodH_M"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
294 |
|
11394 | 295 |
Goal "calM <= Pow(carrier G)"; |
296 |
by (auto_tac (claset(), simpset() addsimps [calM_def])); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
297 |
qed "calM_subset_PowG"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
298 |
|
11394 | 299 |
|
300 |
Goal "finite M"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
301 |
by (rtac finite_subset 1); |
11394 | 302 |
by (rtac (M_subset_calM RS subset_trans) 1); |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
303 |
by (rtac calM_subset_PowG 1); |
11394 | 304 |
by (Blast_tac 1); |
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
305 |
qed "finite_M"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
306 |
|
11394 | 307 |
Goal "card(M) = card({* H *})"; |
308 |
by (blast_tac (claset() addSIs [inj_M_GmodH,inj_GmodH_M] |
|
309 |
addIs [card_bij, finite_M, H_is_SG, |
|
310 |
setrcos_subset_PowG RS finite_subset, |
|
311 |
finite_Pow_iff RS iffD2]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
312 |
qed "cardMeqIndexH"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
313 |
|
11394 | 314 |
Goal "card(M) * card(H) = order(G)"; |
315 |
by (simp_tac (simpset() addsimps [cardMeqIndexH,lagrange, H_is_SG]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
316 |
qed "index_lem"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
317 |
|
11394 | 318 |
Goal "p^a <= card(H)"; |
319 |
by (rtac ([prime_p,not_dvd_M] MRS div_combine RS dvd_imp_le) 1); |
|
320 |
by (blast_tac (claset() addIs [SG_card1,H_is_SG]) 2); |
|
321 |
by (simp_tac (simpset() addsimps [index_lem,order_G,power_add,mult_dvd_mono, |
|
322 |
power_exponent_dvd,zero_less_m]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
323 |
qed "lemma_leq1"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
324 |
|
11394 | 325 |
Goal "card(H) <= p^a"; |
326 |
by (stac (card_M1 RS sym) 1); |
|
327 |
by (cut_facts_tac [M1_inj_H] 1); |
|
328 |
by (blast_tac (claset() addSIs [M1_subset_G] |
|
329 |
addIs [card_inj, H_into_carrier_G, |
|
330 |
finite_G RSN(2, finite_subset)]) 1); |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
331 |
qed "lemma_leq2"; |
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
332 |
|
11394 | 333 |
Goal "card(H) = p^a"; |
334 |
by (blast_tac (claset() addIs [le_anti_sym, lemma_leq1, lemma_leq2]) 1); |
|
335 |
qed "card_H_eq"; |
|
336 |
val Card_H_eq = Export card_H_eq; |
|
337 |
||
338 |
Close_locale "sylow_central"; |
|
11370
680946254afe
new GroupTheory example, e.g. the Sylow theorem (preliminary version)
paulson
parents:
diff
changeset
|
339 |
|
11394 | 340 |
Goal "\\<exists>H. H <<= G & card(H) = p^a"; |
341 |
by (cut_facts_tac [Lemma_A1] 1); |
|
342 |
by (blast_tac (claset() addDs [ExistsM1inM, H_is_subgroup, Card_H_eq]) 1); |
|
343 |
qed "sylow1"; |
|
344 |
val Sylow1 = export sylow1; |
|
345 |
||
346 |
Close_locale "sylow"; |
|
347 |
Close_locale "coset"; |
|
348 |
Close_locale "group"; |