Update from HH
[Flyspeck/.git] / jHOLLight / Examples / group_sylow-compiled.hl
1 needs "Library/prime.ml";;
2 needs "Examples/seq-compiled.hl";;
3 open Ssrfun;;
4 open Ssrbool;;
5 open Ssrnat;;
6 open Seq;;
7 let group = new_definition `group (G,op,i,e) <=> (!x y. x IN G /\ y IN G ==> op x y IN G) /\
8                 (!x. x IN G ==> i x IN G) /\ e IN G /\
9                 (!x. x IN G ==> op x e = x /\ op e x = x) /\
10                 (!x. x IN G ==> op x (i x) = e /\ op (i x) x = e) /\
11                 (!x y z. x IN G /\ y IN G /\ z IN G ==> op x (op y z) = op (op x y) z)`;;
12 let subgroup = new_definition `subgroup op i H G <=> H SUBSET G /\ ~(H = {}) /\
13                 (!x y. x IN H /\ y IN H ==> op x (i y) IN H)`;;
14 let morphism = new_definition `morphism (f:A->B) op1 op2 G1 G2 <=> 
15         (!x. x IN G1 ==> f x IN G2) /\ 
16         (!x y. x IN G1 /\ y IN G1 ==> f (op1 x y) = op2 (f x) (f y))`;;
17 let normal = new_definition `normal op i H G <=> subgroup op i H G /\ 
18         (!x y. x IN G /\ y IN H ==> op (i x) (op y x) IN H)`;;
19 let coset = new_definition `coset op x H = {op x y | y | y IN H}`;;
20 let cosets = new_definition `cosets op G H = {coset op x H | x | x IN G}`;;
21 let set_op = new_definition `set_op (op:A->A->A) = (\A B. {op x y | x IN A /\ y IN B})`;;
22 let set_op1 = new_definition `set_op1 (i:A->A) = (\A. {i x | x IN A})`;;
23 let conjg = new_definition `conjg (op, i) g x = op (i g) (op x g)`;;
24 let normalizer = new_definition `normalizer op i G H = {g | g IN G /\ set_op1 (conjg (op, i) g) H = H}`;;
25
26 (* Lemma inE *)
27 let inE = Sections.section_proof []
28 `(!p x. x IN {y | p y} <=> p x) /\
29         (!P x. x IN GSPEC (\v. P (SETSPEC v)) <=> P (\p t. p /\ x = t))`
30 [
31    ((repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (done_tac));
32 ];;
33
34 (* Lemma in_trans *)
35 let in_trans = Sections.section_proof ["t";"A";"B"]
36 `A SUBSET B ==> t IN A ==> t IN B`
37 [
38    ((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (exact_tac) THEN (done_tac));
39 ];;
40
41 (* Lemma coset_op *)
42 let coset_op = Sections.section_proof ["op";"x";"H"]
43 `coset op x H = set_op op {x} H`
44 [
45    ((((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] []))))) THEN (move ["y"])) THEN ((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (split_tac));
46    (BETA_TAC THEN (case THEN ((move ["z"]) THEN (case THEN ((move ["zH"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))))));
47    ((((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("z", [])) (term_tac exists_tac))) THEN (done_tac));
48    (BETA_TAC THEN (case THEN (move ["z"])) THEN (case THEN (move ["t"])) THEN (case THEN ((case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["tH"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
49    (((use_arg_then2 ("t", [])) (term_tac exists_tac)) THEN (done_tac));
50 ];;
51
52 (* Lemma set_op1_sing *)
53 let set_op1_sing = Sections.section_proof ["f";"x"]
54 `set_op1 f {x} = {f x}`
55 [
56    ((((((use_arg_then2 ("set_op1", [set_op1]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))))) THEN (move ["a"])) THEN (split_tac));
57    ((BETA_TAC THEN (case THEN (move ["b"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (done_tac));
58    ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
59 ];;
60
61 (* Lemma set_op1_lmul *)
62 let set_op1_lmul = Sections.section_proof ["g";"op"]
63 `set_op1 (op g) = set_op op {g}`
64 [
65    ((((((use_arg_then2 ("set_op1", [set_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq_ext", [eq_ext]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (simp_tac) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["S"]) THEN (move ["a"])) THEN (split_tac));
66    (BETA_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xS"]) THEN (move ["a_eq"]))));
67    ((((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac))) THEN (done_tac));
68    (BETA_TAC THEN (case THEN (move ["x"])) THEN (case THEN (move ["y"])) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["xg"]) THEN (move ["yS"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
69    (((use_arg_then2 ("y", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("yS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("xg", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
70 ];;
71
72 (* Lemma coset_op1 *)
73 let coset_op1 = Sections.section_proof ["op";"x";"H"]
74 `coset (op:A->A->A) x H = set_op1 (op x) H`
75 [
76    (((((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("coset_op", [coset_op]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
77 ];;
78
79 (* Lemma normal_conj *)
80 let normal_conj = Sections.section_proof ["op";"i";"G";"H";"x";"y"]
81 `normal op i H G /\ x IN G /\ y IN H ==> conjg (op, i) x y IN H`
82 [
83    (((((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
84 ];;
85
86 (* Lemma normal_subgroup *)
87 let normal_subgroup = Sections.section_proof ["op";"i";"H";"G"]
88 `normal op i H G ==> subgroup op i H G`
89 [
90    (((((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
91 ];;
92
93 (* Lemma in_subgroup *)
94 let in_subgroup = Sections.section_proof ["op";"i";"H";"G";"x"]
95 `subgroup op i H G ==> x IN H ==> x IN G`
96 [
97    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
98 ];;
99
100 (* Lemma subgroup_subset *)
101 let subgroup_subset = Sections.section_proof ["op";"i";"H";"G"]
102 `subgroup op i H G ==> H SUBSET G`
103 [
104    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
105 ];;
106
107 (* Lemma subgroup_subset_trans *)
108 let subgroup_subset_trans = Sections.section_proof ["op";"i";"H";"K";"G"]
109 `subgroup op i H G ==> H SUBSET K ==> subgroup op i H K`
110 [
111    (((repeat_tactic 1 9 (((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (done_tac));
112 ];;
113
114 (* Lemma normal_subset_trans *)
115 let normal_subset_trans = Sections.section_proof ["op";"i";"H";"K";"G"]
116 `normal op i H G ==> H SUBSET K ==> K SUBSET G ==> normal op i H K`
117 [
118    (((repeat_tactic 1 9 (((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [(`K SUBSET G`)]))))) THEN ALL_TAC THEN (case THEN (move ["subHG"])) THEN (move ["nH"]) THEN (move ["sHK"]) THEN (move ["sKG"]));
119    (((((fun arg_tac -> (use_arg_then2 ("subgroup_subset_trans", [subgroup_subset_trans])) (fun fst_arg -> (use_arg_then2 ("subHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["k"]) THEN (move ["h"]) THEN (case THEN ((move ["kK"]) THEN (move ["hH"]))));
120    (((((use_arg_then2 ("nH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("hH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sKG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
121 ];;
122
123 (* Lemma cosets_full_preimage_sub *)
124 let cosets_full_preimage_sub = Sections.section_proof ["op";"G";"H";"K"]
125 `K SUBSET G ==> K SUBSET {g | g IN G /\ coset op g H IN (cosets op K H)}`
126 [
127    (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))))) THEN (BETA_TAC THEN (move ["sKG"])) THEN (((repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["k"]) THEN (move ["kK"])));
128    (((use_arg_then2 ("k", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("sKG", []))(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac))) THEN ((use_arg_then2 ("k", [])) (term_tac exists_tac)) THEN (done_tac));
129 ];;
130
131 (* Lemma op_in_coset *)
132 let op_in_coset = Sections.section_proof ["op";"k";"x";"K"]
133 `k IN K ==> op x k IN coset op x K`
134 [
135    ((BETA_TAC THEN (move ["kK"])) THEN ((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((use_arg_then2 ("k", [])) (term_tac exists_tac)) THEN (done_tac));
136 ];;
137
138 (* Lemma eqxx *)
139 let eqxx = Sections.section_proof ["x"]
140 `x = x <=> T`
141 [
142    ((ALL_TAC) THEN (done_tac));
143 ];;
144 let divides = GEN_ALL divides;;
145
146 (* Lemma set_op_sing *)
147 let set_op_sing = Sections.section_proof ["a";"b";"op"]
148 `set_op op {a} {b} = {op a b}`
149 [
150    ((((((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))))) THEN (move ["x"])) THEN (split_tac));
151    ((BETA_TAC THEN (case THEN (move ["z"])) THEN (case THEN (move ["y"])) THEN (case THEN ((case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (done_tac));
152    ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("a", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("b", [])) (term_tac exists_tac))) THEN (done_tac));
153 ];;
154
155 (* Lemma in_set_op1 *)
156 let in_set_op1 = Sections.section_proof ["f";"S";"x"]
157 `x IN set_op1 f S <=> ?s. s IN S /\ x = f s`
158 [
159    (((((use_arg_then2 ("set_op1", [set_op1]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
160 ];;
161
162 (* Lemma in_set_op *)
163 let in_set_op = Sections.section_proof ["f";"S1";"S2";"x"]
164 `x IN set_op f S1 S2 <=> ?s1 s2. s1 IN S1 /\ s2 IN S2 /\ x = f s1 s2`
165 [
166    (((((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac) THEN (((use_arg_then2 ("CONJ_ASSOC", [CONJ_ASSOC]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
167 ];;
168
169 (* Lemma conjg_set_alt *)
170 let conjg_set_alt = Sections.section_proof ["op";"i";"g";"S"]
171 `set_op1 (conjg (op, i) g) S = set_op1 (op (i g)) (set_op op S {g})`
172 [
173    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN (split_tac));
174    (BETA_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["sS"])) THEN (move ["x_eq"]));
175    (((fun arg_tac -> arg_tac (Arg_term (`op s g`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("x_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("s", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("g", [])) (term_tac exists_tac))) THEN (done_tac));
176    (BETA_TAC THEN (case THEN (move ["s"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["s1"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["s1S"])) THEN (case THEN (move ["s2_eq"])) THEN (move ["s_eq"]) THEN (move ["x_eq"]));
177    (((use_arg_then2 ("s1", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("x_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("s_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("s2_eq", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
178 ];;
179
180 (* Lemma set_op1_eq_image *)
181 let set_op1_eq_image = Sections.section_proof ["f";"S"]
182 `set_op1 f S = IMAGE f S`
183 [
184    (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL CONJ_ACI)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
185 ];;
186
187 (* Lemma set_op_eq_union *)
188 let set_op_eq_union = Sections.section_proof ["f";"S1";"S2"]
189 `set_op f S1 S2 = UNIONS {IMAGE (f x) S2 | x | x IN S1}`
190 [
191    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_UNIONS", [IN_UNIONS]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["x"])) THEN (split_tac));
192    (BETA_TAC THEN (case THEN (move ["s1"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["s1S"])) THEN (case THEN (move ["s2S"])) THEN (move ["x_eq"]));
193    (((THENL) (((fun arg_tac -> arg_tac (Arg_term (`IMAGE (f s1) S2`))) (term_tac exists_tac)) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (split_tac)) [((use_arg_then2 ("s1", [])) (term_tac exists_tac)); ((use_arg_then2 ("s2", [])) (term_tac exists_tac))]) THEN (done_tac));
194    ((BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["s1"])) THEN (case THEN (move ["s1S"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (move ["s2"])) THEN (case THEN (move ["x_eq"])) THEN (move ["s2S"])));
195    ((((use_arg_then2 ("s1", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("s2", [])) (term_tac exists_tac))) THEN (done_tac));
196 ];;
197
198 (* Lemma set_op_eq_image *)
199 let set_op_eq_image = Sections.section_proof ["f";"S";"y"]
200 `set_op f S {y} = IMAGE (\x. f x y) S`
201 [
202    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["x"])) THEN (split_tac));
203    (BETA_TAC THEN (case THEN (move ["s1"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["s1S"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
204    (((use_arg_then2 ("s1", [])) (term_tac exists_tac)) THEN (done_tac));
205    (BETA_TAC THEN (case THEN (move ["s"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (move ["sS"]));
206    ((((use_arg_then2 ("s", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("y", [])) (term_tac exists_tac))) THEN (done_tac));
207 ];;
208
209 (* Section Groups *)
210 Sections.begin_section "Groups";;
211 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
212 (Sections.add_section_var (mk_var ("e", (`:A`))));;
213 (Sections.add_section_var (mk_var ("op", (`:A -> A -> A`))));;
214 (Sections.add_section_var (mk_var ("i", (`:A -> A`))));;
215 (Sections.add_section_hyp "grG" (`group (G,op,i,e)`));;
216
217 (* Lemma e_in_group *)
218 let e_in_group = Sections.section_proof []
219 `e IN G`
220 [
221    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
222 ];;
223
224 (* Lemma in_group *)
225 let in_group = Sections.section_proof ["x";"y"]
226 `x IN G ==> y IN G ==> op x y IN G`
227 [
228    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
229 ];;
230
231 (* Lemma i_in_group *)
232 let i_in_group = Sections.section_proof ["x"]
233 `x IN G ==> i x IN G`
234 [
235    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
236 ];;
237
238 (* Lemma mul1g *)
239 let mul1g = Sections.section_proof ["x"]
240 `x IN G ==> op e x = x`
241 [
242    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
243 ];;
244
245 (* Lemma mulg1 *)
246 let mulg1 = Sections.section_proof ["x"]
247 `x IN G ==> op x e = x`
248 [
249    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
250 ];;
251
252 (* Lemma mulIg *)
253 let mulIg = Sections.section_proof ["x"]
254 `x IN G ==> op (i x) x = e`
255 [
256    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
257 ];;
258
259 (* Lemma mulgI *)
260 let mulgI = Sections.section_proof ["x"]
261 `x IN G ==> op x (i x) = e`
262 [
263    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
264 ];;
265
266 (* Lemma mulgA *)
267 let mulgA = Sections.section_proof ["x";"y";"z"]
268 `x IN G ==> y IN G ==> z IN G ==> op x (op y z) = op (op x y) z`
269 [
270    ((((use_arg_then2 ("grG", [])) (disch_tac [])) THEN (clear_assumption "grG") THEN BETA_TAC) THEN ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
271 ];;
272
273 (* Lemma mulgK *)
274 let mulgK = Sections.section_proof ["x";"y"]
275 `x IN G ==> y IN G ==> op (op x y) (i y) = x`
276 [
277    ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"])) THEN ((((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
278 ];;
279
280 (* Lemma mulKg *)
281 let mulKg = Sections.section_proof ["x";"y"]
282 `x IN G ==> y IN G ==> op (op x (i y)) y = x`
283 [
284    ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"])) THEN ((((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
285 ];;
286
287 (* Lemma i_uniq *)
288 let i_uniq = Sections.section_proof ["x";"y"]
289 `x IN G ==> y IN G ==> op x y = e ==> y = i x`
290 [
291    (BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["eq"]));
292    ((fun arg_tac -> arg_tac (Arg_term (`op (op (i x) x) y = op (i x) e`))) (term_tac (have_gen_tac []ALL_TAC)));
293    (((((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("yG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (done_tac));
294    (((((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
295 ];;
296
297 (* Lemma invgK *)
298 let invgK = Sections.section_proof ["x"]
299 `x IN G ==> i (i x) = x`
300 [
301    ((BETA_TAC THEN (move ["xG"])) THEN (((use_arg_then2 ("EQ_SYM_EQ", [EQ_SYM_EQ]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> arg_tac (Arg_theorem (REWRITE_RULE[IMP_IMP] i_uniq))) (disch_tac [])) THEN (DISCH_THEN apply_tac)));
302    (((((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
303 ];;
304
305 (* Lemma invg1 *)
306 let invg1 = Sections.section_proof []
307 `i e = e`
308 [
309    (((((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`i e`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("e_in_group", [e_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("e_in_group", [e_in_group]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
310 ];;
311
312 (* Lemma mulI *)
313 let mulI = Sections.section_proof ["x";"y"]
314 `x IN G ==> y IN G ==> i (op x y) = op (i y) (i x)`
315 [
316    ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"])) THEN (((use_arg_then2 ("EQ_SYM_EQ", [EQ_SYM_EQ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("i_uniq", [i_uniq])) (disch_tac [])) THEN (clear_assumption "i_uniq") THEN (DISCH_THEN apply_tac)));
317    (((repeat_tactic 1 9 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulgK", [mulgK]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
318 ];;
319
320 (* Lemma mulg_leftI *)
321 let mulg_leftI = Sections.section_proof ["x";"y";"z"]
322 `x IN G ==> y IN G ==> z IN G ==> op x y = op x z ==> y = z`
323 [
324    (BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["zG"]) THEN (move ["eq"]));
325    (((((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("z", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
326 ];;
327
328 (* Lemma mulg_rightI *)
329 let mulg_rightI = Sections.section_proof ["x";"y";"z"]
330 `x IN G ==> y IN G ==> z IN G ==> op y x = op z x ==> y = z`
331 [
332    (BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["zG"]) THEN (move ["eq"]));
333    (((((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulg1", [mulg1]))(gsym_then (thm_tac (new_rewrite [] [(`z`)]))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
334 ];;
335
336 (* Lemma mulg_left *)
337 let mulg_left = Sections.section_proof ["x";"y";"z"]
338 `x IN G ==> y IN G ==> z IN G ==> (op x y = z <=> x = op z (i y))`
339 [
340    ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["zG"])) THEN ((THENL) (split_tac) [(move ["opxy"]); (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))]));
341    (((((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
342    (((((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
343 ];;
344
345 (* Lemma mulg_right *)
346 let mulg_right = Sections.section_proof ["x";"y";"z"]
347 `x IN G ==> y IN G ==> z IN G ==> (op x y = z <=> y = op (i x) z)`
348 [
349    ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["zG"])) THEN ((THENL) (split_tac) [(move ["opxy"]); (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))]));
350    (((((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
351    (((((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
352 ];;
353
354 (* Lemma invg_e *)
355 let invg_e = Sections.section_proof []
356 `i e = e`
357 [
358    ((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("i_uniq", [i_uniq])) (disch_tac [])) THEN (clear_assumption "i_uniq") THEN (DISCH_THEN apply_tac)) THEN ((((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("e_in_group", [e_in_group]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
359 ];;
360
361 (* Lemma subgroup_alt *)
362 let subgroup_alt = Sections.section_proof ["H"]
363 `subgroup op i H G <=> 
364         H SUBSET G /\ ~(H = {}) /\ (!x y. x IN H ==> y IN H ==> op x y IN H) /\
365         (!x. x IN H ==> i x IN H)`
366 [
367    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ((split_tac) THEN ALL_TAC THEN (case THEN (move ["subHG"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN ((simp_tac THEN TRY done_tac))));
368    (((((use_arg_then2 ("subHG", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (BETA_TAC THEN (move ["h"])));
369    ((fun arg_tac -> arg_tac (Arg_term (`x IN H ==> i x IN H`))) (term_tac (have_gen_tac ["x"](move ["ixH"]))));
370    (BETA_TAC THEN (move ["xH"]));
371    ((fun arg_tac -> (use_arg_then2 ("subHG", [])) (fun fst_arg -> (use_arg_then2 ("xH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["xG"])));
372    (((((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`i x`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("h", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("xH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("h", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
373    (((((use_arg_then2 ("ixH", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (move ["x"]) THEN (move ["y"]) THEN (move ["xH"]) THEN (move ["yH"]));
374    (((fun arg_tac -> (use_arg_then2 ("subHG", [])) (fun fst_arg -> (use_arg_then2 ("xH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["xG"]))) THEN ((fun arg_tac -> (use_arg_then2 ("subHG", [])) (fun fst_arg -> (use_arg_then2 ("yH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["yG"]))));
375    (((((fun arg_tac -> (use_arg_then2 ("invgK", [invgK])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("h", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("xH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ixH", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
376 ];;
377
378 (* Lemma subgroup_group *)
379 let subgroup_group = Sections.section_proof ["H"]
380 `subgroup op i H G ==> group (H, op, i, e)`
381 [
382    (((use_arg_then2 ("grG", [])) (disch_tac [])) THEN BETA_TAC);
383    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 2 0 (((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["opG"])) THEN (case THEN (move ["iG"])) THEN (case THEN (move ["eG"])) THEN (case THEN (move ["idG"])) THEN (case THEN ((move ["invG"]) THEN (move ["aG"]))) THEN (case THEN (move ["sHG"])) THEN (case THEN ((move ["nH"]) THEN (move ["op_iH"]))));
384    ((fun arg_tac -> arg_tac (Arg_term (`e IN H`))) (term_tac (have_gen_tac [](move ["eH"]))));
385    ((((use_arg_then2 ("nH", [])) (disch_tac [])) THEN (clear_assumption "nH") THEN BETA_TAC) THEN ((((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ((move ["x"]) THEN (move ["xH"])))));
386    (((((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("op_iH", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
387    ((fun arg_tac -> arg_tac (Arg_term (`y IN H ==> i y IN H`))) (term_tac (have_gen_tac ["y"](move ["iH"]))));
388    (BETA_TAC THEN (move ["yH"]));
389    (((((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`i y`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("op_iH", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
390    (repeat_tactic 0 6 (((split_tac) THEN ((TRY done_tac)))));
391    ((BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((move ["xH"]) THEN (move ["yH"])))) THEN ((((use_arg_then2 ("invgK", [invgK]))(gsym_then (thm_tac (new_rewrite [] [(`y`)]))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("op_iH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("iH", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
392    ((BETA_TAC THEN (move ["x"]) THEN (move ["xH"])) THEN (((use_arg_then2 ("idG", [])) (disch_tac [])) THEN (clear_assumption "idG") THEN (DISCH_THEN apply_tac)) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
393    ((BETA_TAC THEN (move ["x"]) THEN (move ["xH"])) THEN (((use_arg_then2 ("invG", [])) (disch_tac [])) THEN (clear_assumption "invG") THEN (DISCH_THEN apply_tac)) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
394    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (move ["z"]) THEN (case THEN (move ["xH"])) THEN (case THEN ((move ["yH"]) THEN (move ["zH"]))));
395    ((((use_arg_then2 ("aG", [])) (disch_tac [])) THEN (clear_assumption "aG") THEN (DISCH_THEN apply_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
396 ];;
397
398 (* Lemma subgroup_e *)
399 let subgroup_e = Sections.section_proof []
400 `subgroup op i {e} G`
401 [
402    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("e_in_group", [e_in_group]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (split_tac));
403    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN (done_tac));
404    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
405    (((((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("e_in_group", [e_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
406 ];;
407
408 (* Lemma set_opK *)
409 let set_opK = Sections.section_proof []
410 `set_op op G G = G`
411 [
412    ((((((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN ((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (split_tac));
413    (BETA_TAC THEN (case THEN (move ["x'"])) THEN (case THEN (move ["y"])) THEN (case THEN ((case THEN ((move ["xG"]) THEN (move ["yG"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
414    ((((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
415    (BETA_TAC THEN (move ["xG"]));
416    ((((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac))) THEN ((((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("e_in_group", [e_in_group]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
417 ];;
418
419 (* Lemma normal_conj2 *)
420 let normal_conj2 = Sections.section_proof ["H";"x";"y"]
421 `normal op i H G ==> x IN G ==> y IN H ==>
422         op x (op y (i x)) IN H`
423 [
424    (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("normal_conj", [normal_conj])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN ((((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] [])))) THEN (move ["conj"]) THEN (move ["xG"]) THEN (move ["yH"])));
425    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("conj", [])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`i x`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC);
426    (((((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("yH", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("invgK", [invgK]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
427 ];;
428
429 (* Lemma set_opA *)
430 let set_opA = Sections.section_proof ["A";"B";"C"]
431 `A SUBSET G ==> B SUBSET G ==> C SUBSET G ==>
432         set_op op A (set_op op B C) = set_op op (set_op op A B) C`
433 [
434    ((repeat_tactic 1 9 (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (move ["AG"]) THEN (move ["BG"]) THEN (move ["CG"]));
435    ((((repeat_tactic 1 9 (((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (simp_tac)) THEN (split_tac));
436    (BETA_TAC THEN (case THEN (move ["a"])) THEN (case THEN (move ["u"])) THEN (case THEN (case THEN (move ["aA"]))) THEN (case THEN (move ["b"])) THEN (case THEN (move ["c"])) THEN (case THEN ((case THEN ((move ["bB"]) THEN (move ["cC"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (move ["x_eq"]));
437    (((fun arg_tac -> arg_tac (Arg_term (`op a b`))) (term_tac exists_tac)) THEN ((use_arg_then2 ("c", [])) (term_tac exists_tac)));
438    ((((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 1 (((use_arg_then2 ("AG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 1 (((use_arg_then2 ("BG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 1 (((use_arg_then2 ("CG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("x_eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("cC", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac));
439    ((((use_arg_then2 ("a", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("b", [])) (term_tac exists_tac))) THEN (done_tac));
440    (BETA_TAC THEN (case THEN (move ["u"])) THEN (case THEN (move ["c"])) THEN (case THEN ALL_TAC) THEN (case THEN ALL_TAC) THEN (case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN ((case THEN ((move ["aA"]) THEN (move ["bB"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (move ["cC"]) THEN (move ["x_eq"]));
441    (((use_arg_then2 ("a", [])) (term_tac exists_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`op b c`))) (term_tac exists_tac)));
442    ((((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 1 (((use_arg_then2 ("AG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 1 (((use_arg_then2 ("BG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("CG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("x_eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("aA", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac));
443    ((((use_arg_then2 ("b", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("c", [])) (term_tac exists_tac))) THEN (done_tac));
444 ];;
445
446 (* Lemma coset_subset *)
447 let coset_subset = Sections.section_proof ["x";"S"]
448 `x IN G ==> S SUBSET G ==> coset op x S SUBSET G`
449 [
450    ((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (move ["xG"]) THEN (move ["SG"]));
451    ((((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (move ["y"])) THEN (((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["z"])) THEN (case THEN ((move ["zS"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
452    (((((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
453 ];;
454
455 (* Lemma coset_e *)
456 let coset_e = Sections.section_proof ["S"]
457 `S SUBSET G ==> coset op e S = S`
458 [
459    ((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (move ["sSG"]));
460    (((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] []))))) THEN (((repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (simp_tac)) THEN (move ["x"])) THEN (split_tac));
461    ((BETA_TAC THEN (case THEN (move ["y"])) THEN (case THEN ((move ["yH"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN ((((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
462    ((BETA_TAC THEN (move ["xH"])) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
463 ];;
464
465 (* Lemma coset_eq_e *)
466 let coset_eq_e = Sections.section_proof ["g"]
467 `g IN G ==> coset op g G = G`
468 [
469    ((((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["gG"]) THEN (move ["g'"])) THEN ((THENL) (split_tac) [ALL_TAC; (move ["g'G"])]));
470    ((BETA_TAC THEN (case THEN (move ["h"])) THEN (case THEN (move ["hG"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
471    ((fun arg_tac -> arg_tac (Arg_term (`op (i g) g'`))) (term_tac exists_tac));
472    (((((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
473 ];;
474
475 (* Lemma left_mul_coset *)
476 let left_mul_coset = Sections.section_proof ["g";"h";"S"]
477 `g IN G ==> h IN G ==> S SUBSET G ==> 
478         set_op1 (op g) (coset op h S) = coset op (op g h) S`
479 [
480    (BETA_TAC THEN (move ["gG"]) THEN (move ["hG"]) THEN (move ["sSG"]));
481    ((((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("coset_op", [coset_op]))(thm_tac (new_rewrite [] []))))));
482    ((((use_arg_then2 ("set_opA", [set_opA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
483    (((use_arg_then2 ("congr2", [congr2])) (thm_tac apply_tac)) THEN (((((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["x"])) THEN (split_tac));
484    ((BETA_TAC THEN (case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN ALL_TAC) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (done_tac));
485    ((BETA_TAC THEN (move ["x_eq"])) THEN (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("h", [])) (term_tac exists_tac))) THEN (done_tac));
486 ];;
487
488 (* Lemma set_lmul_subset *)
489 let set_lmul_subset = Sections.section_proof ["g";"S"]
490 `g IN G ==> S SUBSET G ==> set_op1 (op g) S SUBSET G`
491 [
492    (((repeat_tactic 1 9 (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["x"]) THEN (case THEN (move ["s"])) THEN (case THEN (move ["sS"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
493    (((((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
494 ];;
495
496 (* Lemma set_rmul_subset *)
497 let set_rmul_subset = Sections.section_proof ["g";"S"]
498 `g IN G ==> S SUBSET G ==> set_op op S {g} SUBSET G`
499 [
500    (((repeat_tactic 1 9 (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["x"]) THEN (case THEN (move ["s1"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["s1S"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
501    (((((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
502 ];;
503
504 (* Lemma set_lmul_has_size *)
505 let set_lmul_has_size = Sections.section_proof ["g";"S";"n"]
506 `g IN G ==> S SUBSET G ==> S HAS_SIZE n ==> set_op1 (op g) S HAS_SIZE n`
507 [
508    (BETA_TAC THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sizeS"]));
509    ((((use_arg_then2 ("set_op1_eq_image", [set_op1_eq_image]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("HAS_SIZE_IMAGE_INJ", [HAS_SIZE_IMAGE_INJ])) (thm_tac apply_tac)) THEN (((((use_arg_then2 ("sizeS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN (move ["xS"])) THEN (case THEN (move ["yS"]))));
510    ((((use_arg_then2 ("mulg_leftI", [mulg_leftI])) (disch_tac [])) THEN (clear_assumption "mulg_leftI") THEN (DISCH_THEN apply_tac)) THEN ((((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sSG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
511 ];;
512
513 (* Lemma set_rmul_has_size *)
514 let set_rmul_has_size = Sections.section_proof ["g";"S";"n"]
515 `g IN G ==> S SUBSET G ==> S HAS_SIZE n ==> set_op op S {g} HAS_SIZE n`
516 [
517    (BETA_TAC THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sizeS"]));
518    ((((use_arg_then2 ("set_op_eq_image", [set_op_eq_image]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("HAS_SIZE_IMAGE_INJ", [HAS_SIZE_IMAGE_INJ])) (thm_tac apply_tac)) THEN (((((use_arg_then2 ("sizeS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN (move ["xS"])) THEN (case THEN (move ["yS"])) THEN (simp_tac)));
519    ((((use_arg_then2 ("mulg_rightI", [mulg_rightI])) (disch_tac [])) THEN (clear_assumption "mulg_rightI") THEN (DISCH_THEN apply_tac)) THEN ((((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sSG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
520 ];;
521
522 (* Lemma set_lmul_card *)
523 let set_lmul_card = Sections.section_proof ["g";"S"]
524 `g IN G ==> S SUBSET G ==> FINITE S ==> CARD (set_op1 (op g) S) = CARD S`
525 [
526    ((((use_arg_then2 ("FINITE_HAS_SIZE", [FINITE_HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sizeS"]));
527    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("set_lmul_has_size", [set_lmul_has_size])) (fun fst_arg -> (use_arg_then2 ("gG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sSG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sizeS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
528    (((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
529 ];;
530
531 (* Lemma set_rmul_card *)
532 let set_rmul_card = Sections.section_proof ["g";"S"]
533 `g IN G ==> S SUBSET G ==> FINITE S ==> CARD (set_op op S {g}) = CARD S`
534 [
535    ((((use_arg_then2 ("FINITE_HAS_SIZE", [FINITE_HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sizeS"]));
536    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("set_rmul_has_size", [set_rmul_has_size])) (fun fst_arg -> (use_arg_then2 ("gG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sSG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sizeS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
537    (((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
538 ];;
539
540 (* Lemma set_lrmul_card *)
541 let set_lrmul_card = Sections.section_proof ["g1";"g2";"S"]
542 `g1 IN G ==> g2 IN G ==> S SUBSET G ==> FINITE S ==>
543         CARD (set_op1 (op g1) S) = CARD (set_op op S {g2})`
544 [
545    ((BETA_TAC THEN (move ["g1G"]) THEN (move ["g2G"]) THEN (move ["sSG"]) THEN (move ["finS"])) THEN ((((use_arg_then2 ("set_lmul_card", [set_lmul_card]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_rmul_card", [set_rmul_card]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
546 ];;
547
548 (* Lemma set_llmul_card *)
549 let set_llmul_card = Sections.section_proof ["g1";"g2";"S"]
550 `g1 IN G ==> g2 IN G ==> S SUBSET G ==> FINITE S ==>
551         CARD (set_op1 (op g1) S) = CARD (set_op1 (op g2) S)`
552 [
553    ((BETA_TAC THEN (move ["g1G"]) THEN (move ["g2G"]) THEN (move ["sSG"]) THEN (move ["finS"])) THEN (repeat_tactic 1 9 (((use_arg_then2 ("set_lmul_card", [set_lmul_card]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
554 ];;
555
556 (* Lemma set_lmul1 *)
557 let set_lmul1 = Sections.section_proof ["S"]
558 `S SUBSET G ==> set_op1 (op e) S = S`
559 [
560    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["sSG"]) THEN (move ["x"])) THEN ((THENL) (split_tac) [((case THEN (move ["s"])) THEN (case THEN ((move ["sS"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))); (move ["xS"])]));
561    (((((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
562    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
563 ];;
564
565 (* Lemma set_rmul1 *)
566 let set_rmul1 = Sections.section_proof ["S"]
567 `S SUBSET G ==> set_op op S {e} = S`
568 [
569    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (move ["sSG"]) THEN (move ["x"])) THEN ((THENL) (split_tac) [((case THEN (move ["s1"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["s1S"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))); (move ["xS"])]));
570    (((((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
571    ((((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac))) THEN ((((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
572 ];;
573
574 (* Lemma conjg_in *)
575 let conjg_in = Sections.section_proof ["x";"g"]
576 `g IN G ==> x IN G ==> conjg (op, i) g x IN G`
577 [
578    ((BETA_TAC THEN (move ["gG"]) THEN (move ["xG"])) THEN ((((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
579 ];;
580
581 (* Lemma mul_conjg *)
582 let mul_conjg = Sections.section_proof ["x";"g1";"g2"]
583 `x IN G ==> g1 IN G ==> g2 IN G ==> 
584         conjg (op, i) (op g1 g2) x = conjg (op, i) g2 (conjg (op, i) g1 x)`
585 [
586    ((BETA_TAC THEN (move ["xG"]) THEN (move ["g1G"]) THEN (move ["g2G"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("mulI", [mulI]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
587 ];;
588
589 (* Lemma conjg_mul *)
590 let conjg_mul = Sections.section_proof ["x";"y";"g"]
591 `x IN G ==> y IN G ==> g IN G ==>
592         conjg (op, i) g (op x y) = op (conjg (op, i) g x) (conjg (op, i) g y)`
593 [
594    ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["gG"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulgK", [mulgK]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
595 ];;
596
597 (* Lemma inv_conjg *)
598 let inv_conjg = Sections.section_proof ["x";"g"]
599 `g IN G ==> x IN G ==> i (conjg (op, i) g x) = conjg (op, i) g (i x)`
600 [
601    ((BETA_TAC THEN (move ["gG"]) THEN (move ["xG"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulI", [mulI]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("invgK", [invgK]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
602 ];;
603
604 (* Lemma conj1g *)
605 let conj1g = Sections.section_proof ["x"]
606 `x IN G ==> conjg (op, i) e x = x`
607 [
608    ((BETA_TAC THEN (move ["xG"])) THEN ((((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("invg1", [invg1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
609 ];;
610
611 (* Lemma conjg1 *)
612 let conjg1 = Sections.section_proof ["g"]
613 `g IN G ==> conjg (op, i) g e = e`
614 [
615    ((BETA_TAC THEN (move ["gG"])) THEN ((((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
616 ];;
617
618 (* Lemma conjg_inj *)
619 let conjg_inj = Sections.section_proof ["x";"y";"g"]
620 `x IN G ==> y IN G ==> g IN G ==> 
621         (conjg (op, i) g x = conjg (op, i) g y <=> x = y)`
622 [
623    ((THENL_LAST) ((BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["gG"])) THEN (split_tac)) ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
624    (((DISCH_THEN (fun snd_th -> (fun arg_tac -> (use_arg_then2 ("congr1", [congr1])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`conjg (op, i) (i g)`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("mul_conjg", [mul_conjg]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("conj1g", [conj1g]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
625 ];;
626
627 (* Lemma conjg_set_subset *)
628 let conjg_set_subset = Sections.section_proof ["g";"S"]
629 `g IN G ==> S SUBSET G ==> set_op1 (conjg (op, i) g) S SUBSET G`
630 [
631    (BETA_TAC THEN (move ["gG"]) THEN (move ["sSG"]));
632    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (case THEN (move ["y"])) THEN (case THEN (move ["yS"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("conjg_in", [conjg_in]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sSG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
633 ];;
634
635 (* Lemma conj1g_set *)
636 let conj1g_set = Sections.section_proof ["S"]
637 `S SUBSET G ==> set_op1 (conjg (op, i) e) S = S`
638 [
639    ((BETA_TAC THEN (move ["sSG"])) THEN ((((use_arg_then2 ("conjg_set_alt", [conjg_set_alt]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_rmul1", [set_rmul1]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("invg1", [invg1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_lmul1", [set_lmul1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
640 ];;
641
642 (* Lemma mul_conjg_set *)
643 let mul_conjg_set = Sections.section_proof ["S";"g1";"g2"]
644 `g1 IN G ==> g2 IN G ==> S SUBSET G ==>
645         set_op1 (conjg (op, i) (op g1 g2)) S = set_op1 (conjg (op, i) g2) (set_op1 (conjg (op, i) g1) S)`
646 [
647    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))))) THEN (move ["g1G"]) THEN (move ["g2G"]) THEN (move ["sSG"]) THEN (move ["x"])) THEN (split_tac));
648    (BETA_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["sS"])) THEN (move ["x_eq"]));
649    (((fun arg_tac -> arg_tac (Arg_term (`conjg (op, i) g1 s`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("mul_conjg", [mul_conjg]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("g1G", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("g2G", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("x_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("s", [])) (term_tac exists_tac)) THEN (done_tac));
650    (BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["s"])) THEN (case THEN (move ["sS"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["x_eq"]));
651    (((use_arg_then2 ("s", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("mul_conjg", [mul_conjg]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("g1G", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("g2G", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
652 ];;
653
654 (* Lemma conjg_set_has_size *)
655 let conjg_set_has_size = Sections.section_proof ["S";"g";"n"]
656 `g IN G ==> S SUBSET G ==> S HAS_SIZE n ==>
657         set_op1 (conjg (op, i) g) S HAS_SIZE n`
658 [
659    (BETA_TAC THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sizeS"]));
660    (((((use_arg_then2 ("conjg_set_alt", [conjg_set_alt]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_lmul_has_size", [set_lmul_has_size]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_rmul_subset", [set_rmul_subset]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_rmul_has_size", [set_rmul_has_size]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
661 ];;
662
663 (* Lemma conjg_set_card *)
664 let conjg_set_card = Sections.section_proof ["S";"g"]
665 `g IN G ==> S SUBSET G ==> FINITE S ==>
666         CARD (set_op1 (conjg (op, i) g) S) = CARD S`
667 [
668    ((((use_arg_then2 ("FINITE_HAS_SIZE", [FINITE_HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sizeS"]));
669    ((((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("conjg_set_has_size", [conjg_set_has_size])) (fun fst_arg -> (use_arg_then2 ("gG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sSG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sizeS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
670 ];;
671
672 (* Lemma conjg_set_card2 *)
673 let conjg_set_card2 = Sections.section_proof ["S";"g1";"g2"]
674 `g1 IN G ==> g2 IN G ==> S SUBSET G ==> FINITE S ==>
675         CARD (set_op1 (conjg (op, i) g1) S) = CARD (set_op1 (conjg (op, i) g2) S)`
676 [
677    ((BETA_TAC THEN (move ["g1G"]) THEN (move ["g2G"]) THEN (move ["sSG"]) THEN (move ["finS"])) THEN (repeat_tactic 1 9 (((use_arg_then2 ("conjg_set_card", [conjg_set_card]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
678 ];;
679
680 (* Lemma conjg_set_equiv *)
681 let conjg_set_equiv = Sections.section_proof ["S";"U";"g"]
682 `g IN G ==> S SUBSET G ==> U SUBSET G ==>
683         ((set_op1 (conjg (op, i) g) S) = U <=> set_op op S {g} = set_op1 (op g) U)`
684 [
685    ((BETA_TAC THEN (move ["gG"]) THEN (move ["sSG"]) THEN (move ["sUG"])) THEN (split_tac));
686    ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))) THEN ((((use_arg_then2 ("conjg_set_alt", [conjg_set_alt]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_opA", [set_opA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("set_rmul_subset", [set_rmul_subset]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))));
687    (((((use_arg_then2 ("set_op_sing", [set_op_sing]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_lmul1", [set_lmul1]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_rmul_subset", [set_rmul_subset]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
688    (((DISCH_THEN (fun snd_th -> (fun arg_tac -> (use_arg_then2 ("congr1", [congr1])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`set_op1 (op (i g))`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN ((((use_arg_then2 ("conjg_set_alt", [conjg_set_alt]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))));
689    (((repeat_tactic 1 9 (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_opA", [set_opA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_op_sing", [set_op_sing]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_lmul1", [set_lmul1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
690 ];;
691
692 (* Lemma set_mulI *)
693 let set_mulI = Sections.section_proof ["S";"U"]
694 `S SUBSET G ==> U SUBSET G ==> 
695         set_op1 i (set_op op S U) = set_op op (set_op1 i U) (set_op1 i S)`
696 [
697    ((((repeat_tactic 1 9 (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] []))))) THEN (move ["sSG"]) THEN (move ["sUG"]) THEN (move ["x"])) THEN (split_tac));
698    (BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["s"])) THEN (case THEN (move ["u"])) THEN (case THEN (move ["sS"])) THEN (case THEN (move ["uU"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
699    ((((fun arg_tac -> arg_tac (Arg_term (`i u`))) (term_tac exists_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`i s`))) (term_tac exists_tac))) THEN ((((use_arg_then2 ("mulI", [mulI]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("sUG", [])) (fun fst_arg -> (use_arg_then2 ("uU", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))));
700    (((THENL) (split_tac) [((use_arg_then2 ("u", [])) (term_tac exists_tac)); ((use_arg_then2 ("s", [])) (term_tac exists_tac))]) THEN (done_tac));
701    (BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["y"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["u"])) THEN (case THEN (move ["uU"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (case THEN ALL_TAC) THEN (case THEN (move ["s"])) THEN (case THEN (move ["sS"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["x_eq"]));
702    (((fun arg_tac -> arg_tac (Arg_term (`op s u`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("x_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulI", [mulI]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("sUG", [])) (fun fst_arg -> (use_arg_then2 ("uU", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))));
703    ((((use_arg_then2 ("s", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("u", [])) (term_tac exists_tac))) THEN (done_tac));
704 ];;
705
706 (* Lemma set_invgK *)
707 let set_invgK = Sections.section_proof ["S"]
708 `S SUBSET G ==> set_op1 i (set_op1 i S) = S`
709 [
710    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))))) THEN (move ["sSG"]) THEN (move ["x"])) THEN (split_tac));
711    (BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["s"])) THEN (case THEN (move ["sS"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
712    (((((use_arg_then2 ("invgK", [invgK]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
713    ((BETA_TAC THEN (move ["xS"])) THEN ((fun arg_tac -> arg_tac (Arg_term (`i x`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("invgK", [invgK]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sSG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
714 ];;
715
716 (* Lemma group_invK *)
717 let group_invK = Sections.section_proof []
718 `set_op1 i G = G`
719 [
720    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN ((THENL) (split_tac) [((case THEN (move ["s"])) THEN (case THEN ((move ["sG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))); (move ["xG"])]));
721    ((((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
722    (((fun arg_tac -> arg_tac (Arg_term (`i x`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("invgK", [invgK]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
723 ];;
724
725 (* Lemma group_lmulK *)
726 let group_lmulK = Sections.section_proof ["g"]
727 `g IN G ==> set_op1 (op g) G = G`
728 [
729    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["gG"]) THEN (move ["x"])) THEN ((THENL) (split_tac) [((case THEN (move ["s"])) THEN (case THEN ((move ["sG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))); (move ["xG"])]));
730    ((((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
731    ((fun arg_tac -> arg_tac (Arg_term (`op (i g) x`))) (term_tac exists_tac));
732    (((((use_arg_then2 ("mulgA", [mulgA]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulgI", [mulgI]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mul1g", [mul1g]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
733 ];;
734
735 (* Lemma group_rmulK *)
736 let group_rmulK = Sections.section_proof ["g"]
737 `g IN G ==> set_op op G {g} = G`
738 [
739    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (move ["gG"]) THEN (move ["x"])) THEN ((THENL) (split_tac) [((case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN (move ["aG"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))); (move ["xG"])]));
740    ((((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
741    (((fun arg_tac -> arg_tac (Arg_term (`op x (i g)`))) (term_tac exists_tac)) THEN ((use_arg_then2 ("g", [])) (term_tac exists_tac)));
742    (((((use_arg_then2 ("mulgA", [mulgA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("mulIg", [mulIg]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_group", [in_group]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulg1", [mulg1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
743 ];;
744
745 (* Lemma group_conjgK *)
746 let group_conjgK = Sections.section_proof ["g"]
747 `g IN G ==> set_op1 (conjg (op, i) g) G = G`
748 [
749    ((BETA_TAC THEN (move ["gG"])) THEN ((((use_arg_then2 ("conjg_set_alt", [conjg_set_alt]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("group_rmulK", [group_rmulK]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("group_lmulK", [group_lmulK]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("i_in_group", [i_in_group]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
750 ];;
751
752 (* Finalization of the section Groups *)
753 let e_in_group = Sections.finalize_theorem e_in_group;;
754 let in_group = Sections.finalize_theorem in_group;;
755 let i_in_group = Sections.finalize_theorem i_in_group;;
756 let mul1g = Sections.finalize_theorem mul1g;;
757 let mulg1 = Sections.finalize_theorem mulg1;;
758 let mulIg = Sections.finalize_theorem mulIg;;
759 let mulgI = Sections.finalize_theorem mulgI;;
760 let mulgA = Sections.finalize_theorem mulgA;;
761 let mulgK = Sections.finalize_theorem mulgK;;
762 let mulKg = Sections.finalize_theorem mulKg;;
763 let i_uniq = Sections.finalize_theorem i_uniq;;
764 let invgK = Sections.finalize_theorem invgK;;
765 let invg1 = Sections.finalize_theorem invg1;;
766 let mulI = Sections.finalize_theorem mulI;;
767 let mulg_leftI = Sections.finalize_theorem mulg_leftI;;
768 let mulg_rightI = Sections.finalize_theorem mulg_rightI;;
769 let mulg_left = Sections.finalize_theorem mulg_left;;
770 let mulg_right = Sections.finalize_theorem mulg_right;;
771 let invg_e = Sections.finalize_theorem invg_e;;
772 let subgroup_alt = Sections.finalize_theorem subgroup_alt;;
773 let subgroup_group = Sections.finalize_theorem subgroup_group;;
774 let subgroup_e = Sections.finalize_theorem subgroup_e;;
775 let set_opK = Sections.finalize_theorem set_opK;;
776 let normal_conj2 = Sections.finalize_theorem normal_conj2;;
777 let set_opA = Sections.finalize_theorem set_opA;;
778 let coset_subset = Sections.finalize_theorem coset_subset;;
779 let coset_e = Sections.finalize_theorem coset_e;;
780 let coset_eq_e = Sections.finalize_theorem coset_eq_e;;
781 let left_mul_coset = Sections.finalize_theorem left_mul_coset;;
782 let set_lmul_subset = Sections.finalize_theorem set_lmul_subset;;
783 let set_rmul_subset = Sections.finalize_theorem set_rmul_subset;;
784 let set_lmul_has_size = Sections.finalize_theorem set_lmul_has_size;;
785 let set_rmul_has_size = Sections.finalize_theorem set_rmul_has_size;;
786 let set_lmul_card = Sections.finalize_theorem set_lmul_card;;
787 let set_rmul_card = Sections.finalize_theorem set_rmul_card;;
788 let set_lrmul_card = Sections.finalize_theorem set_lrmul_card;;
789 let set_llmul_card = Sections.finalize_theorem set_llmul_card;;
790 let set_lmul1 = Sections.finalize_theorem set_lmul1;;
791 let set_rmul1 = Sections.finalize_theorem set_rmul1;;
792 let conjg_in = Sections.finalize_theorem conjg_in;;
793 let mul_conjg = Sections.finalize_theorem mul_conjg;;
794 let conjg_mul = Sections.finalize_theorem conjg_mul;;
795 let inv_conjg = Sections.finalize_theorem inv_conjg;;
796 let conj1g = Sections.finalize_theorem conj1g;;
797 let conjg1 = Sections.finalize_theorem conjg1;;
798 let conjg_inj = Sections.finalize_theorem conjg_inj;;
799 let conjg_set_subset = Sections.finalize_theorem conjg_set_subset;;
800 let conj1g_set = Sections.finalize_theorem conj1g_set;;
801 let mul_conjg_set = Sections.finalize_theorem mul_conjg_set;;
802 let conjg_set_has_size = Sections.finalize_theorem conjg_set_has_size;;
803 let conjg_set_card = Sections.finalize_theorem conjg_set_card;;
804 let conjg_set_card2 = Sections.finalize_theorem conjg_set_card2;;
805 let conjg_set_equiv = Sections.finalize_theorem conjg_set_equiv;;
806 let set_mulI = Sections.finalize_theorem set_mulI;;
807 let set_invgK = Sections.finalize_theorem set_invgK;;
808 let group_invK = Sections.finalize_theorem group_invK;;
809 let group_lmulK = Sections.finalize_theorem group_lmulK;;
810 let group_rmulK = Sections.finalize_theorem group_rmulK;;
811 let group_conjgK = Sections.finalize_theorem group_conjgK;;
812 Sections.end_section "Groups";;
813
814 (* Lemma subgroup_alt2 *)
815 let subgroup_alt2 = Sections.section_proof ["G";"op";"i";"e";"H"]
816 `group (G, op, i, e) ==> 
817         (subgroup op i H G <=> (H SUBSET G /\ group (H, op, i, e)))`
818 [
819    ((BETA_TAC THEN (move ["grG"])) THEN ((THENL) (split_tac) [(move ["subHG"]); (case THEN ((move ["sHG"]) THEN (move ["grH"])))]));
820    (((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
821    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (split_tac));
822    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
823    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((move ["xH"]) THEN (move ["yH"]))));
824    (((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("xH", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
825 ];;
826
827 (* Section Normal *)
828 Sections.begin_section "Normal";;
829 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
830 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
831 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
832 (Sections.add_section_var (mk_var ("e", (`:A`))));;
833 (Sections.add_section_var (mk_var ("H", (`:A->bool`))));;
834 (Sections.add_section_hyp "grG" (`group (G,op,i,e)`));;
835
836 (* Lemma group_subgroup *)
837 let group_subgroup = Sections.section_proof []
838 `subgroup op i G G`
839 [
840    (((((fun arg_tac -> (use_arg_then2 ("subgroup_alt2", [subgroup_alt2])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET_REFL", [SUBSET_REFL]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
841 ];;
842
843 (* Lemma group_normal *)
844 let group_normal = Sections.section_proof []
845 `normal op i G G`
846 [
847    (((((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("group_subgroup", [group_subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((move ["xG"]) THEN (move ["yG"]))));
848    (((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
849 ];;
850
851 (* Lemma subgroup_conjg *)
852 let subgroup_conjg = Sections.section_proof ["g"]
853 `subgroup op i H G ==> g IN G ==> 
854         subgroup op i (set_op1 (conjg (op, i) g) H) G`
855 [
856    (BETA_TAC THEN (move ["subH"]) THEN (move ["gG"]));
857    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
858    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
859    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conjg_set_subset", [conjg_set_subset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (split_tac));
860    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conjg1", [conjg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
861    ((repeat_tactic 1 9 (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ALL_TAC) THEN (case THEN (move ["h1"])) THEN (case THEN (move ["h1H"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (case THEN (move ["h2"])) THEN (case THEN (move ["h2H"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
862    (((fun arg_tac -> arg_tac (Arg_term (`op h1 (i h2)`))) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))));
863    (((((fun arg_tac -> (use_arg_then2 ("inv_conjg", [inv_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("conjg_mul", [conjg_mul])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
864 ];;
865
866 (* Lemma subgroup_trans *)
867 let subgroup_trans = Sections.section_proof ["H";"K"]
868 `subgroup op i H K ==> subgroup op i K G ==> subgroup op i H G`
869 [
870    (BETA_TAC THEN (move ["subHK"]));
871    ((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("subgroup_alt2", [subgroup_alt2])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ((move ["sKG"]) THEN (move ["grK"]))));
872    ((((use_arg_then2 ("subHK", [])) (disch_tac [])) THEN (clear_assumption "subHK") THEN BETA_TAC) THEN ((((fun arg_tac -> (use_arg_then2 ("subgroup_alt2", [subgroup_alt2])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN ((move ["sHK"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
873    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("SUBSET_TRANS", [SUBSET_TRANS])) (fun fst_arg -> (use_arg_then2 ("sHK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (exact_tac));
874 ];;
875
876 (* Lemma cosets_full_preimage0 *)
877 let cosets_full_preimage0 = Sections.section_proof ["K"]
878 `subgroup op i K G ==> H SUBSET K ==> ~(H = {}) ==> 
879         K = {g | g IN G /\ coset op g H IN (cosets op K H)}`
880 [
881    (((((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (move ["subKG"]) THEN (move ["sHK"]) THEN (case THEN (move ["h"])) THEN (move ["hH"]));
882    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sKG"])));
883    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grK"])));
884    (((((use_arg_then2 ("SUBSET_ANTISYM_EQ", [SUBSET_ANTISYM_EQ]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("cosets_full_preimage_sub", [cosets_full_preimage_sub]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (move ["k"]));
885    (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["g"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["gG"])) THEN (case THEN (move ["x"])) THEN (case THEN (move ["xK"])));
886    (((repeat_tactic 1 9 (((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET_ANTISYM_EQ", [SUBSET_ANTISYM_EQ]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN ((move ["h1"]) THEN (move ["_"]))) THEN (move ["_"]));
887    ((THENL_FIRST) ((((fun arg_tac -> (use_arg_then2 ("h1", [])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`op g h`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (ANTS_TAC)) (((use_arg_then2 ("h", [])) (term_tac exists_tac)) THEN (done_tac)));
888    (BETA_TAC THEN (case THEN (move ["y"])) THEN (case THEN (move ["yH"])));
889    ((((fun arg_tac -> (use_arg_then2 ("mulg_left", [mulg_left])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xK", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("sHK", [])) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("sHK", [])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
890    ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN ((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xK", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHK", []))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
891 ];;
892
893 (* Lemma preimages_eq0 *)
894 let preimages_eq0 = Sections.section_proof ["K1";"K2"]
895 `subgroup op i K1 G ==> subgroup op i K2 G ==> 
896         H SUBSET K1 ==> H SUBSET K2 ==> ~(H = {}) ==>
897         (cosets op K1 H = cosets op K2 H <=> K1 = K2)`
898 [
899    ((BETA_TAC THEN (move ["subK1G"]) THEN (move ["subK2G"]) THEN (move ["sHK1"]) THEN (move ["sHK2"]) THEN (move ["nH0"])) THEN ((THENL) (split_tac) [(move ["c_eq"]); ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)))]));
900    (((((fun arg_tac -> (use_arg_then2 ("cosets_full_preimage0", [cosets_full_preimage0])) (fun fst_arg -> (use_arg_then2 ("K1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("cosets_full_preimage0", [cosets_full_preimage0])) (fun fst_arg -> (use_arg_then2 ("K2", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
901 ];;
902
903 (* Lemma normal_alt *)
904 let normal_alt = Sections.section_proof []
905 `normal op i H G <=> subgroup op i H G /\ (!g. g IN G ==> set_op1 (conjg (op, i) g) H = H)`
906 [
907    ((((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andb_id2l", [andb_id2l])) (disch_tac [])) THEN (clear_assumption "andb_id2l") THEN (DISCH_THEN apply_tac) THEN (move ["subH"])));
908    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
909    ((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
910    ((THENL) (split_tac) [((move ["h1"]) THEN (move ["g"]) THEN (move ["gG"])); ((move ["h1"]) THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((move ["xG"]) THEN (move ["yH"]))))]);
911    ((THENL_FIRST) ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] []))))) THEN (move ["h"])) THEN ((THENL) (split_tac) [((case THEN (move ["s"])) THEN (case THEN ((move ["sH"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))); (move ["hH"])])) ((((use_arg_then2 ("h1", [])) (disch_tac [])) THEN (clear_assumption "h1") THEN (DISCH_THEN apply_tac)) THEN (done_tac)));
912    ((fun arg_tac -> arg_tac (Arg_term (`conjg (op, i) (i g) h`))) (term_tac exists_tac));
913    ((((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("h1", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("conjg", [conjg]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("mul_conjg", [mul_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
914    (((((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("conj1g", [conj1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
915    (((((fun arg_tac -> (use_arg_then2 ("h1", [])) (fun fst_arg -> (use_arg_then2 ("xG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("conjg", [conjg]))(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("y", [])) (term_tac exists_tac)) THEN (done_tac));
916 ];;
917 (Sections.add_section_hyp "normH" (`normal op i H G`));;
918
919 (* Lemma cosets_full_preimage *)
920 let cosets_full_preimage = Sections.section_proof ["K"]
921 `subgroup op i K G ==> H SUBSET K ==>
922         K = {g | g IN G /\ coset op g H IN (cosets op K H)}`
923 [
924    ((BETA_TAC THEN (move ["subKG"]) THEN (move ["sHK"])) THEN (((use_arg_then2 ("cosets_full_preimage0", [cosets_full_preimage0])) (disch_tac [])) THEN (clear_assumption "cosets_full_preimage0") THEN (DISCH_THEN apply_tac)));
925    ((((use_arg_then2 ("sHK", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subKG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))));
926    ((((use_arg_then2 ("normH", [])) (disch_tac [])) THEN (clear_assumption "normH") THEN BETA_TAC) THEN ((((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
927 ];;
928
929 (* Lemma preimages_eq *)
930 let preimages_eq = Sections.section_proof ["K1";"K2"]
931 `subgroup op i K1 G ==> subgroup op i K2 G ==>
932         H SUBSET K1 ==> H SUBSET K2 ==> (cosets op K1 H = cosets op K2 H <=> K1 = K2)`
933 [
934    ((BETA_TAC THEN (move ["sub1"]) THEN (move ["sub2"]) THEN (move ["s1"]) THEN (move ["s2"])) THEN (((use_arg_then2 ("preimages_eq0", [preimages_eq0])) (disch_tac [])) THEN (clear_assumption "preimages_eq0") THEN (DISCH_THEN apply_tac)));
935    ((((use_arg_then2 ("normH", [])) (disch_tac [])) THEN (clear_assumption "normH") THEN BETA_TAC) THEN ((((use_arg_then2 ("normal", [normal]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sub1", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sub2", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("s1", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("s2", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
936 ];;
937
938 (* Lemma normal_conjg *)
939 let normal_conjg = Sections.section_proof ["g"]
940 `g IN G ==> set_op1 (conjg (op, i) g) H = H`
941 [
942    ((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
943    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["gG"]) THEN (move ["x"])) THEN ((THENL) (split_tac) [((case THEN (move ["s"])) THEN (case THEN ((move ["sH"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))); (move ["xH"])]));
944    ((((fun arg_tac -> (use_arg_then2 ("normal_conj", [normal_conj])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
945    ((fun arg_tac -> arg_tac (Arg_term (`conjg (op, i) (i g) x`))) (term_tac exists_tac));
946    ((((fun arg_tac -> (use_arg_then2 ("normal_conj", [normal_conj])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mul_conjg", [mul_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
947    (((((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("conj1g", [conj1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
948 ];;
949
950 (* Lemma left_right_coset *)
951 let left_right_coset = Sections.section_proof ["x"]
952 `x IN G ==> coset op x H = set_op op H {x}`
953 [
954    (BETA_TAC THEN (move ["xG"]));
955    (((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conjg_set_equiv", [conjg_set_equiv])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("normal_conjg", [normal_conjg]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
956 ];;
957
958 (* Lemma coset_mul_normal *)
959 let coset_mul_normal = Sections.section_proof ["x";"y"]
960 `x IN G ==> y IN G ==>
961         set_op op (coset op x H) (coset op y H) = coset op (op x y) H`
962 [
963    (BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]));
964    ((fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subH"])));
965    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
966    ((repeat_tactic 1 9 (((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("set_lmul_subset", [set_lmul_subset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))));
967    ((((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] [(`set_op op _1 {y}`)]))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("left_right_coset", [left_right_coset]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))));
968    ((((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("set_op_sing", [set_op_sing]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
969    ((((fun arg_tac -> (use_arg_then2 ("set_opK", [set_opK])) (fun fst_arg -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
970 ];;
971
972 (* Lemma coset_inv_normal *)
973 let coset_inv_normal = Sections.section_proof ["x"]
974 `x IN G ==> set_op1 i (coset op x H) = coset op (i x) H`
975 [
976    (BETA_TAC THEN (move ["xG"]));
977    ((fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subH"])));
978    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
979    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
980    ((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("set_mulI", [set_mulI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("group_invK", [group_invK])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op1_sing", [set_op1_sing]))(thm_tac (new_rewrite [] [])))));
981    (((((use_arg_then2 ("left_right_coset", [left_right_coset]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
982 ];;
983
984 (* Lemma quotient_group *)
985 let quotient_group = Sections.section_proof []
986 `group (cosets op G H, set_op op, set_op1 i, H)`
987 [
988    (((fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["subH"]));
989    (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["sHG"]));
990    (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["SHG"]));
991    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["grH"]));
992    (((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] []))));
993    ((repeat_tactic 0 6 ((split_tac))) THEN ((((use_arg_then2 ("cosets", [cosets]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)));
994    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ALL_TAC) THEN (case THEN (move ["u"])) THEN (case THEN ((move ["uG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN (move ["v"])) THEN (case THEN ((move ["vG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
995    (((fun arg_tac -> arg_tac (Arg_term (`op u v`))) (term_tac exists_tac)) THEN ((repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("coset_mul_normal", [coset_mul_normal]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
996    (BETA_TAC THEN (move ["x"]) THEN (case THEN (move ["u"])) THEN (case THEN ((move ["uG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
997    (((fun arg_tac -> arg_tac (Arg_term (`i u`))) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac))));
998    ((((use_arg_then2 ("coset_inv_normal", [coset_inv_normal]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
999    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("coset_e", [coset_e])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1000    (BETA_TAC THEN (move ["c"]) THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1001    ((((fun arg_tac -> (use_arg_then2 ("coset_e", [coset_e])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [2; 4] [(`H`)]))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("coset_mul_normal", [coset_mul_normal]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1002    (((((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1003    (BETA_TAC THEN (move ["c"]) THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1004    ((((use_arg_then2 ("coset_inv_normal", [coset_inv_normal]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("coset_mul_normal", [coset_mul_normal]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1005    (((((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("coset_e", [coset_e])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1006    (BETA_TAC THEN (move ["A"]) THEN (move ["B"]) THEN (move ["C"]) THEN (case THEN ALL_TAC) THEN (case THEN (move ["a"])) THEN (case THEN ((move ["aG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN ALL_TAC) THEN (case THEN (move ["b"])) THEN (case THEN ((move ["bG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN (move ["c"])) THEN (case THEN ((move ["cG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1007    (((((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("coset_subset", [coset_subset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1008 ];;
1009
1010 (* Lemma subgroup_of_quotient *)
1011 let subgroup_of_quotient = Sections.section_proof ["K1"]
1012 `subgroup (set_op op) (set_op1 i) K1 (cosets op G H) <=>
1013         ?K. subgroup op i K G /\ normal op i H K /\ cosets op K H = K1`
1014 [
1015    ((THENL_ROT (-1)) (split_tac));
1016    (BETA_TAC THEN (case THEN (move ["K"])) THEN (case THEN ((move ["subKG"]) THEN (case THEN ((move ["nHK"]) THEN (move ["eqK"]))))));
1017    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grK"])));
1018    ((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqK", []))(gsym_then (thm_tac (new_rewrite [] []))))));
1019    (((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN ((THENL) (split_tac) [((move ["c"]) THEN (case THEN (move ["g"])) THEN (case THEN (move ["gK"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))); ALL_TAC]));
1020    (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1021    ((THENL_FIRST) (split_tac) ((((fun arg_tac -> arg_tac (Arg_term (`coset op e H`))) (term_tac exists_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac))) THEN (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
1022    (BETA_TAC THEN (move ["c1"]) THEN (move ["c2"]) THEN (case THEN ((case THEN (move ["g1"])) THEN (case THEN ((move ["g1K"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))))) THEN (case THEN (move ["g2"])) THEN (case THEN ((move ["g2K"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1023    ((fun arg_tac -> arg_tac (Arg_term (`op g1 (i g2)`))) (term_tac exists_tac));
1024    ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
1025    (((((use_arg_then2 ("coset_inv_normal", [coset_inv_normal]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("coset_mul_normal", [coset_mul_normal]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1026    (BETA_TAC THEN (move ["subK1"]));
1027    ((use_arg_then2 ("quotient_group", [quotient_group])) (fun arg -> thm_tac MP_TAC arg THEN (move ["grG1"])));
1028    ((fun arg_tac -> arg_tac (Arg_term (`{g | g IN G /\ coset op g H IN K1}`))) (term_tac (set_tac "K")));
1029    ((use_arg_then2 ("K", [])) (term_tac exists_tac));
1030    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grK1"])));
1031    ((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grK1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["eK1"])));
1032    ((fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subH"])));
1033    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
1034    ((fun arg_tac -> arg_tac (Arg_term (`H SUBSET K`))) (term_tac (have_gen_tac [](move ["sHK"]))));
1035    (((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("K_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["h"]) THEN (move ["hH"]));
1036    (((use_arg_then2 ("h", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("coset_eq_e", [coset_eq_e])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac)) THEN (((use_arg_then2 ("eK1", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1037    ((fun arg_tac -> arg_tac (Arg_term (`K SUBSET G`))) (term_tac (have_gen_tac [](move ["sKG"]))));
1038    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("K_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["g"]) THEN (case THEN (move ["g'"])) THEN (case THEN (move ["in_h"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1039    (((THENL_ROT 1)) ((fun arg_tac -> arg_tac (Arg_term (`subgroup op i K G`))) (term_tac (have_gen_tac [](move ["subKG"])))));
1040    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
1041    ((((use_arg_then2 ("subKG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("normal_subset_trans", [normal_subset_trans])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("K_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac));
1042    ((THENL_FIRST) ((BETA_TAC THEN (move ["inK1"]) THEN (move ["c"])) THEN ((THENL) (split_tac) [ALL_TAC; (move ["cK1"])])) ((BETA_TAC THEN (case THEN (move ["g'"])) THEN (case THEN (case THEN (move ["g"]))) THEN (case THEN ((case THEN ((move ["gG"]) THEN (move ["cK1"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (move ["c_eq"])) THEN (done_tac)));
1043    (((fun arg_tac -> (use_arg_then2 ("inK1", [])) (fun fst_arg -> (use_arg_then2 ("cK1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN ((move ["gG"]) THEN (move ["eq"]))));
1044    (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (done_tac));
1045    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sKG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("K_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (split_tac));
1046    ((((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac))) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("coset_e", [coset_e])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1047    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((case THEN (move ["h"])) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["hG"]) THEN (move ["chK1"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN (move ["k"])) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["kG"]) THEN (move ["ckK1"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
1048    (((fun arg_tac -> arg_tac (Arg_term (`op h (i k)`))) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((simp_tac THEN TRY done_tac))));
1049    ((((use_arg_then2 ("coset_mul_normal", [coset_mul_normal]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("coset_inv_normal", [coset_inv_normal]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1050    (((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grK1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("chK1", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grK1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1051 ];;
1052
1053 (* Finalization of the section Normal *)
1054 let group_subgroup = Sections.finalize_theorem group_subgroup;;
1055 let group_normal = Sections.finalize_theorem group_normal;;
1056 let subgroup_conjg = Sections.finalize_theorem subgroup_conjg;;
1057 let subgroup_trans = Sections.finalize_theorem subgroup_trans;;
1058 let cosets_full_preimage0 = Sections.finalize_theorem cosets_full_preimage0;;
1059 let preimages_eq0 = Sections.finalize_theorem preimages_eq0;;
1060 let normal_alt = Sections.finalize_theorem normal_alt;;
1061 let cosets_full_preimage = Sections.finalize_theorem cosets_full_preimage;;
1062 let preimages_eq = Sections.finalize_theorem preimages_eq;;
1063 let normal_conjg = Sections.finalize_theorem normal_conjg;;
1064 let left_right_coset = Sections.finalize_theorem left_right_coset;;
1065 let coset_mul_normal = Sections.finalize_theorem coset_mul_normal;;
1066 let coset_inv_normal = Sections.finalize_theorem coset_inv_normal;;
1067 let quotient_group = Sections.finalize_theorem quotient_group;;
1068 let subgroup_of_quotient = Sections.finalize_theorem subgroup_of_quotient;;
1069 Sections.end_section "Normal";;
1070
1071 (* Section Normalizer *)
1072 Sections.begin_section "Normalizer";;
1073 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
1074 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
1075 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
1076 (Sections.add_section_var (mk_var ("e", (`:A`))));;
1077 (Sections.add_section_var (mk_var ("H", (`:A->bool`))));;
1078
1079 (* Lemma image_eq *)
1080 let image_eq = Sections.section_proof []
1081 `!f g H. (!x. x IN H ==> f x = g x) ==> IMAGE (f:A->A) H = IMAGE g H`
1082 [
1083    ((BETA_TAC THEN (move ["f"]) THEN (move ["g"]) THEN (move ["H"]) THEN (move ["eq"])) THEN (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))))) THEN (move ["xx"])) THEN ((split_tac) THEN (case THEN (move ["yy"])) THEN (case THEN ((move ["eq2"]) THEN (move ["in_s"])))));
1084    (((use_arg_then2 ("yy", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("eq2", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq", []))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1085    (((use_arg_then2 ("yy", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("eq2", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq", []))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1086 ];;
1087
1088 (* Lemma normalizer_subset *)
1089 let normalizer_subset = Sections.section_proof []
1090 `normalizer op i G H SUBSET G`
1091 [
1092    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("normalizer", [normalizer]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["x"]) THEN (case THEN (move ["g"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["gG"])) THEN (move ["_"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1093 ];;
1094 (Sections.add_section_hyp "grG" (`group (G,op,i,e)`));;
1095
1096 (* Lemma set_op_subset *)
1097 let set_op_subset = Sections.section_proof ["A";"B"]
1098 `A SUBSET G ==> B SUBSET G ==> set_op op A B SUBSET G`
1099 [
1100    (((repeat_tactic 1 9 (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_op", [set_op]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["sAG"]) THEN (move ["sBG"]) THEN (move ["g"]) THEN (case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN ((case THEN ((move ["aA"]) THEN (move ["bB"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1101    (((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("sBG", [])) (fun fst_arg -> (use_arg_then2 ("b", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("sAG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1102 ];;
1103
1104 (* Lemma in_normalizer0 *)
1105 let in_normalizer0 = Sections.section_proof ["g";"H"]
1106 `g IN normalizer op i G H <=> g IN G /\ H = set_op1 (conjg (op, i) g) H`
1107 [
1108    (((((use_arg_then2 ("normalizer", [normalizer]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("andb_id2l", [andb_id2l])) (disch_tac [])) THEN (clear_assumption "andb_id2l") THEN (DISCH_THEN apply_tac) THEN (move ["gG"])) THEN ((THENL) (split_tac) [(((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))); (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))]) THEN (done_tac));
1109 ];;
1110
1111 (* Lemma normalizerK *)
1112 let normalizerK = Sections.section_proof []
1113 `normalizer op i G G = G`
1114 [
1115    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_normalizer0", [in_normalizer0]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN ((THENL) (split_tac) [((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))); (move ["xG"])]));
1116    (((((fun arg_tac -> (use_arg_then2 ("normal_conjg", [normal_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("group_normal", [group_normal])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1117 ];;
1118
1119 (* Lemma normalizer_norm *)
1120 let normalizer_norm = Sections.section_proof []
1121 `normal op i H G ==> normalizer op i G H = G`
1122 [
1123    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_normalizer0", [in_normalizer0]))(thm_tac (new_rewrite [] []))))) THEN (move ["normH"]) THEN (move ["x"])) THEN ((THENL) (split_tac) [((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))); (move ["xG"])]));
1124    ((((fun arg_tac -> (use_arg_then2 ("normal_conjg", [normal_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1125 ];;
1126
1127 (* Lemma normalizer_subgroup *)
1128 let normalizer_subgroup = Sections.section_proof []
1129 `H SUBSET G ==> subgroup op i (normalizer op i G H) G`
1130 [
1131    ((((((fun arg_tac -> (use_arg_then2 ("subgroup_alt", [subgroup_alt])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_normalizer0", [in_normalizer0]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("normalizer_subset", [normalizer_subset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["sHG"])) THEN (repeat_tactic 1 9 ((split_tac))));
1132    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conj1g_set", [conj1g_set])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1133    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ALL_TAC) THEN (case THEN (move ["xG"])) THEN (move ["eq_x"]) THEN (case THEN (move ["yG"])) THEN (move ["eq_y"]));
1134    (((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mul_conjg_set", [mul_conjg_set])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eq_x", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("eq_y", []))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1135    (BETA_TAC THEN (move ["x"]) THEN (case THEN (move ["xG"])) THEN (DISCH_THEN (fun snd_th -> (fun arg_tac -> (use_arg_then2 ("congr1", [congr1])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`set_op1 (conjg (op, i) (i x))`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
1136    (((((fun arg_tac -> (use_arg_then2 ("mul_conjg_set", [mul_conjg_set])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("conj1g_set", [conj1g_set])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1137 ];;
1138 (Sections.add_section_hyp "subH" (`subgroup op i H G`));;
1139
1140 (* Lemma subset_normalizer *)
1141 let subset_normalizer = Sections.section_proof []
1142 `H SUBSET (normalizer op i G H)`
1143 [
1144    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
1145    (((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_normalizer0", [in_normalizer0]))(thm_tac (new_rewrite [] []))))) THEN (move ["h"]) THEN (move ["hH"]));
1146    (((((fun arg_tac -> (use_arg_then2 ("group_conjgK", [group_conjgK])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1147 ];;
1148
1149 (* Lemma normal_in_normalizer *)
1150 let normal_in_normalizer = Sections.section_proof []
1151 `normal op i H (normalizer op i G H)`
1152 [
1153    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
1154    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normalizer_subgroup", [normalizer_subgroup])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grN"])));
1155    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
1156    (((((fun arg_tac -> (use_arg_then2 ("normal_alt", [normal_alt])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_alt2", [subgroup_alt2])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subset_normalizer", [subset_normalizer]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("grH", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))))) THEN (move ["g"]));
1157    (((((use_arg_then2 ("in_normalizer0", [in_normalizer0]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1158 ];;
1159
1160 (* Lemma in_normalizer *)
1161 let in_normalizer = Sections.section_proof ["g"]
1162 `g IN normalizer op i G H <=> g IN G /\ coset op g H = set_op op H {g}`
1163 [
1164    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
1165    ((((use_arg_then2 ("in_normalizer0", [in_normalizer0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andb_id2l", [andb_id2l])) (disch_tac [])) THEN (clear_assumption "andb_id2l") THEN (DISCH_THEN apply_tac) THEN (move ["gG"])));
1166    (((((fun arg_tac -> (use_arg_then2 ("eq_sym", [eq_sym])) (fun fst_arg -> (use_arg_then2 ("H", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conjg_set_equiv", [conjg_set_equiv])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] []))))) THEN ((split_tac) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1167 ];;
1168
1169 (* Finalization of the section Normalizer *)
1170 let image_eq = Sections.finalize_theorem image_eq;;
1171 let normalizer_subset = Sections.finalize_theorem normalizer_subset;;
1172 let set_op_subset = Sections.finalize_theorem set_op_subset;;
1173 let in_normalizer0 = Sections.finalize_theorem in_normalizer0;;
1174 let normalizerK = Sections.finalize_theorem normalizerK;;
1175 let normalizer_norm = Sections.finalize_theorem normalizer_norm;;
1176 let normalizer_subgroup = Sections.finalize_theorem normalizer_subgroup;;
1177 let subset_normalizer = Sections.finalize_theorem subset_normalizer;;
1178 let normal_in_normalizer = Sections.finalize_theorem normal_in_normalizer;;
1179 let in_normalizer = Sections.finalize_theorem in_normalizer;;
1180 Sections.end_section "Normalizer";;
1181
1182 (* Section Lagrange *)
1183 Sections.begin_section "Lagrange";;
1184 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
1185 (Sections.add_section_var (mk_var ("e", (`:A`))));;
1186 (Sections.add_section_var (mk_var ("op", (`:A -> A -> A`))));;
1187 (Sections.add_section_var (mk_var ("i", (`:A -> A`))));;
1188 (Sections.add_section_var (mk_var ("n", (`:num`))));;
1189 (Sections.add_section_hyp "grG" (`group (G,op,i,e)`));;
1190 (Sections.add_section_var (mk_var ("H", (`:A->bool`))));;
1191 (Sections.add_section_hyp "subH" (`subgroup op i H G`));;
1192
1193 (* Lemma coset_eq *)
1194 let coset_eq = Sections.section_proof ["h";"x"]
1195 `x IN G ==> h IN H ==> coset op (op x h) H = coset op x H`
1196 [
1197    (BETA_TAC THEN (move ["xG"]) THEN (move ["hH"]));
1198    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
1199    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
1200    ((repeat_tactic 1 9 (((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op_sing", [set_op_sing]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1201    (((repeat_tactic 1 9 (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (((fun arg_tac -> (use_arg_then2 ("group_lmulK", [group_lmulK])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1202 ];;
1203
1204 (* Lemma coset_inter *)
1205 let coset_inter = Sections.section_proof ["x";"y"]
1206 `x IN G ==> y IN G ==> ~(coset op x H = coset op y H) ==>
1207         coset op x H INTER coset op y H = {}`
1208 [
1209    (BETA_TAC THEN (move ["xG"]) THEN (move ["yG"]) THEN (move ["nc"]));
1210    (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["SHG"]));
1211    ((((use_arg_then2 ("SHG", [])) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (move ["sHG"])));
1212    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["grH"]));
1213    ((((use_arg_then2 ("negbK", [negbK]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("nc", [])) (disch_tac [])) THEN (clear_assumption "nc") THEN BETA_TAC) THEN ((((use_arg_then2 ("CONTRAPOS_THM", [CONTRAPOS_THM]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] [])))))));
1214    (BETA_TAC THEN (case THEN (move ["u"])));
1215    (((repeat_tactic 2 0 (((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [1] []))))) THEN (((use_arg_then2 ("IN_INTER", [IN_INTER]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)));
1216    (BETA_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["h1"])) THEN (case THEN ((move ["h1H"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN (move ["h2"])) THEN (case THEN (move ["h2H"])) THEN (move ["eq"]));
1217    ((THENL_FIRST) ((fun arg_tac -> arg_tac (Arg_term (`op (op x h1) (i h1) = op (op y h2) (i h1)`))) (term_tac (have_gen_tac []ALL_TAC))) ((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
1218    (((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("mulgA", [mulgA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("yG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
1219    ((fun arg_tac -> arg_tac (Arg_term (`op h2 _`))) (term_tac (set_tac "h")));
1220    ((THENL_FIRST) ((fun arg_tac -> arg_tac (Arg_term (`h IN H`))) (term_tac (have_gen_tac [](move ["hH"])))) (((((use_arg_then2 ("h_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac)));
1221    ((((use_arg_then2 ("coset_eq", [coset_eq]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1222 ];;
1223
1224 (* Lemma x_in_coset *)
1225 let x_in_coset = Sections.section_proof ["x"]
1226 `x IN G ==> x IN coset op x H`
1227 [
1228    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["grH"]));
1229    ((BETA_TAC THEN (move ["xG"])) THEN ((((use_arg_then2 ("coset", [coset]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)));
1230    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1231 ];;
1232
1233 (* Lemma cosets_unions *)
1234 let cosets_unions = Sections.section_proof []
1235 `G = UNIONS (cosets op G H)`
1236 [
1237    (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["SHG"]));
1238    (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_UNIONS", [IN_UNIONS]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (move ["x"]) THEN (simp_tac)) THEN (split_tac));
1239    (BETA_TAC THEN (move ["xG"]));
1240    (((fun arg_tac -> arg_tac (Arg_term (`coset op x H`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("x_in_coset", [x_in_coset]))(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac))));
1241    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1242    (BETA_TAC THEN (case THEN (move ["c"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["y"])) THEN (case THEN ((move ["yG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1243    ((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["u"])) THEN (case THEN ((move ["uH"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
1244    ((((use_arg_then2 ("SHG", [])) (disch_tac [])) THEN (clear_assumption "SHG") THEN BETA_TAC) THEN ((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (move ["sHG"])));
1245    (((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("yG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1246 ];;
1247
1248 (* Lemma coset_equiv *)
1249 let coset_equiv = Sections.section_proof ["g1";"g2"]
1250 `g1 IN G ==> g2 IN G ==> 
1251         (coset op g1 H = coset op g2 H <=> op (i g2) g1 IN H)`
1252 [
1253    (BETA_TAC THEN (move ["g1G"]) THEN (move ["g2G"]));
1254    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
1255    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
1256    (((repeat_tactic 1 9 (((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))))) THEN (split_tac));
1257    ((DISCH_THEN (fun snd_th -> (fun arg_tac -> (use_arg_then2 ("congr1", [congr1])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`set_op op {i g2}`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC);
1258    ((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("set_op_sing", [set_op_sing]))(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(gsym_then (thm_tac (new_rewrite [] [])))))));
1259    ((((((fun arg_tac -> (use_arg_then2 ("set_lmul1", [set_lmul1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))));
1260    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1261    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))))) THEN (move ["h1"]) THEN (move ["x"])) THEN (split_tac));
1262    (BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["h"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (case THEN (move ["hH"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
1263    (((use_arg_then2 ("g2", [])) (term_tac exists_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`op (op (i g2) g1) h`))) (term_tac exists_tac)));
1264    ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("mulgA", [mulgA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("g2G", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1265    (((((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1266    (BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["h"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (case THEN (move ["hH"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
1267    (((use_arg_then2 ("g1", [])) (term_tac exists_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`op (i (op (i g2) g1)) h`))) (term_tac exists_tac)));
1268    ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("mulI", [mulI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("invgK", [invgK])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)));
1269    (((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("mulgA", [mulgA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("g1G", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("in_trans", [in_trans])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1270 ];;
1271
1272 (* Lemma coset_not_empty *)
1273 let coset_not_empty = Sections.section_proof ["g"]
1274 `g IN G ==> ~(coset op g H = {})`
1275 [
1276    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
1277    ((BETA_TAC THEN (move ["gG"])) THEN ((((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((use_arg_then2 ("g", [])) (term_tac exists_tac)));
1278    (((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1279 ];;
1280 (Sections.add_section_hyp "finG" (`FINITE G`));;
1281
1282 (* Lemma subgroup_size *)
1283 let subgroup_size = Sections.section_proof []
1284 `H HAS_SIZE (CARD H)`
1285 [
1286    (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC);
1287    ((((use_arg_then2 ("FINITE_HAS_SIZE", [FINITE_HAS_SIZE]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (move ["SHG"]));
1288    (((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (disch_tac [])) THEN (clear_assumption "FINITE_SUBSET") THEN (DISCH_THEN apply_tac));
1289    (((use_arg_then2 ("G", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("SHG", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
1290 ];;
1291
1292 (* Lemma coset_card *)
1293 let coset_card = Sections.section_proof ["x"]
1294 `x IN G ==> CARD (coset op x H) = CARD H`
1295 [
1296    ((BETA_TAC THEN (move ["xG"])) THEN ((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("set_lmul_card", [set_lmul_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))));
1297    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
1298    (((((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))))) THEN ((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((use_arg_then2 ("G", [])) (term_tac exists_tac)) THEN (done_tac));
1299 ];;
1300
1301 (* Lemma finite_index *)
1302 let finite_index = Sections.section_proof []
1303 `FINITE (cosets op G H)`
1304 [
1305    ((fun arg_tac -> arg_tac (Arg_term (`cosets op G H = IMAGE (\x. coset op x H) G`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1306    (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IMAGE", [IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (done_tac));
1307    ((((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1308 ];;
1309
1310 (* Lemma LaGrange *)
1311 let LaGrange = Sections.section_proof []
1312 `CARD G = CARD (cosets op G H) * CARD H`
1313 [
1314    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
1315    ((THENL_ROT (-1)) ((((use_arg_then2 ("cosets_unions", [cosets_unions]))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("CARD_UNIONS", [CARD_UNIONS]))(thm_tac (new_rewrite [] []))))));
1316    ((((use_arg_then2 ("NSUM_CONST", [NSUM_CONST]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("finite_index", [finite_index]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1317    ((use_arg_then2 ("NSUM_EQ", [NSUM_EQ])) (thm_tac apply_tac));
1318    ((BETA_TAC THEN (move ["c"])) THEN (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
1319    ((((use_arg_then2 ("coset_card", [coset_card]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1320    (((((use_arg_then2 ("finite_index", [finite_index]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (split_tac));
1321    ((BETA_TAC THEN (move ["c"])) THEN (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
1322    ((((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (disch_tac [])) THEN (clear_assumption "FINITE_SUBSET") THEN (DISCH_THEN apply_tac)) THEN ((use_arg_then2 ("G", [])) (term_tac exists_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("coset_subset", [coset_subset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1323    ((BETA_TAC THEN (move ["c1"]) THEN (move ["c2"])) THEN (((((use_arg_then2 ("cosets", [cosets]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN ALL_TAC) THEN (case THEN (move ["y"])) THEN (case THEN ((move ["yG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (move ["nc"])));
1324    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("coset_inter", [coset_inter])) (fun fst_arg -> (use_arg_then2 ("xG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("yG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("nc", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (exact_tac));
1325 ];;
1326
1327 (* Finalization of the section Lagrange *)
1328 let coset_eq = Sections.finalize_theorem coset_eq;;
1329 let coset_inter = Sections.finalize_theorem coset_inter;;
1330 let x_in_coset = Sections.finalize_theorem x_in_coset;;
1331 let cosets_unions = Sections.finalize_theorem cosets_unions;;
1332 let coset_equiv = Sections.finalize_theorem coset_equiv;;
1333 let coset_not_empty = Sections.finalize_theorem coset_not_empty;;
1334 let subgroup_size = Sections.finalize_theorem subgroup_size;;
1335 let coset_card = Sections.finalize_theorem coset_card;;
1336 let finite_index = Sections.finalize_theorem finite_index;;
1337 let LaGrange = Sections.finalize_theorem LaGrange;;
1338 Sections.end_section "Lagrange";;
1339
1340 (* Section Z_group *)
1341 Sections.begin_section "Z_group";;
1342 let add_mod = new_definition `add_mod p m n = (m + n) MOD p`;;
1343 let inv_add_mod = new_definition `inv_add_mod p x = if x = 0 then 0 else p - x`;;
1344
1345 (* Lemma grZ *)
1346 let grZ = Sections.section_proof ["n"]
1347 `0 < n ==> group({i:num | i < n}, (add_mod n), inv_add_mod n, 0)`
1348 [
1349    ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("lt0n_neq0", [lt0n_neq0])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC THEN (move ["n0"]));
1350    ((((use_arg_then2 ("group", [group]))(thm_tac (new_rewrite [] [])))) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("add_mod", [add_mod]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("inv_add_mod", [inv_add_mod]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (repeat_tactic 0 6 ((split_tac))));
1351    ((((fun arg_tac -> (use_arg_then2 ("DIVISION", [DIVISION])) (fun fst_arg -> (use_arg_then2 ("n0", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (done_tac));
1352    ((case THEN (simp_tac)) THEN (((use_arg_then2 ("n0", [])) (disch_tac [])) THEN (clear_assumption "n0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
1353    ((((use_arg_then2 ("n0", [])) (disch_tac [])) THEN (clear_assumption "n0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
1354    ((BETA_TAC THEN (move ["x"]) THEN (move ["xn"])) THEN ((((use_arg_then2 ("add0n", [add0n]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("addn0", [addn0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MOD_LT", [MOD_LT]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1355    ((THENL_FIRST) (((THENL) case [ALL_TAC; ((move ["m"]) THEN (move ["lt_m_n"]))]) THEN (simp_tac)) (((((use_arg_then2 ("add0n", [add0n]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MOD_0", [MOD_0]))(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
1356    (((((use_arg_then2 ("eqS0", [eqS0]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("subnKC", [subnKC]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("subnK", [subnK]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("ltnW", [ltnW]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("muln1", [muln1])) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1; 3] []))))) THEN (((use_arg_then2 ("MOD_MULT", [MOD_MULT]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1357    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (move ["z"]) THEN (case THEN ((move ["xn"]) THEN (case THEN ((move ["yn"]) THEN (move ["zn"]))))));
1358    (((((fun arg_tac -> (use_arg_then2 ("MOD_LT", [MOD_LT])) (fun fst_arg -> (use_arg_then2 ("xn", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("MOD_LT", [MOD_LT])) (fun fst_arg -> (use_arg_then2 ("zn", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [2] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("MOD_ADD_MOD", [MOD_ADD_MOD]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("addnA", [addnA]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1359 ];;
1360
1361 (* Lemma testZ *)
1362 let testZ = Sections.section_proof ["n";"x";"y"]
1363 `0 < n ==> x < n ==> y < n ==> add_mod n (add_mod n x y) (inv_add_mod n y) = x`
1364 [
1365    (BETA_TAC THEN (move ["n0"]) THEN (move ["xn"]) THEN (move ["yn"]));
1366    (((((fun arg_tac -> (use_arg_then2 ("mulgK", [mulgK])) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("grZ", [grZ])) (fun fst_arg -> (use_arg_then2 ("n0", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (done_tac));
1367 ];;
1368
1369 (* Finalization of the section Z_group *)
1370 let grZ = Sections.finalize_theorem grZ;;
1371 let testZ = Sections.finalize_theorem testZ;;
1372 Sections.end_section "Z_group";;
1373
1374 (* Lemma SING_HAS_SIZE_1 *)
1375 let SING_HAS_SIZE_1 = Sections.section_proof ["x"]
1376 `{x} HAS_SIZE 1`
1377 [
1378    ((((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL HAS_SIZE_CLAUSES)))(thm_tac (new_rewrite [] [])))));
1379    ((((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`{}`))) (term_tac exists_tac))) THEN ((((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL HAS_SIZE_CLAUSES)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("NOT_IN_EMPTY", [NOT_IN_EMPTY]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1380 ];;
1381
1382 (* Lemma HAS_SIZE_1_SING *)
1383 let HAS_SIZE_1_SING = Sections.section_proof ["X"]
1384 `X HAS_SIZE 1 <=> ?x. X = {x}`
1385 [
1386    ((THENL_LAST) (split_tac) ((BETA_TAC THEN (case THEN ((move ["x"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (((use_arg_then2 ("SING_HAS_SIZE_1", [SING_HAS_SIZE_1]))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
1387    (((((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL HAS_SIZE_CLAUSES)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("HAS_SIZE_0", [HAS_SIZE_0]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN (move ["t"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (case THEN ((move ["_"]) THEN (move ["eq"]))));
1388    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1389 ];;
1390
1391 (* Lemma BIJ_SYM *)
1392 let BIJ_SYM = Sections.section_proof ["f";"V";"U"]
1393 `BIJ f V U ==> ?g. BIJ g U V`
1394 [
1395    (((repeat_tactic 1 9 (((use_arg_then2 ("BIJ", [BIJ]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("INJ", [INJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SURJ", [SURJ]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ((case THEN ((move ["f_on"]) THEN (move ["f_inj"]))) THEN (case THEN ((move ["_"]) THEN (move ["f_surj"]))))));
1396    (((fun arg_tac -> (use_arg_then2 ("BIJECTIVE_ON_LEFT_RIGHT_INVERSE", [BIJECTIVE_ON_LEFT_RIGHT_INVERSE])) (fun fst_arg -> (use_arg_then2 ("f_on", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC);
1397    (((((use_arg_then2 ("f_inj", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("f_surj", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["g_on"])) THEN (case THEN ((move ["fg"]) THEN (move ["gf"]))));
1398    (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("INJ", [INJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SURJ", [SURJ]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("g_on", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (split_tac));
1399    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN (move ["xU"])) THEN (case THEN (move ["yU"])) THEN (move ["g_eq"]));
1400    (((((fun arg_tac -> (use_arg_then2 ("fg", [])) (fun fst_arg -> (use_arg_then2 ("yU", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("fg", [])) (fun fst_arg -> (use_arg_then2 ("xU", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("g_eq", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1401    (BETA_TAC THEN (move ["x"]) THEN (move ["xV"]));
1402    (((fun arg_tac -> arg_tac (Arg_term (`f x`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("f_on", []))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("gf", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1403 ];;
1404
1405 (* Lemma bij_inverse *)
1406 let bij_inverse = Sections.section_proof ["f";"s";"t"]
1407 `BIJ (f:A->B) s t ==> 
1408         (?g. (!y. y IN t ==> g y IN s) /\ (!x. x IN s ==> g (f x) = x) /\ (!y. y IN t ==> f (g y) = y))`
1409 [
1410    (((((use_arg_then2 ("BIJ", [BIJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("INJ", [INJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SURJ", [SURJ]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["f_on"])) THEN (move ["f_inj"]) THEN (case THEN (move ["_"])) THEN (move ["f_surj"]));
1411    ((((fun arg_tac -> (use_arg_then2 ("BIJECTIVE_ON_LEFT_RIGHT_INVERSE", [BIJECTIVE_ON_LEFT_RIGHT_INVERSE])) (fun fst_arg -> (use_arg_then2 ("f_on", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((((use_arg_then2 ("f_inj", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("f_surj", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["g_on"])) THEN (case THEN (move ["g1"])) THEN (move ["g2"])));
1412    (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (done_tac));
1413 ];;
1414
1415 (* Lemma BIJ_CARD_EQ *)
1416 let BIJ_CARD_EQ = Sections.section_proof ["V";"U";"f"]
1417 `FINITE V ==> BIJ f V U ==> CARD U = CARD V`
1418 [
1419    (BETA_TAC THEN (move ["finV"]) THEN (move ["bij_f"]));
1420    (((fun arg_tac -> (use_arg_then2 ("bij_inverse", [bij_inverse])) (fun fst_arg -> (use_arg_then2 ("bij_f", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["g_on"])) THEN (case THEN (move ["gf"])) THEN (move ["fg"]));
1421    (((use_arg_then2 ("BIJECTIONS_CARD_EQ", [BIJECTIONS_CARD_EQ])) (thm_tac apply_tac)) THEN (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("f", [])) (term_tac exists_tac))) THEN ((((use_arg_then2 ("finV", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((split_tac) THEN (move ["x"]) THEN (move ["x_in"])));
1422    (((((use_arg_then2 ("g_on", []))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("fg", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1423    ((((use_arg_then2 ("bij_f", [])) (disch_tac [])) THEN (clear_assumption "bij_f") THEN BETA_TAC) THEN (((((use_arg_then2 ("BIJ", [BIJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("INJ", [INJ]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["f_on"])) THEN (move ["_"]) THEN (move ["_"])));
1424    (((((use_arg_then2 ("gf", []))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("f_on", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1425 ];;
1426
1427 (* Lemma card_sing *)
1428 let card_sing = Sections.section_proof ["a"]
1429 `CARD {a} = 1`
1430 [
1431    (((use_arg_then2 ("HAS_SIZE_CARD", [HAS_SIZE_CARD])) (thm_tac apply_tac)) THEN (((use_arg_then2 ("HAS_SIZE_1_SING", [HAS_SIZE_1_SING]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("a", [])) (term_tac exists_tac)) THEN (done_tac));
1432 ];;
1433
1434 (* Lemma set_one_point *)
1435 let set_one_point = Sections.section_proof ["s";"x"]
1436 `FINITE s ==> CARD s = 1 ==> x IN s ==> s = {x}`
1437 [
1438    (BETA_TAC THEN (move ["finS"]) THEN (move ["cs"]) THEN (move ["xs"]));
1439    ((((fun arg_tac -> (use_arg_then2 ("HAS_SIZE_1_SING", [HAS_SIZE_1_SING])) (fun fst_arg -> (use_arg_then2 ("s", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("finS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cs", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))))) THEN ALL_TAC THEN (case THEN (move ["y"])) THEN (move ["cond"]) THEN (move ["a"])));
1440    ((((fun arg_tac -> (use_arg_then2 ("cond", [])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((((use_arg_then2 ("xs", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["xy"])) THEN (((fun arg_tac -> (use_arg_then2 ("cond", [])) (fun fst_arg -> (use_arg_then2 ("a", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1441 ];;
1442
1443 (* Lemma sing_eq *)
1444 let sing_eq = Sections.section_proof ["x";"y"]
1445 `{x} = {y} <=> x = y`
1446 [
1447    (((THENL) (split_tac) [ALL_TAC; ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)))]) THEN (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))))) THEN ((fun arg_tac ->  (conv_thm_tac DISCH_THEN)  (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac MP_TAC))) THEN ((((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1448 ];;
1449
1450 (* Section Action *)
1451 Sections.begin_section "Action";;
1452 let acts = new_definition `acts (G, op, e) S a <=> 
1453         (!g x. g IN G ==> x IN S ==> a g x IN S) /\
1454         (!g h x. g IN G ==> h IN G ==> x IN S ==> a g (a h x) = a (op g h) x) /\
1455         (!x. x IN S ==> a e x = x)`;;
1456 let stab = new_definition `Stab G a x = {g | g IN G /\ a g x = x}`;;
1457 let orbit = new_definition `Orbit G a x = {a g x | g | g IN G}`;;
1458 let fix = new_definition `Fix G S a = {x | x IN S /\ (!g. g IN G ==> a g x = x)}`;;
1459 (Sections.add_section_var (mk_var ("G", (`:A -> bool`))));;
1460 (Sections.add_section_var (mk_var ("op", (`:A -> A -> A`))));;
1461 (Sections.add_section_var (mk_var ("i", (`:A -> A`))));;
1462 (Sections.add_section_var (mk_var ("e", (`:A`))));;
1463 (Sections.add_section_var (mk_var ("S", (`:B -> bool`))));;
1464 (Sections.add_section_var (mk_var ("a", (`:A -> B -> B`))));;
1465
1466 (* Lemma in_stab *)
1467 let in_stab = Sections.section_proof ["g";"x"]
1468 `g IN Stab G a x ==> a g x = x`
1469 [
1470    ((((((use_arg_then2 ("stab", [stab]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["h"])) THEN (case THEN ((move ["hyp"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (done_tac));
1471 ];;
1472
1473 (* Lemma fix_subset *)
1474 let fix_subset = Sections.section_proof []
1475 `Fix G S a SUBSET S`
1476 [
1477    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (simp_tac)) THEN (done_tac));
1478 ];;
1479 (Sections.add_section_hyp "acts_a" (`acts (G, op, e) S a`));;
1480
1481 (* Lemma acts1 *)
1482 let acts1 = Sections.section_proof ["x"]
1483 `x IN S ==> a e x = x`
1484 [
1485    ((((use_arg_then2 ("acts_a", [])) (disch_tac [])) THEN (clear_assumption "acts_a") THEN BETA_TAC) THEN ((((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
1486 ];;
1487
1488 (* Lemma acts_in *)
1489 let acts_in = Sections.section_proof ["g";"x"]
1490 `g IN G ==> x IN S ==> a g x IN S`
1491 [
1492    ((((use_arg_then2 ("acts_a", [])) (disch_tac [])) THEN (clear_assumption "acts_a") THEN BETA_TAC) THEN ((((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
1493 ];;
1494
1495 (* Lemma acts_op *)
1496 let acts_op = Sections.section_proof ["g";"h";"x"]
1497 `g IN G ==> h IN G ==> x IN S ==> a g (a h x) = a (op g h) x`
1498 [
1499    ((((use_arg_then2 ("acts_a", [])) (disch_tac [])) THEN (clear_assumption "acts_a") THEN BETA_TAC) THEN ((((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
1500 ];;
1501
1502 (* Lemma acts_sub *)
1503 let acts_sub = Sections.section_proof ["H"]
1504 `H SUBSET G ==> acts (H, op, e) S a`
1505 [
1506    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] []))))) THEN (move ["sHG"])) THEN (repeat_tactic 1 9 ((split_tac))));
1507    (BETA_TAC THEN (move ["g"]) THEN (move ["x"]) THEN (case THEN ((move ["gH"]) THEN (move ["xS"]))));
1508    (((((use_arg_then2 ("acts_in", [acts_in]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("xS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1509    (BETA_TAC THEN (move ["g"]) THEN (move ["h"]) THEN (move ["x"]) THEN (case THEN ((case THEN ((move ["gH"]) THEN (move ["hH"]))) THEN (move ["xS"]))));
1510    (((((use_arg_then2 ("acts_op", [acts_op]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("xS", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG", []))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1511    ((BETA_TAC THEN (move ["x"]) THEN (move ["xS"])) THEN (((use_arg_then2 ("acts1", [acts1]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1512 ];;
1513
1514 (* Lemma orbit_subset *)
1515 let orbit_subset = Sections.section_proof ["x"]
1516 `x IN S ==> Orbit G a x SUBSET S`
1517 [
1518    ((BETA_TAC THEN (move ["xS"])) THEN (((((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["y"]) THEN (case THEN ((move ["g"]) THEN (case THEN ((move ["gG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))))) THEN (((use_arg_then2 ("acts_in", [acts_in]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1519 ];;
1520 (Sections.add_section_hyp "grG" (`group (G, op, i, e)`));;
1521
1522 (* Lemma x_in_orbit *)
1523 let x_in_orbit = Sections.section_proof ["x"]
1524 `x IN S ==> x IN Orbit G a x`
1525 [
1526    ((BETA_TAC THEN (move ["xS"])) THEN ((((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts1", [acts1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1527 ];;
1528
1529 (* Lemma stab_subgroup *)
1530 let stab_subgroup = Sections.section_proof ["x"]
1531 `x IN S ==> subgroup op i (Stab G a x) G`
1532 [
1533    ((BETA_TAC THEN (move ["xS"])) THEN ((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("stab", [stab]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 2 ((split_tac))));
1534    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1535    ((((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts1", [acts1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1536    ((repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (move ["g"]) THEN (move ["h"]) THEN (case THEN ((case THEN ((move ["gG"]) THEN (move ["agx"]))) THEN (case THEN ((move ["hG"]) THEN (move ["ahx"]))))));
1537    ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1538    ((THENL_FIRST) (((THENL_ROT 1)) ((fun arg_tac -> arg_tac (Arg_term (`a (i h) x = x`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))))) ((done_tac) THEN (done_tac)));
1539    (((((fun arg_tac -> (use_arg_then2 ("acts1", [acts1])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [2] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1540 ];;
1541
1542 (* Lemma stab_group *)
1543 let stab_group = Sections.section_proof ["x"]
1544 `x IN S ==> group (Stab G a x, op, i, e)`
1545 [
1546    ((BETA_TAC THEN (move ["xS"])) THEN ((((use_arg_then2 ("subgroup_group", [subgroup_group]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("stab_subgroup", [stab_subgroup]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1547 ];;
1548
1549 (* Lemma orbits_disj *)
1550 let orbits_disj = Sections.section_proof ["x";"y"]
1551 `x IN S ==> y IN S ==> 
1552         ~(Orbit G a x = Orbit G a y) ==> (Orbit G a x INTER Orbit G a y = {})`
1553 [
1554    ((BETA_TAC THEN (move ["xS"]) THEN (move ["yS"])) THEN (((use_arg_then2 ("contraR", [contraR])) (disch_tac [])) THEN (clear_assumption "contraR") THEN (DISCH_THEN apply_tac)) THEN ((((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("IN_INTER", [IN_INTER]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)));
1555    ((BETA_TAC THEN (case THEN (move ["z"])) THEN (case THEN ((case THEN ((move ["g"]) THEN (case THEN ((move ["gG"]) THEN (move ["zgx"]))))) THEN (case THEN ((move ["h"]) THEN (case THEN ((move ["hG"]) THEN (move ["zhx"])))))))) THEN (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["t"])) THEN ((split_tac) THEN ALL_TAC THEN (case THEN (move ["u"])) THEN (case THEN ((move ["uG"]) THEN (move ["tu"])))));
1556    ((fun arg_tac -> arg_tac (Arg_term (`op u (op (i g) h)`))) (term_tac exists_tac));
1557    ((repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1558    ((((use_arg_then2 ("tu", []))(thm_tac (new_rewrite [] [])))) THEN (congr_tac (`a u _`)));
1559    (((((fun arg_tac -> (use_arg_then2 ("acts1", [acts1])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("g", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("zhx", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("zgx", []))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1560    ((fun arg_tac -> arg_tac (Arg_term (`op u (op (i h) g)`))) (term_tac exists_tac));
1561    ((repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
1562    ((((use_arg_then2 ("tu", []))(thm_tac (new_rewrite [] [])))) THEN (congr_tac (`a u _`)));
1563    (((((fun arg_tac -> (use_arg_then2 ("acts1", [acts1])) (fun fst_arg -> (use_arg_then2 ("y", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("zhx", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("zgx", []))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1564 ];;
1565
1566 (* Lemma fix_orbit_imp *)
1567 let fix_orbit_imp = Sections.section_proof ["x"]
1568 `x IN Fix G S a ==> Orbit G a x = {x}`
1569 [
1570    (((((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ((move ["xS"]) THEN (move ["fix"]))) THEN (move ["y"]));
1571    ((THENL_LAST) (split_tac) ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts1", [acts1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
1572    ((BETA_TAC THEN (case THEN ((move ["g"]) THEN (case THEN ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("fix", [fix])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))))) THEN (done_tac));
1573 ];;
1574
1575 (* Lemma fix_orbit *)
1576 let fix_orbit = Sections.section_proof ["x"]
1577 `x IN S ==> (x IN Fix G S a <=> Orbit G a x = {x})`
1578 [
1579    ((THENL_FIRST) ((BETA_TAC THEN (move ["xS"])) THEN (split_tac)) (((use_arg_then2 ("fix_orbit_imp", [fix_orbit_imp])) (disch_tac [])) THEN (clear_assumption "fix_orbit_imp") THEN (exact_tac)));
1580    ((((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))));
1581    ((BETA_TAC THEN (move ["eq"])) THEN (((((use_arg_then2 ("xS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["g"]) THEN (move ["gG"])));
1582    ((((use_arg_then2 ("eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (done_tac));
1583 ];;
1584
1585 (* Lemma x_in_orbit *)
1586 let x_in_orbit = Sections.section_proof ["x"]
1587 `x IN S ==> x IN Orbit G a x`
1588 [
1589    ((BETA_TAC THEN (move ["xS"])) THEN ((((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("acts1", [acts1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1590 ];;
1591
1592 (* Lemma sing_orbit *)
1593 let sing_orbit = Sections.section_proof ["x"]
1594 `x IN S ==> (x IN Fix G S a <=> Orbit G a x HAS_SIZE 1)`
1595 [
1596    ((THENL_FIRST) ((BETA_TAC THEN (move ["xS"])) THEN ((((use_arg_then2 ("fix_orbit", [fix_orbit]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("HAS_SIZE_1_SING", [HAS_SIZE_1_SING]))(thm_tac (new_rewrite [] []))))) THEN ((THENL) (split_tac) [(((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))); ALL_TAC])) (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac)));
1597    ((BETA_TAC THEN (case THEN ((move ["y"]) THEN (move ["eq"])))) THEN (((fun arg_tac -> (use_arg_then2 ("x_in_orbit", [x_in_orbit])) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC));
1598    ((((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1599 ];;
1600
1601 (* Lemma orbit_image *)
1602 let orbit_image = Sections.section_proof ["x"]
1603 `Orbit G a x = IMAGE (\g. a g x) G`
1604 [
1605    (((((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("andbC", [andbC]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1606 ];;
1607
1608 (* Lemma finite_orbit *)
1609 let finite_orbit = Sections.section_proof ["x"]
1610 `FINITE S ==> x IN S ==> FINITE (Orbit G a x)`
1611 [
1612    ((BETA_TAC THEN (move ["finS"]) THEN (move ["xS"])) THEN ((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((use_arg_then2 ("S", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("orbit_subset", [orbit_subset]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1613 ];;
1614
1615 (* Lemma bij_orbit_cosets *)
1616 let bij_orbit_cosets = Sections.section_proof ["x"]
1617 `x IN S ==> ?f. BIJ f (cosets op G (Stab G a x)) (Orbit G a x)`
1618 [
1619    (BETA_TAC THEN (move ["xS"]));
1620    (((fun arg_tac -> (use_arg_then2 ("stab_subgroup", [stab_subgroup])) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN ((fun arg_tac -> (use_arg_then2 ("stab_group", [stab_group])) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["grS"]) THEN (move ["subS"]));
1621    ((fun arg_tac -> arg_tac (Arg_term (`\c:A->bool. a (CHOICE c) x`))) (term_tac (set_tac "f")));
1622    ((fun arg_tac -> arg_tac (Arg_term (`!g. g IN G ==> f (coset op g (Stab G a x)) = a g x`))) (term_tac (have_gen_tac [](move ["f_eq"]))));
1623    ((BETA_TAC THEN (move ["g"]) THEN (move ["gG"])) THEN ((((use_arg_then2 ("f_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (simp_tac)));
1624    ((((fun arg_tac -> (use_arg_then2 ("CHOICE_DEF", [CHOICE_DEF])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`coset op g (Stab G a x)`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("coset_not_empty", [coset_not_empty])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac))));
1625    (((((use_arg_then2 ("coset", [coset]))(thm_tac (new_rewrite [2] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["h"])) THEN (case THEN ((move ["h_stab"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1626    (((((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xS", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("in_stab", [in_stab])) (fun fst_arg -> (use_arg_then2 ("h_stab", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1627    ((use_arg_then2 ("f", [])) (term_tac exists_tac));
1628    ((THENL_ROT (-1)) ((((use_arg_then2 ("BIJ", [BIJ]))(thm_tac (new_rewrite [] [])))) THEN (split_tac)));
1629    (((((use_arg_then2 ("SURJ", [SURJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (split_tac));
1630    ((BETA_TAC THEN (move ["c"]) THEN (case THEN (move ["g"])) THEN (case THEN ((move ["gG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN ((((use_arg_then2 ("f_eq", []))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("orbit_image", [orbit_image]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)));
1631    (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (done_tac));
1632    ((BETA_TAC THEN (move ["y"])) THEN (((((use_arg_then2 ("orbit_image", [orbit_image]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["g"])) THEN (simp_tac) THEN (case THEN ((move ["y_eq"]) THEN (move ["gG"])))));
1633    ((THENL_FIRST) (((fun arg_tac -> arg_tac (Arg_term (`coset op g (Stab G a x)`))) (term_tac exists_tac)) THEN (split_tac)) (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (done_tac)));
1634    ((((use_arg_then2 ("f_eq", []))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1635    (((((use_arg_then2 ("INJ", [INJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (split_tac));
1636    ((BETA_TAC THEN (move ["c"]) THEN (case THEN (move ["g"])) THEN (case THEN ((move ["gG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN ((((use_arg_then2 ("f_eq", []))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("orbit_image", [orbit_image]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)));
1637    (((use_arg_then2 ("g", [])) (term_tac exists_tac)) THEN (done_tac));
1638    (BETA_TAC THEN (move ["c1"]) THEN (move ["c2"]) THEN (case THEN ((case THEN ((move ["g"]) THEN (case THEN ((move ["gG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))))) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["h"]) THEN (case THEN ((move ["hG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))))))));
1639    (((repeat_tactic 1 9 (((use_arg_then2 ("f_eq", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (move ["a_eq"]));
1640    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("coset_equiv", [coset_equiv])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("stab", [stab]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
1641    (((((fun arg_tac -> (use_arg_then2 ("acts1", [acts1])) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [2] []))))) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("acts_op", [acts_op]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1642 ];;
1643
1644 (* Lemma card_orbit *)
1645 let card_orbit = Sections.section_proof ["x"]
1646 `FINITE S ==> x IN S ==> 
1647         CARD (Orbit G a x) = CARD (cosets op G (Stab G a x))`
1648 [
1649    (BETA_TAC THEN (move ["finS"]) THEN (move ["xS"]));
1650    (((fun arg_tac -> (use_arg_then2 ("bij_orbit_cosets", [bij_orbit_cosets])) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["f"])) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("BIJ_SYM", [BIJ_SYM])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (case THEN (move ["g"])) THEN (move ["bij"]));
1651    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("finite_orbit", [finite_orbit])) (fun fst_arg -> (use_arg_then2 ("finS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (move ["finO"]));
1652    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("BIJ_CARD_EQ", [BIJ_CARD_EQ])) (fun fst_arg -> (use_arg_then2 ("finO", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("bij", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1653 ];;
1654
1655 (* Lemma set_union_orbits *)
1656 let set_union_orbits = Sections.section_proof []
1657 `S = UNIONS (IMAGE (Orbit G a) S)`
1658 [
1659    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_UNIONS", [IN_UNIONS]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN (split_tac));
1660    ((BETA_TAC THEN (move ["xS"])) THEN ((fun arg_tac -> arg_tac (Arg_term (`Orbit G a x`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("x_in_orbit", [x_in_orbit]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1661    (BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["y"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["yS"]))));
1662    ((((((use_arg_then2 ("orbit_image", [orbit_image]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["h"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["hG"]))) THEN (simp_tac)) THEN (((use_arg_then2 ("acts_in", [acts_in])) (disch_tac [])) THEN (clear_assumption "acts_in") THEN (exact_tac)));
1663 ];;
1664
1665 (* Lemma card_set *)
1666 let card_set = Sections.section_proof []
1667 `FINITE S ==> CARD S = nsum (IMAGE (Orbit G a) S) CARD`
1668 [
1669    ((BETA_TAC THEN (move ["finS"])) THEN ((((use_arg_then2 ("set_union_orbits", [set_union_orbits]))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("CARD_UNIONS", [CARD_UNIONS]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (split_tac));
1670    ((BETA_TAC THEN (move ["t"])) THEN ((((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["xS"])))) THEN ((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)));
1671    (((use_arg_then2 ("S", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("orbit_subset", [orbit_subset]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1672    ((BETA_TAC THEN (move ["t"]) THEN (move ["u"])) THEN ((repeat_tactic 2 0 (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["x"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["xS"]))) THEN (case THEN ALL_TAC) THEN (case THEN (move ["y"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["yS"]))) THEN (move ["disj"])));
1673    (((use_arg_then2 ("orbits_disj", [orbits_disj])) (disch_tac [])) THEN (clear_assumption "orbits_disj") THEN (exact_tac));
1674 ];;
1675
1676 (* Lemma card_set_fix *)
1677 let card_set_fix = Sections.section_proof []
1678 `FINITE S ==> CARD S = CARD (Fix G S a) + 
1679         nsum {Orbit G a x | x | x IN S /\ CARD (Orbit G a x) > 1} CARD`
1680 [
1681    (BETA_TAC THEN (move ["finS"]));
1682    (((fun arg_tac -> (use_arg_then2 ("card_set", [card_set])) (fun fst_arg -> (use_arg_then2 ("finS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))));
1683    ((fun arg_tac -> arg_tac (Arg_term (`{Orbit G a x | x | x IN S /\ CARD (Orbit G a x) > 1}`))) (term_tac (set_tac "A")));
1684    ((fun arg_tac -> arg_tac (Arg_term (`{Orbit G a x | x | x IN S /\ CARD (Orbit G a x) = 1}`))) (term_tac (set_tac "B")));
1685    ((fun arg_tac -> arg_tac (Arg_term (`IMAGE (Orbit G a) S = A UNION B`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1686    ((THENL_ROT (-1)) ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_UNION", [IN_UNION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("A_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("B_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["orb"])) THEN (split_tac)));
1687    (case THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xS"]) THEN (move ["eq"]))));
1688    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1689    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1690    (BETA_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((move ["eq"]) THEN (move ["xS"]))));
1691    ((fun arg_tac -> arg_tac (Arg_term (`CARD (Orbit G a x)`))) (term_tac (set_tac "n")));
1692    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("finite_orbit", [finite_orbit])) (fun fst_arg -> (use_arg_then2 ("finS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finO"])));
1693    ((THENL) (((use_arg_then2 ("n_def", [])) (disch_tac [])) THEN (clear_assumption "n_def") THEN ((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN case) [ALL_TAC; ((THENL) case [(move ["card1"]); ((move ["n"]) THEN (move ["card_ge2"]))])]);
1694    (((((use_arg_then2 ("CARD_EQ_0", [CARD_EQ_0]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (move ["x_eq"]));
1695    ((((fun arg_tac -> (use_arg_then2 ("x_in_orbit", [x_in_orbit])) (fun fst_arg -> (use_arg_then2 ("xS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("x_eq", []))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("NOT_IN_EMPTY", [NOT_IN_EMPTY]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1696    ((DISJ2_TAC) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("card1", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1697    ((DISJ1_TAC) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("card_ge2", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("gtE", [gtE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ltSS", [ltSS]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ltn0Sn", [ltn0Sn]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1698    ((fun arg_tac -> arg_tac (Arg_term (`FINITE B`))) (term_tac (have_gen_tac [](move ["finB"]))));
1699    (((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`IMAGE (Orbit G a) S`))) (term_tac exists_tac)));
1700    (((((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("B_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["orb"]) THEN (case THEN (move ["x"])) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["xS"]) THEN (move ["_"]))) THEN (move ["eq"]));
1701    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1702    ((((use_arg_then2 ("NSUM_UNION", [NSUM_UNION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("DISJOINT", [DISJOINT]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("finB", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))));
1703    (split_tac);
1704    (((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`IMAGE (Orbit G a) S`))) (term_tac exists_tac)));
1705    (((((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("A_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["orb"]) THEN (case THEN (move ["x"])) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["xS"]) THEN (move ["_"]))) THEN (move ["eq"]));
1706    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac));
1707    (((((use_arg_then2 ("A_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("B_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_INTER", [IN_INTER]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("NOT_IN_EMPTY", [NOT_IN_EMPTY]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["orb"]));
1708    ((((fun arg_tac -> arg_tac (Arg_theorem (TAUT `!P. ~P <=> (P ==> F)`)))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["x"])) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["xS"]) THEN (move ["gt1"]))) THEN (move ["eq"]) THEN (case THEN (move ["y"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["yS"])) THEN (move ["eq1"]));
1709    (((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (move ["orb_eq"])) THEN (((use_arg_then2 ("gt1", [])) (disch_tac [])) THEN (clear_assumption "gt1") THEN ((use_arg_then2 ("eq1", [])) (disch_tac [])) THEN (clear_assumption "eq1") THEN BETA_TAC));
1710    ((((use_arg_then2 ("orb_eq", []))(thm_tac (new_rewrite [] [])))) THEN (arith_tac) THEN (done_tac));
1711    ((((use_arg_then2 ("addnC", [addnC]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqn_addr", [eqn_addr]))(thm_tac (new_rewrite [] [])))));
1712    ((fun arg_tac -> arg_tac (Arg_term (`nsum B CARD = CARD B`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1713    (((((use_arg_then2 ("CARD_EQ_NSUM", [CARD_EQ_NSUM]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((use_arg_then2 ("NSUM_EQ", [NSUM_EQ])) (thm_tac apply_tac)) THEN (move ["orb"])));
1714    ((((((use_arg_then2 ("B_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["xS"])) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1715    ((fun arg_tac -> arg_tac (Arg_term (`B = IMAGE (Orbit G a) (Fix G S a)`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1716    ((((((use_arg_then2 ("B_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN (move ["orb"])) THEN (split_tac));
1717    (BETA_TAC THEN (case THEN (move ["x"])) THEN (case THEN ((case THEN ((move ["xS"]) THEN (move ["card1"]))) THEN (move ["orb_eq"]))));
1718    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("orb_eq", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("fix_orbit", [fix_orbit]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("set_one_point", [set_one_point])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`Orbit G a x`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))));
1719    (((((use_arg_then2 ("finite_orbit", [finite_orbit]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("x_in_orbit", [x_in_orbit]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1720    (BETA_TAC THEN (case THEN (move ["x"])) THEN (case THEN (move ["orb_eq"])) THEN (move ["fix"]));
1721    ((THENL_FIRST) ((fun arg_tac -> arg_tac (Arg_term (`x IN S`))) (term_tac (have_gen_tac [](move ["xS"])))) ((((use_arg_then2 ("fix_subset", [fix_subset])) (disch_tac [])) THEN (clear_assumption "fix_subset") THEN BETA_TAC) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (exact_tac) THEN (done_tac)));
1722    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("orb_eq", [])) (disch_tac [])) THEN (clear_assumption "orb_eq") THEN ((use_arg_then2 ("fix", [fix])) (disch_tac [])) THEN (clear_assumption "fix") THEN BETA_TAC) THEN (((((use_arg_then2 ("fix_orbit", [fix_orbit]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("card_sing", [card_sing]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1723    ((THENL_ROT (-1)) (((use_arg_then2 ("CARD_IMAGE_INJ", [CARD_IMAGE_INJ])) (thm_tac apply_tac)) THEN (split_tac)));
1724    (((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((use_arg_then2 ("S", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("fix_subset", [fix_subset]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1725    (BETA_TAC THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("fix_orbit_imp", [fix_orbit_imp])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("fix_orbit_imp", [fix_orbit_imp])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1726    ((((use_arg_then2 ("sing_eq", [sing_eq]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1727 ];;
1728 (Sections.add_section_var (mk_var ("p", (`:num`))); Sections.add_section_var (mk_var ("r", (`:num`))));;
1729 (Sections.add_section_hyp "prime_p" (`prime p`));;
1730 (Sections.add_section_hyp "finG" (`FINITE G`));;
1731 (Sections.add_section_hyp "cardG" (`CARD G = p EXP r`));;
1732 (Sections.add_section_hyp "finS" (`FINITE S`));;
1733
1734 (* Lemma card_orbit_p_group *)
1735 let card_orbit_p_group = Sections.section_proof ["x"]
1736 `x IN S ==> CARD (Orbit G a x) > 1 ==> p divides CARD (Orbit G a x)`
1737 [
1738    ((BETA_TAC THEN (move ["xS"])) THEN (((((use_arg_then2 ("card_orbit", [card_orbit]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (move ["card_gt1"])));
1739    ((fun arg_tac -> arg_tac (Arg_term (`CARD (cosets op G (Stab G a x)) divides p EXP r`))) (term_tac (have_gen_tac []ALL_TAC)));
1740    (((((use_arg_then2 ("cardG", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL divides)))(thm_tac (new_rewrite [] []))))) THEN ((fun arg_tac -> arg_tac (Arg_term (`CARD (Stab G a x)`))) (term_tac exists_tac)));
1741    (((((fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("stab_subgroup", [stab_subgroup]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1742    (((((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL DIVIDES_PRIMEPOW)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN ALL_TAC THEN (case THEN (move ["q"])) THEN (case THEN ((move ["_"]) THEN (move ["card_eq"]))));
1743    (((use_arg_then2 ("card_gt1", [])) (disch_tac [])) THEN (clear_assumption "card_gt1") THEN ((use_arg_then2 ("card_eq", [])) (disch_tac [])) THEN (clear_assumption "card_eq") THEN BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
1744    ((((use_arg_then2 ("q", [])) (disch_tac [])) THEN (clear_assumption "q") THEN case) THEN (((((use_arg_then2 ("EXP", [EXP]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("gtE", [gtE]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("ltnn", [ltnn]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (move ["n"]) THEN (move ["_"])));
1745    ((((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL divides)))(thm_tac (new_rewrite [] [])))) THEN ((fun arg_tac -> arg_tac (Arg_term (`p EXP n`))) (term_tac exists_tac)) THEN (done_tac));
1746 ];;
1747
1748 (* Lemma DIVIDES_NSUM *)
1749 let DIVIDES_NSUM = Sections.section_proof ["f";"s";"q"]
1750 `(!x. x IN s ==> q divides f x) ==> q divides nsum s f`
1751 [
1752    (BETA_TAC THEN (move ["H"]));
1753    ((((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] [])))) THEN ((fun arg_tac -> arg_tac (Arg_term (`nsum s (\x. f x DIV q)`))) (term_tac exists_tac)));
1754    (((((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("NSUM_RMUL", [NSUM_RMUL]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (((use_arg_then2 ("NSUM_EQ", [NSUM_EQ])) (thm_tac apply_tac)) THEN (move ["x"]) THEN (move ["xs"]) THEN (simp_tac)));
1755    (((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("DIVIDES_DIV_MULT", [DIVIDES_DIV_MULT]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("H", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1756 ];;
1757
1758 (* Lemma sum_orbit_p_group *)
1759 let sum_orbit_p_group = Sections.section_proof []
1760 `p divides nsum {Orbit G a x | x | x IN S /\ CARD (Orbit G a x) > 1} CARD`
1761 [
1762    ((((use_arg_then2 ("DIVIDES_NSUM", [DIVIDES_NSUM])) (thm_tac apply_tac)) THEN (move ["orb"])) THEN (((((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["x"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["xS"])) THEN (move ["card_gt1"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))));
1763    (((use_arg_then2 ("card_orbit_p_group", [card_orbit_p_group])) (disch_tac [])) THEN (clear_assumption "card_orbit_p_group") THEN (exact_tac));
1764 ];;
1765
1766 (* Lemma p_div_fix *)
1767 let p_div_fix = Sections.section_proof []
1768 `p divides CARD S ==> p divides CARD (Fix G S a)`
1769 [
1770    (((((use_arg_then2 ("card_set_fix", [card_set_fix]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (move ["p_div_sum"]));
1771    ((use_arg_then2 ("sum_orbit_p_group", [sum_orbit_p_group])) (fun arg -> thm_tac MP_TAC arg THEN (move ["p_div2"])));
1772    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("DIVIDES_ADD_REVL", [DIVIDES_ADD_REVL])) (fun fst_arg -> (use_arg_then2 ("p_div2", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("p_div_sum", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (exact_tac));
1773 ];;
1774
1775 (* Lemma fix_mod_p *)
1776 let fix_mod_p = Sections.section_proof []
1777 `CARD (Fix G S a) MOD p = CARD S MOD p`
1778 [
1779    ((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MOD_EQ", [MOD_EQ])) (disch_tac [])) THEN (clear_assumption "MOD_EQ") THEN (DISCH_THEN apply_tac)));
1780    ((((use_arg_then2 ("sum_orbit_p_group", [sum_orbit_p_group])) (disch_tac [])) THEN (clear_assumption "sum_orbit_p_group") THEN BETA_TAC) THEN ((((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (move ["q"])) THEN (move ["eq"])));
1781    (((use_arg_then2 ("q", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("card_set_fix", [card_set_fix]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1782 ];;
1783
1784 (* Finalization of the section Action *)
1785 let in_stab = Sections.finalize_theorem in_stab;;
1786 let fix_subset = Sections.finalize_theorem fix_subset;;
1787 let acts1 = Sections.finalize_theorem acts1;;
1788 let acts_in = Sections.finalize_theorem acts_in;;
1789 let acts_op = Sections.finalize_theorem acts_op;;
1790 let acts_sub = Sections.finalize_theorem acts_sub;;
1791 let orbit_subset = Sections.finalize_theorem orbit_subset;;
1792 let x_in_orbit = Sections.finalize_theorem x_in_orbit;;
1793 let stab_subgroup = Sections.finalize_theorem stab_subgroup;;
1794 let stab_group = Sections.finalize_theorem stab_group;;
1795 let orbits_disj = Sections.finalize_theorem orbits_disj;;
1796 let fix_orbit_imp = Sections.finalize_theorem fix_orbit_imp;;
1797 let fix_orbit = Sections.finalize_theorem fix_orbit;;
1798 let x_in_orbit = Sections.finalize_theorem x_in_orbit;;
1799 let sing_orbit = Sections.finalize_theorem sing_orbit;;
1800 let orbit_image = Sections.finalize_theorem orbit_image;;
1801 let finite_orbit = Sections.finalize_theorem finite_orbit;;
1802 let bij_orbit_cosets = Sections.finalize_theorem bij_orbit_cosets;;
1803 let card_orbit = Sections.finalize_theorem card_orbit;;
1804 let set_union_orbits = Sections.finalize_theorem set_union_orbits;;
1805 let card_set = Sections.finalize_theorem card_set;;
1806 let card_set_fix = Sections.finalize_theorem card_set_fix;;
1807 let card_orbit_p_group = Sections.finalize_theorem card_orbit_p_group;;
1808 let DIVIDES_NSUM = Sections.finalize_theorem DIVIDES_NSUM;;
1809 let sum_orbit_p_group = Sections.finalize_theorem sum_orbit_p_group;;
1810 let p_div_fix = Sections.finalize_theorem p_div_fix;;
1811 let fix_mod_p = Sections.finalize_theorem fix_mod_p;;
1812 Sections.end_section "Action";;
1813
1814 (* Lemma has_size_tuples *)
1815 let has_size_tuples = Sections.section_proof ["s";"n"]
1816 `FINITE (s:T -> bool) ==> 
1817         {t | sizel t = n /\ (!x. x <- t ==> x IN s)} HAS_SIZE CARD s EXP n`
1818 [
1819    (BETA_TAC THEN (move ["finS"]));
1820    (((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [ALL_TAC; (move ["n"])]) THEN (((use_arg_then2 ("EXP", [EXP]))(thm_tac (new_rewrite [] [])))));
1821    ((((use_arg_then2 ("HAS_SIZE_1_SING", [HAS_SIZE_1_SING]))(thm_tac (new_rewrite [] [])))) THEN ((fun arg_tac -> arg_tac (Arg_term (`[]:(T)list`))) (term_tac exists_tac)));
1822    (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_eq0", [size_eq0]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]));
1823    (((split_tac) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac)) THEN (move ["y"])) THEN (((use_arg_then2 ("MEM", [MEM]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (done_tac));
1824    ((fun arg_tac -> arg_tac (Arg_term (`GSPEC _`))) (term_tac (set_tac "r")));
1825    ((fun arg_tac -> arg_tac (Arg_term (`GSPEC _`))) (term_tac (set_tac "l")));
1826    (BETA_TAC THEN (move ["IHn"]));
1827    ((fun arg_tac -> arg_tac (Arg_term (`l = IMAGE (\p. FST p :: SND p) (s CROSS r)`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
1828    (((((use_arg_then2 ("l_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("CROSS", [CROSS]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["u"]));
1829    ((THENL) (((use_arg_then2 ("u", [])) (disch_tac [])) THEN (clear_assumption "u") THEN case) [ALL_TAC; ((move ["a"]) THEN (move ["u"]))]);
1830    (((((use_arg_then2 ("size_nil", [size_nil]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [(`0 = _`)])))) THEN (((use_arg_then2 ("eqS0", [eqS0]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("NOT_EXISTS_THM", [NOT_EXISTS_THM]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("negb_and", [negb_and]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]));
1831    (((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("NOT_CONS_NIL", [NOT_CONS_NIL]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1832    (((((use_arg_then2 ("size_cons", [size_cons]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqSS", [eqSS]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqseq_cons", [eqseq_cons]))(thm_tac (new_rewrite [] []))))) THEN (split_tac));
1833    ((BETA_TAC THEN (case THEN ((move ["size_u"]) THEN (move ["x_mem"])))) THEN (((fun arg_tac -> arg_tac (Arg_term (`a, u`))) (term_tac exists_tac)) THEN (simp_tac)) THEN ((((use_arg_then2 ("a", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("u", [])) (term_tac exists_tac))) THEN (simp_tac)));
1834    (((((fun arg_tac -> (use_arg_then2 ("x_mem", [])) (fun fst_arg -> (use_arg_then2 ("a", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("r_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_u", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (move ["mem_x"]));
1835    ((((fun arg_tac -> (use_arg_then2 ("x_mem", [])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1836    (BETA_TAC THEN (case THEN (move ["p"])) THEN (case THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (case THEN (move ["a"])) THEN (case THEN (move ["u"])) THEN (case THEN ((case THEN ((move ["as"]) THEN (move ["ur"]))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (simp_tac));
1837    ((((use_arg_then2 ("ur", [])) (disch_tac [])) THEN (clear_assumption "ur") THEN BETA_TAC) THEN (((((use_arg_then2 ("r_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["mem_x"])))));
1838    ((((((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"])) THEN ((THENL) case [((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))); ALL_TAC]) THEN (((use_arg_then2 ("mem_x", [])) (disch_tac [])) THEN (clear_assumption "mem_x") THEN (exact_tac)) THEN (done_tac));
1839    ((((use_arg_then2 ("IHn", [])) (disch_tac [])) THEN (clear_assumption "IHn") THEN BETA_TAC) THEN ((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN ((move ["finR"]) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] [])))))))));
1840    ((THENL_ROT (-1)) (((use_arg_then2 ("HAS_SIZE_IMAGE_INJ", [HAS_SIZE_IMAGE_INJ])) (thm_tac apply_tac)) THEN (split_tac)));
1841    (((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("FINITE_CROSS", [FINITE_CROSS]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("CARD_CROSS", [CARD_CROSS]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1842    ((BETA_TAC THEN (move ["p1"]) THEN (move ["p2"]) THEN (simp_tac) THEN (case THEN (move ["_"])) THEN (case THEN (move ["_"]))) THEN (((use_arg_then2 ("eqseq_cons", [eqseq_cons]))(thm_tac (new_rewrite [] [])))));
1843    ((((use_arg_then2 ("p1", [])) (disch_tac [])) THEN (clear_assumption "p1") THEN case THEN (move ["x1"]) THEN (move ["y1"])) THEN (((use_arg_then2 ("p2", [])) (disch_tac [])) THEN (clear_assumption "p2") THEN case THEN (move ["x2"]) THEN (move ["y2"]) THEN (simp_tac)) THEN (done_tac));
1844 ];;
1845
1846 (* Lemma card_tuples *)
1847 let card_tuples = Sections.section_proof ["s";"n"]
1848 `FINITE s ==> CARD {t | sizel t = n /\ (!x. x <- t ==> x IN s)} = CARD s EXP n`
1849 [
1850    (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("has_size_tuples", [has_size_tuples])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN ((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
1851 ];;
1852
1853 (* Lemma finite_tuples *)
1854 let finite_tuples = Sections.section_proof ["s";"n"]
1855 `FINITE s ==> FINITE {t | sizel t = n /\ (!x. x <- t ==> x IN s)}`
1856 [
1857    (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("has_size_tuples", [has_size_tuples])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN ((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
1858 ];;
1859
1860 (* Section MoreSeq *)
1861 Sections.begin_section "MoreSeq";;
1862
1863 (* Lemma rot_nseq *)
1864 let rot_nseq = Sections.section_proof ["n";"x";"k"]
1865 `rot k (nseq n x) = nseq n x`
1866 [
1867    ((fun arg_tac -> (use_arg_then2 ("eq_from_nth", [eq_from_nth])) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac apply_tac));
1868    (((((use_arg_then2 ("size_rot", [size_rot]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_nseq", [size_nseq]))(thm_tac (new_rewrite [] []))))) THEN (move ["j"]) THEN (move ["jn"]));
1869    ((((use_arg_then2 ("rot", [rot]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nth_cat", [nth_cat]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_drop", [size_drop]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_nseq", [size_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nth_nseq", [nth_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("if_same", [if_same]))(thm_tac (new_rewrite [] [])))));
1870    ((THENL) (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("ltnP", [ltnP])) (fun fst_arg -> (use_arg_then2 ("j", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`n - k`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) [(move ["ineq"]); ALL_TAC]);
1871    (((((use_arg_then2 ("ineq", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("nth_drop", [nth_drop]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nth_nseq", [nth_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("if_same", [if_same]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1872    ((((use_arg_then2 ("leqNgt", [leqNgt]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (simp_tac));
1873    ((THENL_FIRST) ((THENL) (((use_arg_then2 ("k", [])) (disch_tac [])) THEN (clear_assumption "k") THEN case) [ALL_TAC; (move ["k"])]) (((((use_arg_then2 ("take", [take]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nth", [nth]))(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
1874    ((THENL_FIRST) (((use_arg_then2 ("nth_take", [nth_take]))(thm_tac (new_rewrite [] [])))) ((((use_arg_then2 ("jn", [])) (disch_tac [])) THEN (clear_assumption "jn") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)));
1875    (((((use_arg_then2 ("nth_nseq", [nth_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("if_same", [if_same]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1876 ];;
1877
1878 (* Lemma in_nseq_imp *)
1879 let in_nseq_imp = Sections.section_proof ["n";"x";"y"]
1880 `y <- nseq n x ==> y = x`
1881 [
1882    (((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [ALL_TAC; ((move ["n"]) THEN (move ["IHn"]))]) THEN ((((use_arg_then2 ("nseq", [nseq]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("ncons", [ncons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("iter", [iter]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("in_nil", [in_nil]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("in_cons", [in_cons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("ncons", [ncons]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("nseq", [nseq]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))))) THEN case THEN (done_tac));
1883 ];;
1884
1885 (* Lemma in_nseq *)
1886 let in_nseq = Sections.section_proof ["n";"x";"y"]
1887 `~(n = 0) ==> (y <- nseq n x <=> y = x)`
1888 [
1889    ((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [((simp_tac THEN TRY done_tac)); ((move ["n"]) THEN (move ["IHn"]) THEN (move ["_"]))]);
1890    ((((use_arg_then2 ("IHn", [])) (disch_tac [])) THEN (clear_assumption "IHn") THEN ((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN case THEN ((simp_tac THEN TRY done_tac))) THEN ((((use_arg_then2 ("nseq", [nseq]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("ncons", [ncons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("iter", [iter]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_cons", [in_cons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("in_nil", [in_nil]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("ncons", [ncons]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("nseq", [nseq]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("eqS0", [eqS0]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)) THEN (done_tac));
1891 ];;
1892
1893 (* Lemma rot_same *)
1894 let rot_same = Sections.section_proof ["t"]
1895 `(!k. k < sizel t ==> rot k t = t) <=> (!k. rot k t = t)`
1896 [
1897    ((split_tac) THEN (simp_tac) THEN (move ["rot_eq"]) THEN (move ["k"]));
1898    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("ltnP", [ltnP])) (fun fst_arg -> (use_arg_then2 ("k", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`sizel t`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) THEN (TRY ((exact_tac))));
1899    (((use_arg_then2 ("rot_oversize", [rot_oversize])) (thm_tac apply_tac)) THEN (done_tac));
1900 ];;
1901
1902 (* Lemma rot_const *)
1903 let rot_const = Sections.section_proof ["t"]
1904 `(!k. k < sizel t ==> rot k t = t) ==> t = nseq (sizel t) (HD t)`
1905 [
1906    (((use_arg_then2 ("rot_same", [rot_same]))(thm_tac (new_rewrite [] []))));
1907    ((THENL_FIRST) (((THENL) (((use_arg_then2 ("t", [])) (disch_tac [])) THEN (clear_assumption "t") THEN case) [ALL_TAC; ((move ["h"]) THEN (move ["t"]))]) THEN (((use_arg_then2 ("HD", [HD]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) (((((use_arg_then2 ("size_nil", [size_nil]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("nseq", [nseq]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("ncons", [ncons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("iter", [iter]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (done_tac)));
1908    (((fun arg_tac -> arg_tac (Arg_term (`h :: t`))) (term_tac (set_tac "l"))) THEN (BETA_TAC THEN (move ["rot_eq"])));
1909    (((fun arg_tac -> (use_arg_then2 ("eq_from_nth", [eq_from_nth])) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (DISCH_THEN apply_tac));
1910    ((((((use_arg_then2 ("size_nseq", [size_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["j"]) THEN (move ["j_size"])) THEN ((((use_arg_then2 ("nth_nseq", [nth_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("if_same", [if_same]))(thm_tac (new_rewrite [] []))))));
1911    (((fun arg_tac -> (use_arg_then2 ("rot_eq", [])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`sizel l - j`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] [])))));
1912    ((((use_arg_then2 ("rot", [rot]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nth_cat", [nth_cat]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_drop", [size_drop]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("subKn", [subKn]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("ltnW", [ltnW]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("ltnn", [ltnn]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("subnn", [subnn]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("nth0", [nth0])) (fun fst_arg -> (use_arg_then2 ("h", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))));
1913    ((fun arg_tac -> arg_tac (Arg_term (`?n. sizel l - j = SUC n`))) (term_tac (have_gen_tac []ALL_TAC)));
1914    (((fun arg_tac -> arg_tac (Arg_term (`sizel l - j - 1`))) (term_tac exists_tac)) THEN (((use_arg_then2 ("j_size", [])) (disch_tac [])) THEN (clear_assumption "j_size") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
1915    ((BETA_TAC THEN (case THEN ((move ["n"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN ((((use_arg_then2 ("l_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("take", [take]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("head", [head]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1916 ];;
1917
1918 (* Lemma cat_nseq_nseq *)
1919 let cat_nseq_nseq = Sections.section_proof ["n";"m";"x"]
1920 `cat (nseq n x) (nseq m x) = nseq (n + m) x`
1921 [
1922    (((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [ALL_TAC; ((move ["n"]) THEN (move ["IHn"]))]) THEN ((((use_arg_then2 ("nseq", [nseq]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("ncons", [ncons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("iter", [iter]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("add0n", [add0n]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("cat0s", [cat0s]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("ncons", [ncons]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("nseq", [nseq]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))))));
1923    (((((use_arg_then2 ("addSn", [addSn]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nseq", [nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ncons", [ncons]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("iter", [iter]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("ncons", [ncons]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("nseq", [nseq]))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("IHn", []))(gsym_then (fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (((use_arg_then2 ("cat", [cat]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (done_tac));
1924 ];;
1925
1926 (* Finalization of the section MoreSeq *)
1927 let rot_nseq = Sections.finalize_theorem rot_nseq;;
1928 let in_nseq_imp = Sections.finalize_theorem in_nseq_imp;;
1929 let in_nseq = Sections.finalize_theorem in_nseq;;
1930 let rot_same = Sections.finalize_theorem rot_same;;
1931 let rot_const = Sections.finalize_theorem rot_const;;
1932 let cat_nseq_nseq = Sections.finalize_theorem cat_nseq_nseq;;
1933 Sections.end_section "MoreSeq";;
1934
1935 (* Section ProdExp *)
1936 Sections.begin_section "ProdExp";;
1937 let expg = GEN_ALL (define `expg (op, e) g 0 = e /\ 
1938                           expg (op, e) g (SUC n) = op g (expg (op, e) g n)`);;
1939
1940 (* Lemma expg_prod *)
1941 let expg_prod = Sections.section_proof ["op";"e";"g";"n"]
1942 `expg (op, e) g n = foldr op e (nseq n g)`
1943 [
1944    (((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [ALL_TAC; ((move ["n"]) THEN (move ["IHn"]))]) THEN ((((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("nseq", [nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ncons", [ncons]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("iter", [iter]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("foldr", [foldr]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN ((TRY done_tac))));
1945    (((((use_arg_then2 ("ncons", [ncons]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("nseq", [nseq]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("IHn", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1946 ];;
1947
1948 (* Lemma expg0 *)
1949 let expg0 = Sections.section_proof ["op";"e";"g"]
1950 `expg (op, e) g 0 = e`
1951 [
1952    ((((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1953 ];;
1954
1955 (* Lemma expgS *)
1956 let expgS = Sections.section_proof ["op";"e";"g";"n"]
1957 `expg (op, e) g (SUC n) = op g (expg (op, e) g n)`
1958 [
1959    ((((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
1960 ];;
1961 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
1962 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
1963 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
1964 (Sections.add_section_var (mk_var ("e", (`:A`))));;
1965 (Sections.add_section_hyp "grG" (`group (G, op, i, e)`));;
1966
1967 (* Lemma exp1g *)
1968 let exp1g = Sections.section_proof ["n"]
1969 `expg (op, e) e n = e`
1970 [
1971    (((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [ALL_TAC; ((move ["n"]) THEN (move ["IHn"]))]) THEN ((((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))));
1972    (((((use_arg_then2 ("IHn", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
1973 ];;
1974
1975 (* Lemma expg1 *)
1976 let expg1 = Sections.section_proof ["g"]
1977 `g IN G ==> expg (op, e) g 1 = g`
1978 [
1979    ((BETA_TAC THEN (move ["gG"])) THEN ((((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 2 0 (((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("mulg1", [mulg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1980 ];;
1981
1982 (* Lemma prod_in *)
1983 let prod_in = Sections.section_proof ["t"]
1984 `(!g. g <- t ==> g IN G) ==> foldr op e t IN G`
1985 [
1986    ((THENL_FIRST) (((THENL) (((use_arg_then2 ("t", [])) (disch_tac [])) THEN (clear_assumption "t") THEN elim) [ALL_TAC; ((move ["a"]) THEN (move ["t"]) THEN (move ["IHt"]))]) THEN (((use_arg_then2 ("foldr", [foldr]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
1987    ((BETA_TAC THEN (move ["memG"])) THEN (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))));
1988    ((((((use_arg_then2 ("memG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IHt", []))(thm_tac (new_rewrite [] []))))) THEN (move ["g"]) THEN (move ["mem_g"])) THEN (((use_arg_then2 ("memG", [])) (disch_tac [])) THEN (clear_assumption "memG") THEN (DISCH_THEN apply_tac)) THEN (repeat_tactic 1 9 (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1989 ];;
1990
1991 (* Lemma expg_in *)
1992 let expg_in = Sections.section_proof ["n";"g"]
1993 `g IN G ==> expg (op, e) g n IN G`
1994 [
1995    ((BETA_TAC THEN (move ["gG"])) THEN (((((use_arg_then2 ("expg_prod", [expg_prod]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("prod_in", [prod_in]))(thm_tac (new_rewrite [] []))))) THEN (move ["x"]) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("in_nseq_imp", [in_nseq_imp])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
1996 ];;
1997
1998 (* Lemma prod_cat *)
1999 let prod_cat = Sections.section_proof ["t1";"t2"]
2000 `(!g. g <- t1 \/ g <- t2 ==> g IN G) ==>
2001         foldr op e (t1 ++ t2) = op (foldr op e t1) (foldr op e t2)`
2002 [
2003    (((THENL) (((use_arg_then2 ("t2", [])) (disch_tac [])) THEN (clear_assumption "t2") THEN ((use_arg_then2 ("t1", [])) (disch_tac [])) THEN (clear_assumption "t1") THEN elim) [((move ["t2"]) THEN (move ["inG"])); ((move ["a"]) THEN (move ["t"]) THEN (move ["IHt"]) THEN (move ["t2"]) THEN (move ["inG"]))]) THEN ((((use_arg_then2 ("cat", [cat]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("foldr", [foldr]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))));
2004    ((((((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("prod_in", [prod_in]))(thm_tac (new_rewrite [] []))))) THEN (move ["g"]) THEN (move ["mem_g"])) THEN (((use_arg_then2 ("inG", []))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2005    (((((fun arg_tac -> (use_arg_then2 ("mulgA", [mulgA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("prod_in", [prod_in]))(thm_tac (new_rewrite [] [])))))) THEN (TRY ((BETA_TAC THEN (move ["g"]) THEN (move ["mem_g"])))) THEN ((repeat_tactic 0 10 (((use_arg_then2 ("inG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))));
2006    ((((((use_arg_then2 ("IHt", []))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (move ["g"])) THEN (case THEN (move ["h"])) THEN ((((use_arg_then2 ("inG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2007 ];;
2008
2009 (* Lemma expg_add *)
2010 let expg_add = Sections.section_proof ["g";"n";"m"]
2011 `g IN G ==> 
2012         expg (op, e) g (n + m) = op (expg (op, e) g n) (expg (op, e) g m)`
2013 [
2014    ((BETA_TAC THEN (move ["inG"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("expg_prod", [expg_prod]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("prod_cat", [prod_cat]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("cat_nseq_nseq", [cat_nseq_nseq]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN ((TRY done_tac))));
2015    ((BETA_TAC THEN (move ["x"])) THEN (case THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("in_nseq_imp", [in_nseq_imp])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2016 ];;
2017
2018 (* Lemma expg_expg *)
2019 let expg_expg = Sections.section_proof ["g";"n";"m"]
2020 `g IN G ==>
2021         expg (op, e) (expg (op, e) g n) m = expg (op, e) g (n * m)`
2022 [
2023    ((BETA_TAC THEN (move ["gG"])) THEN ((THENL) (((use_arg_then2 ("m", [])) (disch_tac [])) THEN (clear_assumption "m") THEN elim) [ALL_TAC; ((move ["m"]) THEN (move ["IHm"]))]));
2024    (((((use_arg_then2 ("muln0", [muln0]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2025    (((((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IHm", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulnS", [mulnS]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg_add", [expg_add]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2026 ];;
2027
2028 (* Lemma expg_inv *)
2029 let expg_inv = Sections.section_proof ["n";"g"]
2030 `g IN G ==> i (expg (op, e) g n) = expg (op, e) (i g) n`
2031 [
2032    ((THENL_FIRST) ((BETA_TAC THEN (move ["gG"])) THEN ((THENL) (((use_arg_then2 ("n", [])) (disch_tac [])) THEN (clear_assumption "n") THEN elim) [ALL_TAC; ((move ["n"]) THEN (move ["IHn"]))])) (((repeat_tactic 1 9 (((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("invg_e", [invg_e])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
2033    (((((use_arg_then2 ("addn1", [addn1]))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (((use_arg_then2 ("expg_add", [expg_add]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulI", [mulI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("expg_in", [expg_in]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("IHn", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg1", [expg1]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("expg", [expg]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2034 ];;
2035
2036 (* Finalization of the section ProdExp *)
2037 let expg_prod = Sections.finalize_theorem expg_prod;;
2038 let expg0 = Sections.finalize_theorem expg0;;
2039 let expgS = Sections.finalize_theorem expgS;;
2040 let exp1g = Sections.finalize_theorem exp1g;;
2041 let expg1 = Sections.finalize_theorem expg1;;
2042 let prod_in = Sections.finalize_theorem prod_in;;
2043 let expg_in = Sections.finalize_theorem expg_in;;
2044 let prod_cat = Sections.finalize_theorem prod_cat;;
2045 let expg_add = Sections.finalize_theorem expg_add;;
2046 let expg_expg = Sections.finalize_theorem expg_expg;;
2047 let expg_inv = Sections.finalize_theorem expg_inv;;
2048 Sections.end_section "ProdExp";;
2049
2050 (* Lemma minP_exists *)
2051 let minP_exists = Sections.section_proof ["P";"k"]
2052 `P k ==> ?n. P n /\ (!m. P m ==> n <= m)`
2053 [
2054    ((((use_arg_then2 ("k", [])) (disch_tac [])) THEN (clear_assumption "k") THEN BETA_TAC) THEN (((use_arg_then2 ("num_WF", [num_WF])) (disch_tac [])) THEN (clear_assumption "num_WF") THEN (DISCH_THEN apply_tac) THEN (move ["k"]) THEN (move ["IH"]) THEN (move ["Pk"])));
2055    (((fun arg_tac -> (use_arg_then2 ("orbN", [orbN])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`?m. m < k /\ P m`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case);
2056    ((BETA_TAC THEN (case THEN (move ["m"])) THEN (case THEN ((move ["mk"]) THEN (move ["Pm"])))) THEN (((fun arg_tac -> (use_arg_then2 ("IH", [])) (fun fst_arg -> (use_arg_then2 ("m", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (exact_tac)) THEN (done_tac));
2057    (((((use_arg_then2 ("NOT_EXISTS_THM", [NOT_EXISTS_THM]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("negb_and", [negb_and]))(thm_tac (new_rewrite [] []))))) THEN (move ["h"]));
2058    (((use_arg_then2 ("k", [])) (term_tac exists_tac)) THEN (((((use_arg_then2 ("Pk", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (move ["m"]) THEN (move ["Pm"])));
2059    ((((fun arg_tac -> (use_arg_then2 ("h", [])) (fun fst_arg -> (use_arg_then2 ("m", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("Pm", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("NOT_LT", [NOT_LT]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2060 ];;
2061
2062 (* Section Cyclic *)
2063 Sections.begin_section "Cyclic";;
2064 let orderg = new_definition `orderg (op, e) g = 
2065   @n. ~(n = 0) /\ expg (op, e) g n = e /\ (!m. ~(m = 0) /\ expg (op, e) g m = e ==> n <= m)`;;
2066 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
2067 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
2068 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
2069 (Sections.add_section_var (mk_var ("e", (`:A`))));;
2070 (Sections.add_section_var (mk_var ("g", (`:A`))));;
2071 (Sections.add_section_hyp "grG" (`group (G, op, i, e)`));;
2072
2073 (* Lemma order_e *)
2074 let order_e = Sections.section_proof []
2075 `orderg (op, e) e = 1`
2076 [
2077    ((THENL_ROT (-1)) ((((use_arg_then2 ("orderg", [orderg]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SELECT_UNIQUE", [SELECT_UNIQUE])) (thm_tac apply_tac)) THEN (simp_tac) THEN (move ["n"])) THEN (split_tac)));
2078    ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((((fun arg_tac -> (use_arg_then2 ("expg1", [expg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqS0", [eqS0]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["m"])) THEN (arith_tac) THEN (done_tac));
2079    (BETA_TAC THEN (case THEN (move ["n0"])) THEN (case THEN (move ["_"])) THEN ((fun arg_tac ->  (conv_thm_tac DISCH_THEN)  (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`1`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac MP_TAC)));
2080    (((((fun arg_tac -> (use_arg_then2 ("expg1", [expg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("ONE", [ONE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqS0", [eqS0]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (((use_arg_then2 ("n0", [])) (disch_tac [])) THEN (clear_assumption "n0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2081 ];;
2082
2083 (* Lemma INFINITE_SUBSET *)
2084 let INFINITE_SUBSET = Sections.section_proof ["s";"t"]
2085 `INFINITE s ==> s SUBSET t ==> INFINITE t`
2086 [
2087    (((repeat_tactic 1 9 (((use_arg_then2 ("INFINITE", [INFINITE]))(thm_tac (new_rewrite [] []))))) THEN (move ["hs"]) THEN (move ["hst"])) THEN (((use_arg_then2 ("hs", [])) (disch_tac [])) THEN (clear_assumption "hs") THEN ((use_arg_then2 ("contra", [contra])) (disch_tac [])) THEN (clear_assumption "contra") THEN (DISCH_THEN apply_tac) THEN (move ["fin_t"])));
2088    (((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((use_arg_then2 ("t", [])) (term_tac exists_tac)) THEN (done_tac));
2089 ];;
2090 (Sections.add_section_hyp "finG" (`FINITE G`));;
2091 (Sections.add_section_hyp "gG" (`g IN G`));;
2092
2093 (* Lemma order_exists0 *)
2094 let order_exists0 = Sections.section_proof []
2095 `?n. ~(n = 0) /\ expg (op, e) g n = e`
2096 [
2097    ((((use_arg_then2 ("finG", [])) (disch_tac [])) THEN (clear_assumption "finG") THEN ((use_arg_then2 ("contraLR", [contraLR])) (disch_tac [])) THEN (clear_assumption "contraLR") THEN (DISCH_THEN apply_tac)) THEN (((((use_arg_then2 ("NOT_EXISTS_THM", [NOT_EXISTS_THM]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("INFINITE", [INFINITE]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("negb_and", [negb_and]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("negbK", [negbK]))(thm_tac (new_rewrite [] []))))) THEN (move ["Hexp"])));
2098    ((use_arg_then2 ("INFINITE_SUBSET", [INFINITE_SUBSET])) (thm_tac apply_tac));
2099    ((THENL_ROT (-1)) (((fun arg_tac -> arg_tac (Arg_term (`IMAGE (expg (op, e) g) UNIV`))) (term_tac exists_tac)) THEN (split_tac)));
2100    ((((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN (move ["h"]) THEN (case THEN (move ["n"])) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["_"])))) THEN (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2101    (((((use_arg_then2 ("INFINITE_IMAGE_INJ", [INFINITE_IMAGE_INJ]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("num_INFINITE", [num_INFINITE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN (move ["n"]) THEN (move ["m"]));
2102    ((fun arg_tac -> arg_tac (Arg_term (`n <= m`))) (term_tac (wlog_tac ALL_TAC[`n`; `m`])));
2103    (BETA_TAC THEN (move ["h"]));
2104    (((THENL_LAST) (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("leq_total", [leq_total])) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("m", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] []))))) THEN (BETA_TAC THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("h", [])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (simp_tac)) THEN (done_tac));
2105    (BETA_TAC THEN (move ["n_le_m"]));
2106    ((THENL_FIRST) (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("ltngtP", [ltngtP])) (fun fst_arg -> (use_arg_then2 ("m", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) (((((use_arg_then2 ("ltnNge", [ltnNge]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("n_le_m", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
2107    ((THENL) case [((move ["n_lt_m"]) THEN (move ["exp_eq"])); ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)))]);
2108    (((fun arg_tac -> (use_arg_then2 ("Hexp", [])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`m - n`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC);
2109    ((((use_arg_then2 ("subn_eq0", [subn_eq0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("leqNgt", [leqNgt]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("n_lt_m", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac));
2110    (((use_arg_then2 ("contraR", [contraR])) (disch_tac [])) THEN (clear_assumption "contraR") THEN (DISCH_THEN apply_tac) THEN (move ["_"]));
2111    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("mulg_rightI", [mulg_rightI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`expg (op, e) g n`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (DISCH_THEN apply_tac));
2112    ((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
2113    (((((fun arg_tac -> (use_arg_then2 ("expg_add", [expg_add])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("subnK", [subnK]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2114 ];;
2115
2116 (* Lemma order_exists *)
2117 let order_exists = Sections.section_proof []
2118 `~(orderg (op, e) g = 0) /\ 
2119         expg (op, e) g (orderg (op, e) g) = e /\
2120         (!m. ~(m = 0) /\ expg (op, e) g m = e ==> orderg (op, e) g <= m)`
2121 [
2122    ((fun arg_tac -> arg_tac (Arg_term (`\n. ~(n = 0) /\ expg (op, e) g n = e /\ (!m. ~(m = 0) /\ expg (op, e) g m = e ==> n <= m)`))) (term_tac (set_tac "P")));
2123    (((fun arg_tac -> (use_arg_then2 ("SELECT_AX", [SELECT_AX])) (fun fst_arg -> (use_arg_then2 ("P", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC);
2124    (((((use_arg_then2 ("P_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (simp_tac) THEN (((use_arg_then2 ("orderg", [orderg]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (DISCH_THEN apply_tac));
2125    ((((use_arg_then2 ("CONJ_ASSOC", [CONJ_ASSOC]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("minP_exists", [minP_exists])) (disch_tac [])) THEN (clear_assumption "minP_exists") THEN (DISCH_THEN apply_tac)));
2126    (((use_arg_then2 ("order_exists0", [order_exists0])) (disch_tac [])) THEN (clear_assumption "order_exists0") THEN (exact_tac));
2127 ];;
2128
2129 (* Lemma order1 *)
2130 let order1 = Sections.section_proof []
2131 `orderg (op, e) g = 1 <=> g = e`
2132 [
2133    ((THENL_LAST) (split_tac) ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("order_e", [order_e]))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
2134    ((BETA_TAC THEN (move ["o1"])) THEN (((use_arg_then2 ("order_exists", [order_exists])) (disch_tac [])) THEN (clear_assumption "order_exists") THEN BETA_TAC));
2135    ((((((use_arg_then2 ("o1", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("expg1", [expg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2136 ];;
2137
2138 (* Lemma fin_inv_expg *)
2139 let fin_inv_expg = Sections.section_proof []
2140 `?k. i g = expg (op, e) g k`
2141 [
2142    ((((use_arg_then2 ("order_exists0", [order_exists0])) (disch_tac [])) THEN (clear_assumption "order_exists0") THEN BETA_TAC) THEN ((((use_arg_then2 ("lt0n", [lt0n]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["n"])) THEN (case THEN ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("prednK", [prednK])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (move ["n_eq"]) THEN (move ["exp1"])))));
2143    ((fun arg_tac -> arg_tac (Arg_term (`n - 1`))) (term_tac exists_tac));
2144    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("mulg_leftI", [mulg_leftI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("g", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (DISCH_THEN apply_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("gG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))))));
2145    (((((use_arg_then2 ("expgS", [expgS]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("n_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("exp1", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2146 ];;
2147
2148 (* Lemma expg_inj *)
2149 let expg_inj = Sections.section_proof ["n";"m"]
2150 `n < orderg (op, e) g ==> m < orderg (op, e) g ==>
2151         (expg (op, e) g n = expg (op, e) g m <=> n = m)`
2152 [
2153    ((THENL) ((fun arg_tac -> arg_tac (Arg_term (`n <= m`))) (term_tac (wlog_tac ALL_TAC[`n`; `m`]))) [((move ["h"]) THEN (move ["n_lt"]) THEN (move ["m_lt"])); ((move ["n_le_m"]) THEN (move ["n_lt"]) THEN (move ["m_lt"]))]);
2154    ((THENL_FIRST) (((fun arg_tac -> (use_arg_then2 ("EXCLUDED_MIDDLE", [EXCLUDED_MIDDLE])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`n <= m`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("h", [])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN (exact_tac) THEN (done_tac)));
2155    ((((((fun arg_tac -> (use_arg_then2 ("eq_sym", [eq_sym])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`expg (op, e) g n`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("eq_sym", [eq_sym])) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("NOT_LE", [NOT_LE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ltn_neqAle", [ltn_neqAle]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["_"])) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("h", [])) (thm_tac (match_mp_then snd_th MP_TAC))))) THEN (exact_tac) THEN (done_tac));
2156    ((THENL_LAST) (split_tac) ((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
2157    ((((fun arg_tac -> (use_arg_then2 ("subnK", [subnK])) (fun fst_arg -> (use_arg_then2 ("n_le_m", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("expg_add", [expg_add])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)));
2158    (((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mulg_left", [mulg_left])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (move ["eq"]));
2159    ((((use_arg_then2 ("n_le_m", [])) (disch_tac [])) THEN (clear_assumption "n_le_m") THEN BETA_TAC) THEN (((use_arg_then2 ("leq_eqVlt", [leq_eqVlt]))(thm_tac (new_rewrite [] [])))) THEN (case THEN ((TRY done_tac)) THEN (move ["n_lt_m"])));
2160    ((((use_arg_then2 ("order_exists", [order_exists])) (disch_tac [])) THEN (clear_assumption "order_exists") THEN BETA_TAC THEN (case THEN (move ["_"])) THEN (case THEN (move ["_"])) THEN ((fun arg_tac ->  (conv_thm_tac DISCH_THEN)  (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`m - n`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac MP_TAC))) THEN ((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))));
2161    ((THENL_FIRST) (ANTS_TAC) ((((use_arg_then2 ("n_lt_m", [])) (disch_tac [])) THEN (clear_assumption "n_lt_m") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)));
2162    ((((use_arg_then2 ("m_lt", [])) (disch_tac [])) THEN (clear_assumption "m_lt") THEN ((use_arg_then2 ("n_lt_m", [])) (disch_tac [])) THEN (clear_assumption "n_lt_m") THEN BETA_TAC) THEN (arith_tac));
2163 ];;
2164
2165 (* Lemma expg_eq_mod *)
2166 let expg_eq_mod = Sections.section_proof ["n"]
2167 `expg (op, e) g n = expg (op, e) g (n MOD orderg (op, e) g) /\ 
2168         n MOD orderg (op, e) g < orderg (op, e) g`
2169 [
2170    ((use_arg_then2 ("order_exists", [order_exists])) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["on0"]) THEN (case THEN ((move ["oe"]) THEN (move ["_"])))))));
2171    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("DIVMOD_EXIST", [DIVMOD_EXIST])) (fun fst_arg -> (use_arg_then2 ("on0", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["q"])) THEN (case THEN (move ["r"])) THEN (case THEN ((move ["n_eq"]) THEN (move ["r_lt"]))));
2172    (((fun arg_tac -> (use_arg_then2 ("DIVMOD_UNIQ", [DIVMOD_UNIQ])) (fun fst_arg -> (use_arg_then2 ("n_eq", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)));
2173    ((((use_arg_then2 ("r_lt", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("n_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("expg_add", [expg_add])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("expg_expg", [expg_expg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
2174    (((((use_arg_then2 ("oe", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("exp1g", [exp1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2175 ];;
2176
2177 (* Lemma expg_eq *)
2178 let expg_eq = Sections.section_proof ["n"]
2179 `?r. r < orderg (op, e) g /\ expg (op, e) g n = expg (op, e) g r`
2180 [
2181    ((fun arg_tac -> arg_tac (Arg_term (`n MOD orderg (op, e) g`))) (term_tac exists_tac));
2182    (((((use_arg_then2 ("expg_eq_mod", [expg_eq_mod]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg_eq_mod", [expg_eq_mod]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2183 ];;
2184
2185 (* Lemma cyclic_eq *)
2186 let cyclic_eq = Sections.section_proof []
2187 `IMAGE (expg (op, e) g) UNIV = IMAGE (expg (op, e) g) (0..(orderg (op, e) g - 1))`
2188 [
2189    ((THENL_ROT (-1)) ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("IN_UNIV", [IN_UNIV]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["y"])) THEN ((THENL) (split_tac) [(case THEN ((move ["n"]) THEN (move ["y_eq"]))); ((case THEN (move ["n"])) THEN (move ["h"]))])));
2190    (((use_arg_then2 ("n", [])) (term_tac exists_tac)) THEN (done_tac));
2191    (((fun arg_tac -> (use_arg_then2 ("expg_eq", [expg_eq])) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["r"])) THEN (case THEN ((move ["r_lt"]) THEN (move ["r_eq"]))));
2192    (((use_arg_then2 ("r", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("r_eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("y_eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("IN_NUMSEG", [IN_NUMSEG]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("r_lt", [])) (disch_tac [])) THEN (clear_assumption "r_lt") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2193 ];;
2194
2195 (* Lemma cyclic_eq2 *)
2196 let cyclic_eq2 = Sections.section_proof []
2197 `IMAGE (expg (op, e) g) UNIV = IMAGE (expg (op, e) g) (1..orderg (op, e) g)`
2198 [
2199    ((use_arg_then2 ("order_exists", [order_exists])) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["on0"]) THEN (case THEN ((move ["oe"]) THEN (move ["_"])))))));
2200    ((((((use_arg_then2 ("cyclic_eq", [cyclic_eq]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_NUMSEG", [IN_NUMSEG]))(thm_tac (new_rewrite [] [])))))) THEN (move ["y"])) THEN ((split_tac) THEN ALL_TAC THEN (case THEN (move ["n"])) THEN (case THEN ((move ["y_eq"]) THEN (move ["n_in"])))));
2201    (((fun arg_tac -> (use_arg_then2 ("EXCLUDED_MIDDLE", [EXCLUDED_MIDDLE])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`n = 0`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case THEN (move ["n_eq"]));
2202    (((fun arg_tac -> arg_tac (Arg_term (`orderg (op, e) g`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("y_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("n_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg0", [expg0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("oe", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("leqnn", [leqnn]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("on0", [])) (disch_tac [])) THEN (clear_assumption "on0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2203    (((use_arg_then2 ("n", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("y_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("n_in", [])) (disch_tac [])) THEN (clear_assumption "n_in") THEN ((use_arg_then2 ("n_eq", [])) (disch_tac [])) THEN (clear_assumption "n_eq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2204    (((fun arg_tac -> (use_arg_then2 ("EXCLUDED_MIDDLE", [EXCLUDED_MIDDLE])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`n = orderg (op, e) g`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case THEN (move ["n_eq"]));
2205    (((fun arg_tac -> arg_tac (Arg_term (`0`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("y_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("n_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg0", [expg0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("oe", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("leqnn", [leqnn]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("leq0n", [leq0n]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2206    (((use_arg_then2 ("n", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("y_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("n_in", [])) (disch_tac [])) THEN (clear_assumption "n_in") THEN ((use_arg_then2 ("n_eq", [])) (disch_tac [])) THEN (clear_assumption "n_eq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2207 ];;
2208
2209 (* Lemma cyclic_finite *)
2210 let cyclic_finite = Sections.section_proof []
2211 `FINITE (IMAGE (expg (op, e) g) UNIV)`
2212 [
2213    (((((use_arg_then2 ("cyclic_eq2", [cyclic_eq2]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("FINITE_NUMSEG", [FINITE_NUMSEG]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2214 ];;
2215
2216 (* Lemma cyclic_card *)
2217 let cyclic_card = Sections.section_proof []
2218 `CARD (IMAGE (expg (op, e) g) UNIV) = orderg (op, e) g`
2219 [
2220    ((use_arg_then2 ("order_exists", [order_exists])) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["on0"]) THEN (case THEN ((move ["oe"]) THEN (move ["_"])))))));
2221    ((((use_arg_then2 ("cyclic_eq", [cyclic_eq]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("CARD_IMAGE_INJ", [CARD_IMAGE_INJ]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("CARD_NUMSEG", [CARD_NUMSEG]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("FINITE_NUMSEG", [FINITE_NUMSEG]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("IN_NUMSEG", [IN_NUMSEG]))(thm_tac (new_rewrite [] []))))));
2222    (BETA_TAC THEN (move ["n"]) THEN (move ["m"]) THEN (case THEN (move ["n_in"])) THEN (case THEN (move ["m_in"])));
2223    (((((use_arg_then2 ("expg_inj", [expg_inj]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((use_arg_then2 ("on0", [])) (disch_tac [])) THEN (clear_assumption "on0") THEN ((use_arg_then2 ("m_in", [])) (disch_tac [])) THEN (clear_assumption "m_in") THEN ((use_arg_then2 ("n_in", [])) (disch_tac [])) THEN (clear_assumption "n_in") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2224    ((((use_arg_then2 ("on0", [])) (disch_tac [])) THEN (clear_assumption "on0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2225 ];;
2226
2227 (* Lemma lt_order *)
2228 let lt_order = Sections.section_proof ["n"]
2229 `expg (op, e) g n = e ==> n < orderg (op, e) g ==> n = 0`
2230 [
2231    (BETA_TAC THEN (move ["n_eq"]) THEN (move ["n_lt"]));
2232    ((use_arg_then2 ("order_exists", [order_exists])) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["on0"]) THEN (case THEN ((move ["oe"]) THEN (move ["o_min"])))))));
2233    ((((fun arg_tac -> (use_arg_then2 ("o_min", [])) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("n_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("implyNb", [implyNb]))(thm_tac (new_rewrite [] []))))) THEN (case THEN ((TRY done_tac))));
2234    ((((use_arg_then2 ("n_lt", [])) (disch_tac [])) THEN (clear_assumption "n_lt") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2235 ];;
2236
2237 (* Lemma order_div *)
2238 let order_div = Sections.section_proof ["n"]
2239 `expg (op, e) g n = e <=> orderg (op, e) g divides n`
2240 [
2241    ((use_arg_then2 ("order_exists", [order_exists])) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["on0"]) THEN (case THEN ALL_TAC) THEN (move ["oe"]) THEN (move ["_"])))));
2242    ((THENL) (split_tac) [(move ["n_eq"]); ALL_TAC]);
2243    ((((fun arg_tac -> (use_arg_then2 ("DIVIDES_MOD", [DIVIDES_MOD])) (fun fst_arg -> (use_arg_then2 ("on0", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("lt_order", [lt_order])) (disch_tac [])) THEN (clear_assumption "lt_order") THEN (DISCH_THEN apply_tac)));
2244    (((((use_arg_then2 ("expg_eq_mod", [expg_eq_mod]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("n_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg_eq_mod", [expg_eq_mod]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2245    ((((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (move ["q"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2246    (((((fun arg_tac -> (use_arg_then2 ("expg_expg", [expg_expg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("oe", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("exp1g", [exp1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2247 ];;
2248
2249 (* Lemma order_prime *)
2250 let order_prime = Sections.section_proof ["p"]
2251 `prime p ==> expg (op, e) g p = e ==> g = e \/ orderg (op, e) g = p`
2252 [
2253    (((((use_arg_then2 ("prime", [prime]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("order_div", [order_div]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["_"])) THEN (move ["pH"]));
2254    (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("pH", [])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN (((use_arg_then2 ("order1", [order1]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2255 ];;
2256
2257 (* Finalization of the section Cyclic *)
2258 let order_e = Sections.finalize_theorem order_e;;
2259 let INFINITE_SUBSET = Sections.finalize_theorem INFINITE_SUBSET;;
2260 let order_exists0 = Sections.finalize_theorem order_exists0;;
2261 let order_exists = Sections.finalize_theorem order_exists;;
2262 let order1 = Sections.finalize_theorem order1;;
2263 let fin_inv_expg = Sections.finalize_theorem fin_inv_expg;;
2264 let expg_inj = Sections.finalize_theorem expg_inj;;
2265 let expg_eq_mod = Sections.finalize_theorem expg_eq_mod;;
2266 let expg_eq = Sections.finalize_theorem expg_eq;;
2267 let cyclic_eq = Sections.finalize_theorem cyclic_eq;;
2268 let cyclic_eq2 = Sections.finalize_theorem cyclic_eq2;;
2269 let cyclic_finite = Sections.finalize_theorem cyclic_finite;;
2270 let cyclic_card = Sections.finalize_theorem cyclic_card;;
2271 let lt_order = Sections.finalize_theorem lt_order;;
2272 let order_div = Sections.finalize_theorem order_div;;
2273 let order_prime = Sections.finalize_theorem order_prime;;
2274 Sections.end_section "Cyclic";;
2275
2276 (* Section MoreCyclic *)
2277 Sections.begin_section "MoreCyclic";;
2278 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
2279 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
2280 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
2281 (Sections.add_section_var (mk_var ("e", (`:A`))));;
2282 (Sections.add_section_var (mk_var ("g", (`:A`))));;
2283 (Sections.add_section_hyp "grG" (`group (G, op, i, e)`));;
2284 (Sections.add_section_hyp "finG" (`FINITE G`));;
2285 (Sections.add_section_hyp "gG" (`g IN G`));;
2286
2287 (* Lemma cyclic_subgroup *)
2288 let cyclic_subgroup = Sections.section_proof []
2289 `subgroup op i (IMAGE (expg (op, e) g) UNIV) G`
2290 [
2291    (((((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_UNIV", [IN_UNIV]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))))) THEN (split_tac));
2292    ((BETA_TAC THEN (move ["x"]) THEN (case THEN (move ["n"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2293    (((((use_arg_then2 ("IMAGE_EQ_EMPTY", [IMAGE_EQ_EMPTY]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("UNIV_NOT_EMPTY", [UNIV_NOT_EMPTY]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["x"]) THEN (move ["y"]) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["n"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (case THEN ((move ["m"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
2294    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("fin_inv_expg", [fin_inv_expg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`expg (op, e) g m`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
2295    (((((fun arg_tac -> (use_arg_then2 ("expg_in", [expg_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((simp_tac THEN TRY done_tac))) THEN ALL_TAC THEN (case THEN (move ["k"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2296    ((fun arg_tac -> arg_tac (Arg_term (`n + m * k`))) (term_tac exists_tac));
2297    (((((fun arg_tac -> (use_arg_then2 ("expg_expg", [expg_expg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("expg_add", [expg_add])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2298 ];;
2299
2300 (* Lemma cyclic_group *)
2301 let cyclic_group = Sections.section_proof []
2302 `group (IMAGE (expg (op, e) g) UNIV, op, i, e)`
2303 [
2304    ((((fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (DISCH_THEN apply_tac)) THEN (((use_arg_then2 ("cyclic_subgroup", [cyclic_subgroup])) (disch_tac [])) THEN (clear_assumption "cyclic_subgroup") THEN (exact_tac)) THEN (done_tac));
2305 ];;
2306
2307 (* Lemma order_div_group *)
2308 let order_div_group = Sections.section_proof []
2309 `orderg (op, e) g divides CARD G`
2310 [
2311    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cyclic_subgroup", [cyclic_subgroup])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("cyclic_card", [cyclic_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)));
2312    ((fun arg_tac -> arg_tac (Arg_term (`CARD _`))) (term_tac (set_tac "c")));
2313    ((((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("c", [])) (term_tac exists_tac)) THEN (((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2314 ];;
2315
2316 (* Finalization of the section MoreCyclic *)
2317 let cyclic_subgroup = Sections.finalize_theorem cyclic_subgroup;;
2318 let cyclic_group = Sections.finalize_theorem cyclic_group;;
2319 let order_div_group = Sections.finalize_theorem order_div_group;;
2320 Sections.end_section "MoreCyclic";;
2321
2322 (* Section Cauchy *)
2323 Sections.begin_section "Cauchy";;
2324 (Sections.add_section_var (mk_var ("p", (`:num`))));;
2325 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
2326 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
2327 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
2328 (Sections.add_section_var (mk_var ("e", (`:A`))));;
2329
2330 (* Lemma add_mod_alt *)
2331 let add_mod_alt = Sections.section_proof ["n";"m"]
2332 `n < p ==> m < p ==> 
2333         add_mod p n m = if n + m < p then n + m else (n + m) - p`
2334 [
2335    ((BETA_TAC THEN (move ["np"]) THEN (move ["mp"])) THEN (((use_arg_then2 ("add_mod", [add_mod]))(thm_tac (new_rewrite [] [])))));
2336    ((THENL_FIRST) (((THENL) (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("ltnP", [ltnP])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`n + m`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) [ALL_TAC; (move ["le"])]) THEN (simp_tac)) (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("MOD_LT", [MOD_LT])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN (done_tac)));
2337    ((((use_arg_then2 ("ltnNge", [ltnNge]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("le", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((fun arg_tac -> (use_arg_then2 ("subnK", [subnK])) (fun fst_arg -> (use_arg_then2 ("le", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (((use_arg_then2 ("addnC", [addnC]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("mul1n", [mul1n])) (fun fst_arg -> (use_arg_then2 ("p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (((use_arg_then2 ("MOD_MULT_ADD", [MOD_MULT_ADD]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MOD_LT", [MOD_LT]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)));
2338    ((((use_arg_then2 ("np", [])) (disch_tac [])) THEN (clear_assumption "np") THEN ((use_arg_then2 ("mp", [])) (disch_tac [])) THEN (clear_assumption "mp") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2339 ];;
2340 (Sections.add_section_hyp "prime_p" (`prime p`));;
2341
2342 (* Lemma PRIME_DIVIDES *)
2343 let PRIME_DIVIDES = Sections.section_proof ["n"]
2344 `p divides n ==> n = 0 \/ 2 <= n`
2345 [
2346    ((((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (move ["m"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2347    (((THENL) (((use_arg_then2 ("m", [])) (disch_tac [])) THEN (clear_assumption "m") THEN case) [ALL_TAC; (move ["m"])]) THEN ((repeat_tactic 0 10 (((use_arg_then2 ("muln0", [muln0]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (DISJ2_TAC));
2348    ((((fun arg_tac -> (use_arg_then2 ("PRIME_GE_2", [PRIME_GE_2])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2349 ];;
2350 (Sections.add_section_hyp "grG" (`group (G, op, i, e)`));;
2351 (Sections.add_section_hyp "finG" (`FINITE G`));;
2352
2353 (* Lemma has_size_group_tuples *)
2354 let has_size_group_tuples = Sections.section_proof []
2355 `{t | sizel t = p /\ (!g. g <- t ==> g IN G) /\ foldr op e t = e} HAS_SIZE CARD G EXP (p - 1)`
2356 [
2357    ((fun arg_tac -> arg_tac (Arg_term (`GSPEC _`))) (term_tac (set_tac "l")));
2358    ((fun arg_tac -> arg_tac (Arg_term (`l = IMAGE (\y. i (foldr op e y) :: y) {t | sizel t = p - 1 /\ (!g. g <- t ==> g IN G)}`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
2359    (((((use_arg_then2 ("l_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_IMAGE", [IN_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))))) THEN (move ["t"]));
2360    ((THENL) (((use_arg_then2 ("t", [])) (disch_tac [])) THEN (clear_assumption "t") THEN case) [ALL_TAC; ((move ["h"]) THEN (move ["t"]))]);
2361    (((((use_arg_then2 ("size_nil", [size_nil]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [(`0 = p`)])))) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [(`[] = _`)])))) THEN (((use_arg_then2 ("NOT_CONS_NIL", [NOT_CONS_NIL]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("negb_and", [negb_and]))(thm_tac (new_rewrite [] []))))) THEN (DISJ1_TAC));
2362    (((((fun arg_tac -> arg_tac (Arg_theorem (TAUT `!P. ~P <=> (P ==> F)`)))(thm_tac (new_rewrite [] [])))) THEN (move ["p_eq"])) THEN (((use_arg_then2 ("prime_p", [])) (disch_tac [])) THEN (clear_assumption "prime_p") THEN BETA_TAC));
2363    (((((use_arg_then2 ("p_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("PRIME_0", [PRIME_0]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2364    ((((use_arg_then2 ("size_cons", [size_cons]))(thm_tac (new_rewrite [] [])))) THEN (split_tac));
2365    ((BETA_TAC THEN (case THEN (move ["size_t"])) THEN (case THEN (move ["inG"]))) THEN ((((use_arg_then2 ("foldr", [foldr]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (move ["prod_eq"])));
2366    ((THENL_ROT (-1)) (((use_arg_then2 ("t", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("eqseq_cons", [eqseq_cons]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_t", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("addn1", [addn1]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("addnK", [addnK]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))) THEN (split_tac)));
2367    ((BETA_TAC THEN (move ["g"]) THEN (move ["mem_g"])) THEN ((((use_arg_then2 ("inG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2368    ((((use_arg_then2 ("prod_eq", [])) (disch_tac [])) THEN (clear_assumption "prod_eq") THEN BETA_TAC) THEN ((((fun arg_tac -> (use_arg_then2 ("mulg_left", [mulg_left])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("prod_in", [prod_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (TRY ((BETA_TAC THEN (move ["g"]) THEN (move ["mem_g"])))) THEN ((((use_arg_then2 ("inG", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2369    ((BETA_TAC THEN (case THEN (move ["t2"]))) THEN ((((use_arg_then2 ("eqseq_cons", [eqseq_cons]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))) THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (move ["inG"])))));
2370    ((((use_arg_then2 ("prednK", [prednK]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("lt0n", [lt0n]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
2371    ((((use_arg_then2 ("foldr", [foldr]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((((fun arg_tac -> (use_arg_then2 ("mulIg", [mulIg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("prod_in", [prod_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_cons", [in_cons]))(thm_tac (new_rewrite [] []))))) THEN (move ["g"])) THEN ((THENL) case [(((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))); ((TRY done_tac))]));
2372    (((((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("prod_in", [prod_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2373    ((THENL_LAST) (((use_arg_then2 ("HAS_SIZE_IMAGE_INJ", [HAS_SIZE_IMAGE_INJ])) (thm_tac apply_tac)) THEN (split_tac)) ((((use_arg_then2 ("has_size_tuples", [has_size_tuples]))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
2374    ((BETA_TAC THEN (move ["x"]) THEN (move ["y"])) THEN ((((use_arg_then2 ("eqseq_cons", [eqseq_cons]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
2375 ];;
2376
2377 (* Lemma actsZ *)
2378 let actsZ = Sections.section_proof []
2379 `acts ({k | k < p}, add_mod p, 0) 
2380         {t | sizel t = p /\ (!g. g <- t ==> g IN G) /\ foldr op e t = e} rot`
2381 [
2382    ((THENL_LAST) ((((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 2 ((split_tac)))) ((((use_arg_then2 ("rot0", [rot0]))(thm_tac (new_rewrite [] [])))) THEN (done_tac)));
2383    ((BETA_TAC THEN (move ["k"]) THEN (move ["t"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["k_p"])) THEN (case THEN (move ["size_t"])) THEN (case THEN (move ["inG"]))));
2384    (((((use_arg_then2 ("size_rot", [size_rot]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_t", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mem_rot", [mem_rot]))(thm_tac (new_rewrite [] []))))) THEN ((((use_arg_then2 ("inG", []))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (simp_tac)));
2385    (((THENL) ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("cat_take_drop", [cat_take_drop])) (fun fst_arg -> (use_arg_then2 ("k", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("t", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (((use_arg_then2 ("rot", [rot]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("prod_cat", [prod_cat])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) [(move ["g"]); (move ["g"]); ALL_TAC]) THEN (TRY (case)) THEN (TRY (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("mem_drop", [mem_drop])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC))) THEN (TRY (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("mem_take", [mem_take])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC))) THEN (TRY ((done_tac))));
2386    (((THENL) ((((fun arg_tac -> (use_arg_then2 ("mulg_left", [mulg_left])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("prod_in", [prod_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) [(move ["g"]); (move ["g"]); (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))]) THEN (TRY (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("mem_drop", [mem_drop])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC))) THEN (TRY (((DISCH_THEN (fun snd_th -> (use_arg_then2 ("mem_take", [mem_take])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC))) THEN (TRY ((done_tac))));
2387    ((((((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("mulgI", [mulgI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("prod_in", [prod_in])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))) THEN (move ["g"])) THEN ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("mem_drop", [mem_drop])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC) THEN (done_tac));
2388    ((BETA_TAC THEN (move ["k1"]) THEN (move ["k2"]) THEN (move ["t"])) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (case THEN ((move ["k1_p"]) THEN (move ["k2_p"])))) THEN (case THEN ((move ["size_t"]) THEN (move ["_"])))));
2389    ((((use_arg_then2 ("rot_add_mod", [rot_add_mod]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("ltnW", [ltnW]))(thm_tac (new_rewrite [] [(`k1 <= _`)]))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("ltnW", [ltnW]))(thm_tac (new_rewrite [] [(`k2 <= _`)]))))) THEN ((TRY done_tac)));
2390    (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("leqP", [leqP])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`k1 + k2`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`sizel t`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case THEN (simp_tac));
2391    ((((use_arg_then2 ("leq_eqVlt", [leq_eqVlt]))(thm_tac (new_rewrite [] [])))) THEN ((THENL) case [(move ["eq"]); (move ["ineq"])]));
2392    (((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("rot_size", [rot_size]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("add_mod_alt", [add_mod_alt]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("size_t", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("ltnn", [ltnn]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("subnn", [subnn]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("rot0", [rot0]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2393    (((((use_arg_then2 ("add_mod_alt", [add_mod_alt]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("size_t", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("ineq", []))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2394    (BETA_TAC THEN (move ["ineq"]));
2395    ((((use_arg_then2 ("leqNgt", [leqNgt]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("add_mod_alt", [add_mod_alt]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("ineq", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("size_t", []))(gsym_then (thm_tac (new_rewrite [] []))))));
2396    ((((fun arg_tac -> (use_arg_then2 ("ltnW", [ltnW])) (fun fst_arg -> (use_arg_then2 ("ineq", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("leqNgt", [leqNgt]))(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
2397 ];;
2398
2399 (* Lemma fix_order *)
2400 let fix_order = Sections.section_proof []
2401 `Fix {k | k < p} {t | sizel t = p /\ (!g. g <- t ==> g IN G) /\ foldr op e t = e} rot =
2402         {nseq p g | g | g IN G /\ expg (op, e) g p = e}`
2403 [
2404    ((THENL_ROT (-1)) ((((((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["t"])) THEN (split_tac)));
2405    (BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN ((case THEN ((move ["gG"]) THEN (move ["eq"]))) THEN (move ["t_eq"]))));
2406    (((((use_arg_then2 ("t_eq", []))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("size_nseq", [size_nseq]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("t_eq", []))(thm_tac (new_rewrite [2] [])))) THEN (((use_arg_then2 ("expg_prod", [expg_prod]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN ((split_tac) THEN (move ["h"])));
2407    (((((use_arg_then2 ("t_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_nseq", [in_nseq]))(thm_tac (new_rewrite [] []))))) THEN (TRY (((BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac)))));
2408    (((((use_arg_then2 ("implybF", [implybF]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (move ["p0"])) THEN (((use_arg_then2 ("prime_p", [])) (disch_tac [])) THEN (clear_assumption "prime_p") THEN BETA_TAC));
2409    (((((use_arg_then2 ("p0", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("PRIME_0", [PRIME_0]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2410    (((((use_arg_then2 ("t_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("rot_nseq", [rot_nseq]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2411    (BETA_TAC THEN (case THEN (case THEN (move ["size_t"]))) THEN (case THEN ((move ["inG"]) THEN (move ["prod_e"]) THEN (move ["rot_eq"]))));
2412    ((fun arg_tac -> arg_tac (Arg_term (`HD t`))) (term_tac exists_tac));
2413    (((THENL_ROT 1)) ((fun arg_tac -> arg_tac (Arg_term (`t = nseq p (HD t)`))) (term_tac (have_gen_tac [](move ["eq"])))));
2414    ((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [3] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expg_prod", [expg_prod]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("prod_e", []))(gsym_then (thm_tac (new_rewrite [2] []))))) THEN (((use_arg_then2 ("eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inG", []))(thm_tac (new_rewrite [] [])))));
2415    ((THENL_LAST) ((THENL) (((use_arg_then2 ("size_t", [])) (disch_tac [])) THEN (clear_assumption "size_t") THEN ((use_arg_then2 ("t", [])) (disch_tac [])) THEN (clear_assumption "t") THEN case) [ALL_TAC; ((move ["h"]) THEN (move ["tt"]))]) (((((use_arg_then2 ("HD", [HD]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg]))) THEN (((use_arg_then2 ("in_cons", [in_cons]))(fun arg -> ONCE_REWRITE_TAC[get_arg_thm arg])))) THEN (done_tac)));
2416    (((((use_arg_then2 ("size_nil", [size_nil]))(thm_tac (new_rewrite [] [])))) THEN (move ["eq"])) THEN (((use_arg_then2 ("prime_p", [])) (disch_tac [])) THEN (clear_assumption "prime_p") THEN BETA_TAC));
2417    (((((use_arg_then2 ("eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("PRIME_0", [PRIME_0]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2418    (((((use_arg_then2 ("size_t", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("rot_const", [rot_const]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("size_t", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2419 ];;
2420
2421 (* Lemma cauchy0 *)
2422 let cauchy0 = Sections.section_proof []
2423 `p divides CARD G ==> ?g. g IN G /\ ~(g = e) /\ expg (op, e) g p = e`
2424 [
2425    (BETA_TAC THEN (move ["p_div_G"]));
2426    ((fun arg_tac -> arg_tac (Arg_term (`{t | sizel t = p /\ (!g. g <- t ==> g IN G) /\ foldr op e t = e}`))) (term_tac (set_tac "S")));
2427    ((fun arg_tac -> arg_tac (Arg_term (`p divides CARD S /\ FINITE S`))) (term_tac (have_gen_tac []ALL_TAC)));
2428    ((((use_arg_then2 ("has_size_group_tuples", [has_size_group_tuples])) (disch_tac [])) THEN (clear_assumption "has_size_group_tuples") THEN BETA_TAC) THEN (((((use_arg_then2 ("S_def", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ((((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
2429    ((((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("DIVIDES_REXP", [DIVIDES_REXP]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("p_div_G", []))(thm_tac (new_rewrite [] [])))));
2430    ((((fun arg_tac -> (use_arg_then2 ("PRIME_GE_2", [PRIME_GE_2])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2431    (BETA_TAC THEN (case THEN ((move ["p_divS"]) THEN (move ["finS"]))));
2432    ((((fun arg_tac -> (use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("lt0n", [lt0n]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("grZ", [grZ])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (move ["grZ"])));
2433    ((fun arg_tac -> arg_tac (Arg_term (`CARD {k | k < p} = p EXP 1`))) (term_tac (have_gen_tac [](move ["cardZ"]))));
2434    (((((use_arg_then2 ("CARD_NUMSEG_LT", [CARD_NUMSEG_LT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXP_1", [EXP_1]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2435    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("p_div_fix", [p_div_fix])) (fun fst_arg -> (use_arg_then2 ("actsZ", [actsZ])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("grZ", [grZ])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("FINITE_NUMSEG_LT", [FINITE_NUMSEG_LT])) (fun fst_arg -> (use_arg_then2 ("p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cardZ", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
2436    ((((use_arg_then2 ("S_def", []))(thm_tac (new_rewrite [] [])))) THEN ((fun arg_tac -> (fun arg_tac ->  (conv_thm_tac DISCH_THEN)  (fun fst_arg -> (use_arg_then2 ("finS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("p_divS", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac MP_TAC)));
2437    ((fun arg_tac -> arg_tac (Arg_term (`FINITE (Fix {k | k < p} S rot)`))) (term_tac (have_gen_tac [](move ["fix_finite"]))));
2438    (((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)) THEN ((use_arg_then2 ("S", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("finS", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("fix_subset", [fix_subset]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2439    ((((use_arg_then2 ("fix_finite", [])) (disch_tac [])) THEN (clear_assumption "fix_finite") THEN BETA_TAC) THEN (((((use_arg_then2 ("S_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("fix_order", [fix_order]))(thm_tac (new_rewrite [] []))))) THEN (move ["fix_finite"]) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("PRIME_DIVIDES", [PRIME_DIVIDES])) (thm_tac (match_mp_then snd_th MP_TAC))))));
2440    case;
2441    ((((fun arg_tac -> (use_arg_then2 ("CARD_EQ_0", [CARD_EQ_0])) (fun fst_arg -> (use_arg_then2 ("fix_finite", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("contraLR", [contraLR])) (disch_tac [])) THEN (clear_assumption "contraLR") THEN (DISCH_THEN apply_tac) THEN (move ["_"])));
2442    ((((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((fun arg_tac -> arg_tac (Arg_term (`nseq p e`))) (term_tac exists_tac)));
2443    (((((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("exp1g", [exp1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2444    (((fun arg_tac -> arg_tac (Arg_term (`GSPEC _`))) (term_tac (set_tac "fix"))) THEN (move ["fix2"]));
2445    ((fun arg_tac -> arg_tac (Arg_term (`?n. fix HAS_SIZE (SUC (SUC n))`))) (term_tac (have_gen_tac []ALL_TAC)));
2446    (((fun arg_tac -> arg_tac (Arg_term (`CARD fix - 2`))) (term_tac exists_tac)) THEN ((repeat_tactic 1 9 (((use_arg_then2 ("addn1", [addn1]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (((use_arg_then2 ("addnA", [addnA]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("add1n", [add1n]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("TWO", [TWO]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("subnK", [subnK]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("FINITE_HAS_SIZE", [FINITE_HAS_SIZE]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2447    ((BETA_TAC THEN (case THEN (move ["n"]))) THEN ((repeat_tactic 1 9 (((fun arg_tac -> arg_tac (Arg_theorem (GEN_ALL HAS_SIZE_CLAUSES)))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["a1"])) THEN (case THEN (move ["t1"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["a2"])) THEN (case THEN (move ["t2"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["_"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))));
2448    (((((use_arg_then2 ("IN_INSERT", [IN_INSERT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("negb_or", [negb_or]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN ((move ["na12"]) THEN (move ["_"]))) THEN (move ["fix_eq"]));
2449    ((THENL_FIRST) ((fun arg_tac -> arg_tac (Arg_term (`a1 IN fix /\ a2 IN fix`))) (term_tac (have_gen_tac []ALL_TAC))) (((((use_arg_then2 ("fix_eq", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_INSERT", [IN_INSERT]))(thm_tac (new_rewrite [] [])))))) THEN (done_tac)));
2450    (((repeat_tactic 1 9 (((use_arg_then2 ("fix_def", []))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (case THEN (move ["g1"]))) THEN (case THEN ((case THEN ((move ["g1G"]) THEN (move ["g1e"]))) THEN (move ["a1_eq"]))) THEN (case THEN (move ["g2"])) THEN (case THEN ((case THEN ((move ["g2G"]) THEN (move ["g2e"]))) THEN (move ["a2_eq"]))));
2451    ((THENL_LAST) (((fun arg_tac -> (use_arg_then2 ("EXCLUDED_MIDDLE", [EXCLUDED_MIDDLE])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`g1 = e`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) ((BETA_TAC THEN (move ["g1_not_e"])) THEN ((use_arg_then2 ("g1", [])) (term_tac exists_tac)) THEN (done_tac)));
2452    (BETA_TAC THEN (move ["g1_eq_e"]));
2453    (((use_arg_then2 ("g2", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("g2G", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("g2e", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("g1_eq_e", []))(gsym_then (thm_tac (new_rewrite [] [])))))));
2454    ((((use_arg_then2 ("na12", [])) (disch_tac [])) THEN (clear_assumption "na12") THEN ((use_arg_then2 ("contra", [contra])) (disch_tac [])) THEN (clear_assumption "contra") THEN (DISCH_THEN apply_tac)) THEN (((((use_arg_then2 ("a1_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("a2_eq", []))(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2455 ];;
2456
2457 (* Lemma cauchy *)
2458 let cauchy = Sections.section_proof []
2459 `p divides CARD G ==> ?H. subgroup op i H G /\ CARD H = p`
2460 [
2461    ((DISCH_THEN (fun snd_th -> (use_arg_then2 ("cauchy0", [cauchy0])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["gG"])) THEN (case THEN (move ["gne"])) THEN (move ["exp_e"]));
2462    ((fun arg_tac -> arg_tac (Arg_term (`IMAGE (expg (op, e) g) UNIV`))) (term_tac exists_tac));
2463    ((((fun arg_tac -> (use_arg_then2 ("cyclic_subgroup", [cyclic_subgroup])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("cyclic_card", [cyclic_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)));
2464    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("order_prime", [order_prime])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("gG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("exp_e", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
2465    ((((use_arg_then2 ("gne", []))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2466 ];;
2467
2468 (* Finalization of the section Cauchy *)
2469 let add_mod_alt = Sections.finalize_theorem add_mod_alt;;
2470 let PRIME_DIVIDES = Sections.finalize_theorem PRIME_DIVIDES;;
2471 let has_size_group_tuples = Sections.finalize_theorem has_size_group_tuples;;
2472 let actsZ = Sections.finalize_theorem actsZ;;
2473 let fix_order = Sections.finalize_theorem fix_order;;
2474 let cauchy0 = Sections.finalize_theorem cauchy0;;
2475 let cauchy = Sections.finalize_theorem cauchy;;
2476 Sections.end_section "Cauchy";;
2477
2478 (* Section GroupActions *)
2479 Sections.begin_section "GroupActions";;
2480 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
2481 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
2482 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
2483 (Sections.add_section_var (mk_var ("e", (`:A`))));;
2484 (Sections.add_section_var (mk_var ("H", (`:A->bool`))));;
2485 (Sections.add_section_hyp "grG" (`group (G, op, i, e)`));;
2486
2487 (* Lemma finite_subgroups *)
2488 let finite_subgroups = Sections.section_proof []
2489 `FINITE G ==> FINITE {K | subgroup op i K G}`
2490 [
2491    ((BETA_TAC THEN (move ["finG"])) THEN ((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)));
2492    (((fun arg_tac -> arg_tac (Arg_term (`{t | t SUBSET G}`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("FINITE_POWERSET", [FINITE_POWERSET]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("subgroup", [subgroup]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (done_tac));
2493 ];;
2494
2495 (* Lemma finite_n_subgroups *)
2496 let finite_n_subgroups = Sections.section_proof ["n"]
2497 `FINITE G ==> FINITE {K | subgroup op i K G /\ K HAS_SIZE n}`
2498 [
2499    ((BETA_TAC THEN (move ["finG"])) THEN ((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (thm_tac apply_tac)));
2500    (((fun arg_tac -> arg_tac (Arg_term (`{K | subgroup op i K G}`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("finite_subgroups", [finite_subgroups]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (done_tac));
2501 ];;
2502
2503 (* Lemma subgroups_size_eq_card *)
2504 let subgroups_size_eq_card = Sections.section_proof ["n"]
2505 `FINITE G ==> 
2506         {K | subgroup op i K G /\ K HAS_SIZE n} = {K | subgroup op i K G /\ CARD K = n}`
2507 [
2508    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] []))))) THEN (move ["finG"]) THEN (move ["K"])) THEN (((use_arg_then2 ("andb_id2l", [andb_id2l])) (disch_tac [])) THEN (clear_assumption "andb_id2l") THEN (DISCH_THEN apply_tac) THEN (move ["subK"])));
2509    (((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("K", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("G", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2510 ];;
2511
2512 (* Lemma group_acts_on_cosets *)
2513 let group_acts_on_cosets = Sections.section_proof ["K"]
2514 `K SUBSET G ==> acts (G, op, e) (cosets op G K) (\g. set_op1 (op g))`
2515 [
2516    ((BETA_TAC THEN (move ["sKG"])) THEN (((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 ((split_tac))));
2517    ((BETA_TAC THEN (move ["g"]) THEN (move ["c"])) THEN (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["gG"])) THEN (case THEN (move ["h"])) THEN (case THEN (move ["hG"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))));
2518    (((fun arg_tac -> arg_tac (Arg_term (`op g h`))) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("left_mul_coset", [left_mul_coset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2519    (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["g1"]) THEN (move ["g2"]) THEN (move ["c"]) THEN (case THEN ALL_TAC) THEN (case THEN ((move ["g1G"]) THEN (move ["g2G"]))) THEN (case THEN (move ["g"])) THEN (case THEN (move ["gG"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2520    (((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("left_mul_coset", [left_mul_coset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("in_group", [in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulgA", [mulgA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2521    (((((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["c"]) THEN (case THEN (move ["g"])) THEN (case THEN ((move ["gG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))));
2522    (((((fun arg_tac -> (use_arg_then2 ("left_mul_coset", [left_mul_coset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("e_in_group", [e_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mul1g", [mul1g])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2523 ];;
2524
2525 (* Lemma group_acts_on_subgroups *)
2526 let group_acts_on_subgroups = Sections.section_proof ["n"]
2527 `acts (G, op, e) 
2528         {K | subgroup op i K G /\ K HAS_SIZE n} (\g. set_op1 (conjg (op, i) (i g)))`
2529 [
2530    (((((use_arg_then2 ("acts", [acts]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (repeat_tactic 1 9 ((split_tac))));
2531    (BETA_TAC THEN (move ["g"]) THEN (move ["K"]) THEN (case THEN (move ["gG"])) THEN (case THEN (move ["subK"])) THEN (move ["sizeK"]));
2532    ((((fun arg_tac -> (use_arg_then2 ("subgroup_conjg", [subgroup_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
2533    (((((fun arg_tac -> (use_arg_then2 ("conjg_set_has_size", [conjg_set_has_size])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2534    (BETA_TAC THEN (move ["g1"]) THEN (move ["g2"]) THEN (move ["K"]) THEN (case THEN ALL_TAC) THEN (case THEN (move ["g1G"])) THEN (move ["g2G"]) THEN (case THEN (move ["subK"])) THEN (move ["sizeK"]));
2535    (((((fun arg_tac -> (use_arg_then2 ("mul_conjg_set", [mul_conjg_set])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("mulI", [mulI])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2536    (BETA_TAC THEN (move ["K"]) THEN (case THEN (move ["subK"])) THEN (move ["sizeK"]));
2537    (((((fun arg_tac -> (use_arg_then2 ("invg1", [invg1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conj1g_set", [conj1g_set])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2538 ];;
2539
2540 (* Lemma conj_subgroup_stab *)
2541 let conj_subgroup_stab = Sections.section_proof ["K"]
2542 `K SUBSET G ==>
2543         (Stab G (\g. set_op1 (conjg (op, i) (i g))) K = normalizer op i G K)`
2544 [
2545    (BETA_TAC THEN (move ["sKG"]));
2546    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normalizer_subgroup", [normalizer_subgroup])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subN"])));
2547    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grN"])));
2548    ((((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("stab", [stab]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["x"])) THEN ((THENL) (split_tac) [(case THEN ((move ["xG"]) THEN (move ["K_eq"]))); (move ["xN"])]));
2549    (((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("invgK", [invgK])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("x", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("in_normalizer0", [in_normalizer0])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2550    ((((use_arg_then2 ("xN", [])) (disch_tac [])) THEN ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("xN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN ((repeat_tactic 1 9 (((fun arg_tac -> (use_arg_then2 ("in_normalizer0", [in_normalizer0])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2551 ];;
2552 (Sections.add_section_hyp "subH" (`subgroup op i H G`));;
2553
2554 (* Lemma subgroup_acts_on_cosets *)
2555 let subgroup_acts_on_cosets = Sections.section_proof ["K"]
2556 `K SUBSET G ==> acts (H, op, e) (cosets op G K) (\h. set_op1 (op h))`
2557 [
2558    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2559    (BETA_TAC THEN (move ["sKG"]));
2560    (((fun arg_tac -> (use_arg_then2 ("acts_sub", [acts_sub])) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("group_acts_on_cosets", [group_acts_on_cosets])) (fun fst_arg -> (use_arg_then2 ("sKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (exact_tac));
2561 ];;
2562
2563 (* Lemma subgroup_acts_on_subgroups *)
2564 let subgroup_acts_on_subgroups = Sections.section_proof ["n"]
2565 `acts (H, op, e) 
2566         {K | subgroup op i K G /\ K HAS_SIZE n} (\g. set_op1 (conjg (op, i) (i g)))`
2567 [
2568    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2569    (((fun arg_tac -> (use_arg_then2 ("acts_sub", [acts_sub])) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("group_acts_on_subgroups", [group_acts_on_subgroups])) (fun fst_arg -> (use_arg_then2 ("n", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN (exact_tac));
2570 ];;
2571 (Sections.add_section_hyp "finG" (`FINITE G`));;
2572
2573 (* Lemma subgroup_left_mul_fix *)
2574 let subgroup_left_mul_fix = Sections.section_proof []
2575 `Fix H (cosets op G H) (\h. set_op1 (op h)) = 
2576         cosets op (normalizer op i G H) H`
2577 [
2578    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2579    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
2580    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finH"])));
2581    ((((use_arg_then2 ("sHG", [])) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (move ["sHG'"])));
2582    ((THENL_ROT (-1)) ((((((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("IN_ELIM_THM", [IN_ELIM_THM]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["c"])) THEN (split_tac)));
2583    ((BETA_TAC THEN (case THEN (move ["x"]))) THEN (((((fun arg_tac -> (use_arg_then2 ("in_normalizer", [in_normalizer])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["xG"])) THEN (move ["eq"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))));
2584    ((THENL_FIRST) (((fun arg_tac -> arg_tac (Arg_term (`coset op x H`))) (term_tac exists_tac)) THEN ((((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))) THEN (split_tac)) (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (done_tac)));
2585    ((BETA_TAC THEN (move ["h"]) THEN (move ["hH"])) THEN ((((use_arg_then2 ("eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op1_lmul", [set_op1_lmul]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("set_opA", [set_opA])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("SING_SUBSET", [SING_SUBSET]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("sHG'", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("coset_op", [coset_op]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("coset_eq_e", [coset_eq_e])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2586    (BETA_TAC THEN (case THEN (move ["c1"])) THEN (case THEN ALL_TAC) THEN (case THEN ALL_TAC) THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (move ["c1_eq"]))) THEN (move ["h_eq"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2587    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("c1_eq", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] []))))));
2588    ((((fun arg_tac -> (use_arg_then2 ("in_normalizer", [in_normalizer])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
2589    ((THENL_ROT (-1)) ((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET_CARD_EQ", [SUBSET_CARD_EQ]))(gsym_then (thm_tac (new_rewrite [] [])))))));
2590    (((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("set_lmul_card", [set_lmul_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("set_rmul_card", [set_rmul_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2591    ((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("set_op1_eq_image", [set_op1_eq_image]))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
2592    (((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN (move ["a"]) THEN (case THEN (move ["h"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["hH"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2593    ((((fun arg_tac -> (use_arg_then2 ("h_eq", [])) (fun fst_arg -> (use_arg_then2 ("hH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((((use_arg_then2 ("SUBSET_ANTISYM_EQ", [SUBSET_ANTISYM_EQ]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("c1_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN ((fun arg_tac ->  (conv_thm_tac DISCH_THEN)  (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`op h x`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac MP_TAC))) THEN (ANTS_TAC));
2594    ((((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("x_in_coset", [x_in_coset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2595    (((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["h2"])) THEN (case THEN (move ["h2H"])) THEN (move ["op_eq"]) THEN (move ["_"]));
2596    (((use_arg_then2 ("h2", [])) (term_tac exists_tac)) THEN (done_tac));
2597 ];;
2598
2599 (* Finalization of the section GroupActions *)
2600 let finite_subgroups = Sections.finalize_theorem finite_subgroups;;
2601 let finite_n_subgroups = Sections.finalize_theorem finite_n_subgroups;;
2602 let subgroups_size_eq_card = Sections.finalize_theorem subgroups_size_eq_card;;
2603 let group_acts_on_cosets = Sections.finalize_theorem group_acts_on_cosets;;
2604 let group_acts_on_subgroups = Sections.finalize_theorem group_acts_on_subgroups;;
2605 let conj_subgroup_stab = Sections.finalize_theorem conj_subgroup_stab;;
2606 let subgroup_acts_on_cosets = Sections.finalize_theorem subgroup_acts_on_cosets;;
2607 let subgroup_acts_on_subgroups = Sections.finalize_theorem subgroup_acts_on_subgroups;;
2608 let subgroup_left_mul_fix = Sections.finalize_theorem subgroup_left_mul_fix;;
2609 Sections.end_section "GroupActions";;
2610
2611 (* Lemma max_expn_divides *)
2612 let max_expn_divides = Sections.section_proof ["c";"p";"n";"m"]
2613 `prime p ==> c = (p EXP n) * m ==> coprime (p, m) ==>
2614         p EXP n divides c /\ ~(p EXP (SUC n) divides c)`
2615 [
2616    ((BETA_TAC THEN (move ["prime_p"]) THEN (move ["c_eq"]) THEN (move ["c_pm"])) THEN (split_tac));
2617    (((((use_arg_then2 ("c_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] []))))) THEN ((use_arg_then2 ("m", [])) (term_tac exists_tac)) THEN (done_tac));
2618    (((((use_arg_then2 ("c_eq", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXP", [EXP]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("DIVIDES_LMUL2_EQ", [DIVIDES_LMUL2_EQ]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("expn_eq0", [expn_eq0]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("negb_and", [negb_and]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("PRIME_COPRIME_EQ", [PRIME_COPRIME_EQ]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2619 ];;
2620
2621 (* Section Sylow *)
2622 Sections.begin_section "Sylow";;
2623 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
2624 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
2625 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
2626 (Sections.add_section_var (mk_var ("e", (`:A`))));;
2627 (Sections.add_section_var (mk_var ("p", (`:num`))));;
2628 (Sections.add_section_hyp "grG" (`group (G,op,i,e)`));;
2629 (Sections.add_section_hyp "finG" (`FINITE G`));;
2630 (Sections.add_section_hyp "prime_p" (`prime p`));;
2631
2632 (* Lemma sylow1 *)
2633 let sylow1 = Sections.section_proof []
2634 `!n. p EXP n divides CARD G ==> ?H. subgroup op i H G /\ CARD H = p EXP n`
2635 [
2636    ((THENL_FIRST) ((THENL) elim [(move ["_"]); ((move ["n"]) THEN (move ["IH"]) THEN (move ["pSn"]))]) (((fun arg_tac -> arg_tac (Arg_term (`{e}`))) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("subgroup_e", [subgroup_e])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("card_sing", [card_sing]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXP", [EXP]))(thm_tac (new_rewrite [] []))))) THEN (done_tac)));
2637    ((((use_arg_then2 ("pSn", [])) (disch_tac [])) THEN BETA_TAC) THEN ((((use_arg_then2 ("EXP", [EXP]))(thm_tac (new_rewrite [] [])))) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("DIVIDES_LMUL2", [DIVIDES_LMUL2])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (DISCH_THEN (fun snd_th -> (use_arg_then2 ("IH", [])) (thm_tac (match_mp_then snd_th MP_TAC)))) THEN (case THEN (move ["H"])) THEN (case THEN ((move ["subH"]) THEN (move ["cH"])))));
2638    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2639    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normalizer_subgroup", [normalizer_subgroup])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subN"])));
2640    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grN"])));
2641    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normal_in_normalizer", [normal_in_normalizer])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["normH"])));
2642    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("quotient_group", [quotient_group])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grNH"])));
2643    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normalizer_subset", [normalizer_subset])) (fun fst_arg -> (use_arg_then2 ("op", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("i", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("H", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("G", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finN"])));
2644    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("finite_index", [finite_index])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finNH"])));
2645    ((fun arg_tac -> arg_tac (Arg_term (`normalizer op i G H`))) (term_tac (set_tac "N")));
2646    (((THENL_ROT 1)) ((fun arg_tac -> arg_tac (Arg_term (`p divides CARD (cosets op N H)`))) (term_tac (have_gen_tac [](move ["p_div"])))));
2647    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("cauchy", [cauchy])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("grNH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finNH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("p_div", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["K1"])) THEN (case THEN ((move ["subK1"]) THEN (move ["cK1"]))));
2648    ((((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_of_quotient", [subgroup_of_quotient])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("normH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("K1", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((((use_arg_then2 ("subK1", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["K"])) THEN (case THEN (move ["subK"])) THEN (case THEN (move ["normK"])) THEN (move ["K_eq_K1"])));
2649    (((use_arg_then2 ("K", [])) (term_tac exists_tac)) THEN ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_trans", [subgroup_trans])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))));
2650    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("cH", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("K_eq_K1", []))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("cK1", []))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
2651    ((((use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (disch_tac [])) THEN (clear_assumption "FINITE_SUBSET") THEN (DISCH_THEN apply_tac)) THEN ((use_arg_then2 ("N", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("finN", []))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2652    ((((use_arg_then2 ("N_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_left_mul_fix", [subgroup_left_mul_fix])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
2653    (((use_arg_then2 ("p_div_fix", [p_div_fix])) (thm_tac apply_tac)) THEN (((use_arg_then2 ("op", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("i", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("e", [])) (term_tac exists_tac)) THEN ((use_arg_then2 ("n", [])) (term_tac exists_tac))));
2654    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finH"])));
2655    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("finite_index", [finite_index])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finGH"])));
2656    ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("subgroup_acts_on_cosets", [subgroup_acts_on_cosets])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("prime_p", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqxx", [eqxx]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("finH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("finGH", []))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))));
2657    ((((use_arg_then2 ("DIVIDES_CMUL2", [DIVIDES_CMUL2])) (disch_tac [])) THEN (clear_assumption "DIVIDES_CMUL2") THEN (DISCH_THEN apply_tac)) THEN ((fun arg_tac -> arg_tac (Arg_term (`p EXP n`))) (term_tac exists_tac)));
2658    (((((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXP", [EXP]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("expn_eq0", [expn_eq0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("negb_and", [negb_and]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (((use_arg_then2 ("cH", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2659 ];;
2660
2661 (* Lemma sylow2 *)
2662 let sylow2 = Sections.section_proof ["n";"H";"K"]
2663 `~(p EXP (SUC n) divides CARD G) /\
2664         subgroup op i H G /\ subgroup op i K G /\ CARD H = p EXP n /\ CARD K = p EXP n ==>
2665         ?g. g IN G /\ H = set_op1 (conjg (op, i) g) K`
2666 [
2667    (BETA_TAC THEN (case THEN (move ["p_n_div"])) THEN (case THEN (move ["subH"])) THEN (case THEN (move ["subK"])) THEN (case THEN (move ["cH"])) THEN (move ["cK"]));
2668    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grK"])));
2669    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
2670    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2671    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sKG"])));
2672    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finK"])));
2673    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finH"])));
2674    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("finite_index", [finite_index])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finGH"])));
2675    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_acts_on_cosets", [subgroup_acts_on_cosets])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["actsK"])));
2676    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("fix_mod_p", [fix_mod_p])) (fun fst_arg -> (use_arg_then2 ("actsK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("grK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finGH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC)) THEN ((fun arg_tac -> arg_tac (Arg_term (`Fix K _1 _2`))) (term_tac (set_tac "S"))));
2677    (BETA_TAC THEN (move ["fix_mod"]));
2678    ((fun arg_tac -> arg_tac (Arg_term (`?c. c IN S`))) (term_tac (have_gen_tac []ALL_TAC)));
2679    ((THENL_LAST) (((fun arg_tac -> (use_arg_then2 ("EXCLUDED_MIDDLE", [EXCLUDED_MIDDLE])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`S HAS_SIZE 0`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN case) (((((use_arg_then2 ("HAS_SIZE_0", [HAS_SIZE_0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MEMBER_NOT_EMPTY", [MEMBER_NOT_EMPTY]))(gsym_then (thm_tac (new_rewrite [] [])))))) THEN (done_tac)));
2680    ((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN ((move ["finS"]) THEN (move ["cS0"]))));
2681    ((((use_arg_then2 ("fix_mod", [])) (disch_tac [])) THEN (clear_assumption "fix_mod") THEN BETA_TAC) THEN ((((use_arg_then2 ("cS0", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MOD_0", [MOD_0]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("DIVIDES_MOD", [DIVIDES_MOD]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 1 (((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ]))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac))));
2682    ((((use_arg_then2 ("contraLR", [contraLR])) (disch_tac [])) THEN (clear_assumption "contraLR") THEN (DISCH_THEN apply_tac) THEN (move ["_"])) THEN (((use_arg_then2 ("p_n_div", [])) (disch_tac [])) THEN (clear_assumption "p_n_div") THEN ((use_arg_then2 ("contra", [contra])) (disch_tac [])) THEN (clear_assumption "contra") THEN (DISCH_THEN apply_tac) THEN (move ["p_div"])));
2683    (((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("cH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXP", [EXP]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("DIVIDES_MUL_R", [DIVIDES_MUL_R]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2684    ((BETA_TAC THEN (case THEN (move ["c"]))) THEN (((((use_arg_then2 ("S_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cosets", [cosets]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["x"])) THEN (case THEN ((move ["xG"]) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))) THEN (move ["x_eq"])));
2685    (((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN ((((use_arg_then2 ("xG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] []))))));
2686    ((THENL_ROT (-1)) ((((use_arg_then2 ("eq_sym", [eq_sym]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("conjg_set_equiv", [conjg_set_equiv])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("SUBSET_CARD_EQ", [SUBSET_CARD_EQ]))(gsym_then (thm_tac (new_rewrite [] [])))))));
2687    (((((fun arg_tac -> (use_arg_then2 ("set_lmul_card", [set_lmul_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("set_rmul_card", [set_rmul_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2688    ((((use_arg_then2 ("set_op1_eq_image", [set_op1_eq_image]))(thm_tac (new_rewrite [1] [])))) THEN (((use_arg_then2 ("FINITE_IMAGE", [FINITE_IMAGE]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))));
2689    (((((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op", [in_set_op]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] []))))) THEN (move ["a"]) THEN (case THEN (move ["k"])) THEN (case THEN (move ["s2"])) THEN (case THEN (move ["kK"])) THEN (case THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2690    ((((fun arg_tac -> (use_arg_then2 ("x_eq", [])) (fun fst_arg -> (use_arg_then2 ("kK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (((((use_arg_then2 ("SUBSET_ANTISYM_EQ", [SUBSET_ANTISYM_EQ]))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN ((fun arg_tac ->  (conv_thm_tac DISCH_THEN)  (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`op k x`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (thm_tac MP_TAC))) THEN (ANTS_TAC));
2691    ((((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] [])))) THEN ((use_arg_then2 ("x", [])) (term_tac exists_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("x_in_coset", [x_in_coset])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (done_tac));
2692    (((((use_arg_then2 ("coset_op1", [coset_op1]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("in_set_op1", [in_set_op1]))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN (move ["h"])) THEN (case THEN (move ["hH"])) THEN (move ["op_eq"]) THEN (move ["_"]));
2693    (((use_arg_then2 ("h", [])) (term_tac exists_tac)) THEN (done_tac));
2694 ];;
2695
2696 (* Lemma sylow3_1 *)
2697 let sylow3_1 = Sections.section_proof ["n";"H"]
2698 `~(p EXP (SUC n) divides CARD G) /\ subgroup op i H G /\ CARD H = p EXP n ==>
2699         CARD {K | subgroup op i K G /\ CARD K = p EXP n} = CARD (cosets op G (normalizer op i G H))`
2700 [
2701    (BETA_TAC THEN (case THEN (move ["p_n_div"])) THEN (case THEN (move ["subH"])) THEN (move ["cH"]));
2702    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
2703    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2704    ((fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (fun arg_tac ->(use_arg_then2 ("finG", []))(fun tmp_arg1 -> (use_arg_then2 ("sHG", []))(fun tmp_arg2 -> arg_tac (Arg_theorem (CONJ (get_arg_thm tmp_arg1) (get_arg_thm tmp_arg2)))))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finH"])));
2705    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("group_acts_on_subgroups", [group_acts_on_subgroups])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`p EXP n`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["actsG"])));
2706    ((((fun arg_tac -> (use_arg_then2 ("conj_subgroup_stab", [conj_subgroup_stab])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("card_orbit", [card_orbit])) (fun fst_arg -> (use_arg_then2 ("actsG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))));
2707    (((((fun arg_tac -> (use_arg_then2 ("finite_n_subgroups", [finite_n_subgroups])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2708    ((THENL_ROT (-1)) (((use_arg_then2 ("congr1", [congr1])) (thm_tac apply_tac)) THEN (((((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("orbit", [orbit]))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] []))))) THEN (simp_tac)) THEN (move ["K"])) THEN ((THENL) (split_tac) [((case THEN (move ["subK"])) THEN (move ["cK"])); ((case THEN (move ["g"])) THEN (case THEN (move ["gG"])) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))))])));
2709    (((((fun arg_tac -> (use_arg_then2 ("subgroup_conjg", [subgroup_conjg])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("conjg_set_card", [conjg_set_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))))) THEN (done_tac));
2710    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("sylow2", [sylow2])) (fun fst_arg -> (use_arg_then2 ("p_n_div", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["g"])) THEN (case THEN (move ["gG"])) THEN (move ["K_eq"]));
2711    (((fun arg_tac -> arg_tac (Arg_term (`i g`))) (term_tac exists_tac)) THEN ((((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("invgK", [invgK])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2712 ];;
2713
2714 (* Lemma sylow3_2 *)
2715 let sylow3_2 = Sections.section_proof ["n";"m"]
2716 `CARD G = (p EXP n) * m /\ coprime (p, m) ==>
2717         CARD {K | subgroup op i K G /\ CARD K = p EXP n} divides m`
2718 [
2719    (BETA_TAC THEN (case THEN ((move ["cG"]) THEN (move ["c_pm"]))));
2720    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("max_expn_divides", [max_expn_divides])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("c_pm", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["p_div"]) THEN (move ["p_n_div"])))));
2721    (((fun arg_tac -> (use_arg_then2 ("sylow1", [sylow1])) (fun fst_arg -> (use_arg_then2 ("p_div", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["H"])) THEN (case THEN (move ["subH"])) THEN (move ["cH"]));
2722    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("sylow3_1", [sylow3_1])) (fun fst_arg -> (use_arg_then2 ("p_n_div", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))));
2723    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2724    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normalizer_subgroup", [normalizer_subgroup])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sHG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subN"])));
2725    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grN"])));
2726    ((fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normal_in_normalizer", [normal_in_normalizer])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subHN"])));
2727    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finN"])));
2728    ((fun arg_tac -> arg_tac (Arg_term (`normalizer op i G H`))) (term_tac (set_tac "N")));
2729    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subHN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] [])))));
2730    (((((use_arg_then2 ("cG", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulnC", [mulnC]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("mulnA", [mulnA]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("eqn_mul2r", [eqn_mul2r]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("expn_eq0", [expn_eq0]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("PRIME_IMP_NZ", [PRIME_IMP_NZ]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN ((THENL) case [(simp_tac); (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))]));
2731    ((((use_arg_then2 ("divides", [divides]))(thm_tac (new_rewrite [] [])))) THEN ((fun arg_tac -> arg_tac (Arg_term (`CARD (cosets op N H)`))) (term_tac exists_tac)) THEN (done_tac));
2732 ];;
2733
2734 (* Finalization of the section Sylow *)
2735 let sylow1 = Sections.finalize_theorem sylow1;;
2736 let sylow2 = Sections.finalize_theorem sylow2;;
2737 let sylow3_1 = Sections.finalize_theorem sylow3_1;;
2738 let sylow3_2 = Sections.finalize_theorem sylow3_2;;
2739 Sections.end_section "Sylow";;
2740
2741 (* Section Sylow3_final *)
2742 Sections.begin_section "Sylow3_final";;
2743 (Sections.add_section_var (mk_var ("G", (`:A->bool`))));;
2744 (Sections.add_section_var (mk_var ("op", (`:A->A->A`))));;
2745 (Sections.add_section_var (mk_var ("i", (`:A->A`))));;
2746 (Sections.add_section_var (mk_var ("e", (`:A`))));;
2747 (Sections.add_section_var (mk_var ("p", (`:num`))));;
2748 (Sections.add_section_hyp "grG" (`group (G,op,i,e)`));;
2749 (Sections.add_section_hyp "finG" (`FINITE G`));;
2750 (Sections.add_section_hyp "prime_p" (`prime p`));;
2751
2752 (* Lemma sylow3_3 *)
2753 let sylow3_3 = Sections.section_proof ["n";"m"]
2754 `CARD G = (p EXP n) * m /\ coprime (p, m) ==>
2755         CARD {K | subgroup op i K G /\ CARD K = p EXP n} MOD p = 1`
2756 [
2757    (BETA_TAC THEN (case THEN ((move ["cG"]) THEN (move ["c_pm"]))));
2758    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("max_expn_divides", [max_expn_divides])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("c_pm", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (case THEN ((move ["p_div"]) THEN (move ["p_n_div"])))));
2759    (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("sylow1", [sylow1])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("p_div", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC THEN (case THEN (move ["H"])) THEN (case THEN (move ["subH"])) THEN (move ["cH"]));
2760    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_acts_on_subgroups", [subgroup_acts_on_subgroups])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`p EXP n`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["actsH"])));
2761    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grH"])));
2762    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sHG"])));
2763    ((fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (fun arg_tac ->(use_arg_then2 ("finG", []))(fun tmp_arg1 -> (use_arg_then2 ("sHG", []))(fun tmp_arg2 -> arg_tac (Arg_theorem (CONJ (get_arg_thm tmp_arg1) (get_arg_thm tmp_arg2)))))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finH"])));
2764    ((((fun arg_tac -> (use_arg_then2 ("subgroups_size_eq_card", [subgroups_size_eq_card])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("fix_mod_p", [fix_mod_p])) (fun fst_arg -> (use_arg_then2 ("actsH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("finite_n_subgroups", [finite_n_subgroups])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)));
2765    ((fun arg_tac -> arg_tac (Arg_term (`Fix H _1 _2`))) (term_tac (set_tac "fix_set")));
2766    (((THENL_ROT 1)) ((fun arg_tac -> arg_tac (Arg_term (`fix_set = {H}`))) (term_tac (have_gen_tac [](((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))))));
2767    (((((use_arg_then2 ("card_sing", [card_sing]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("MOD_LT", [MOD_LT]))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (((fun arg_tac -> (use_arg_then2 ("PRIME_GE_2", [PRIME_GE_2])) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (disch_tac [])) THEN BETA_TAC) THEN (arith_tac) THEN (done_tac));
2768    ((THENL_ROT (-1)) ((((((use_arg_then2 ("fix_set_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((use_arg_then2 ("fix", [fix]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("EXTENSION", [EXTENSION]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("IN_SING", [IN_SING]))(thm_tac (new_rewrite [] [])))) THEN (simp_tac) THEN (repeat_tactic 1 9 (((use_arg_then2 ("inE", [inE]))(thm_tac (new_rewrite [] [])))))) THEN (move ["K"])) THEN ((THENL) (split_tac) [ALL_TAC; (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))])));
2769    (((((use_arg_then2 ("subH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("finH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("cH", []))(thm_tac (new_rewrite [] [])))) THEN (simp_tac)) THEN (move ["h"]) THEN (move ["hH"]));
2770    (((((fun arg_tac -> (use_arg_then2 ("group_conjgK", [group_conjgK])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2771    ((((use_arg_then2 ("HAS_SIZE", [HAS_SIZE]))(thm_tac (new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["subK"])) THEN (case THEN (move ["finK"])) THEN (move ["cK"]) THEN (move ["k_eq"]));
2772    ((fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["sKG"])));
2773    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normalizer_subgroup", [normalizer_subgroup])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("sKG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["subN"])));
2774    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("subgroup_group", [subgroup_group])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["grN"])));
2775    ((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("normal_in_normalizer", [normal_in_normalizer])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["normKN"])));
2776    ((fun arg_tac -> (use_arg_then2 ("FINITE_SUBSET", [FINITE_SUBSET])) (fun fst_arg -> (fun arg_tac ->(use_arg_then2 ("finG", []))(fun tmp_arg1 -> (fun arg_tac -> (use_arg_then2 ("subgroup_subset", [subgroup_subset])) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(fun tmp_arg2 -> arg_tac (Arg_theorem (CONJ (get_arg_thm tmp_arg1) (get_arg_thm tmp_arg2)))))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN (move ["finN"])));
2777    ((fun arg_tac -> arg_tac (Arg_term (`normalizer op i G K`))) (term_tac (set_tac "N")));
2778    ((fun arg_tac -> arg_tac (Arg_term (`subgroup op i H N`))) (term_tac (have_gen_tac [](move ["subHN"]))));
2779    (((((fun arg_tac -> (use_arg_then2 ("subgroup_alt2", [subgroup_alt2])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("grH", []))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("andbT", [andbT]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("SUBSET", [SUBSET]))(thm_tac (new_rewrite [] [])))) THEN (((use_arg_then2 ("N_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("in_normalizer0", [in_normalizer0])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (move ["h"]) THEN (move ["hH"]));
2780    (((((fun arg_tac -> (use_arg_then2 ("in_subgroup", [in_subgroup])) (fun fst_arg -> (use_arg_then2 ("subH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("andTb", [andTb]))(thm_tac (new_rewrite [] [])))) THEN (((fun arg_tac -> (use_arg_then2 ("k_eq", [])) (fun fst_arg -> (fun arg_tac -> arg_tac (Arg_term (`i h`))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(gsym_then (thm_tac (new_rewrite [1] []))))) THEN (repeat_tactic 0 10 (((fun arg_tac -> (use_arg_then2 ("i_in_group", [i_in_group])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ((TRY done_tac)) THEN (((fun arg_tac -> (use_arg_then2 ("invgK", [invgK])) (fun fst_arg -> (use_arg_then2 ("grH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2781    ((fun arg_tac -> arg_tac (Arg_term (`~(p EXP (SUC n) divides CARD N)`))) (term_tac (have_gen_tac [](move ["p_n_divN"]))));
2782    ((((use_arg_then2 ("p_n_div", [])) (disch_tac [])) THEN (clear_assumption "p_n_div") THEN ((use_arg_then2 ("contra", [contra])) (disch_tac [])) THEN (clear_assumption "contra") THEN (DISCH_THEN apply_tac) THEN (move ["div"])) THEN ((((fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("LaGrange", [LaGrange])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN (((use_arg_then2 ("DIVIDES_LMUL", [DIVIDES_LMUL]))(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2783    ((fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (fun arg_tac -> (use_arg_then2 ("sylow2", [sylow2])) (fun fst_arg -> (use_arg_then2 ("grN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("finN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("prime_p", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("p_n_divN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("subHN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (fun arg_tac -> (use_arg_then2 ("normal_subgroup", [normal_subgroup])) (fun fst_arg -> (use_arg_then2 ("normKN", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cH", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun fst_arg -> (use_arg_then2 ("cK", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg))) (fun arg -> thm_tac MP_TAC arg THEN ALL_TAC));
2784    ((BETA_TAC THEN (case THEN (move ["g"]))) THEN (((((use_arg_then2 ("N_def", []))(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((fun arg_tac -> (use_arg_then2 ("in_normalizer0", [in_normalizer0])) (fun fst_arg -> (use_arg_then2 ("grG", [])) (fun snd_arg -> combine_args_then arg_tac fst_arg snd_arg)))(thm_tac (new_rewrite [] []))))) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["_"])) THEN (((conv_thm_tac DISCH_THEN)(gsym_then (thm_tac (new_rewrite [] []))))) THEN (((conv_thm_tac DISCH_THEN)(thm_tac (new_rewrite [] []))))) THEN (done_tac));
2785 ];;
2786
2787 (* Finalization of the section Sylow3_final *)
2788 let sylow3_3 = Sections.finalize_theorem sylow3_3;;
2789 Sections.end_section "Sylow3_final";;