author | paulson |
Wed, 26 Jun 2002 10:26:46 +0200 | |
changeset 13248 | ae66c22ed52e |
parent 12459 | 6978ab7cac64 |
permissions | -rw-r--r-- |
11448 | 1 |
(* Title: HOL/GroupTheory/FactGroup |
2 |
ID: $Id$ |
|
3 |
Author: Florian Kammueller, with new proofs by L C Paulson |
|
4 |
Copyright 1998-2001 University of Cambridge |
|
5 |
||
6 |
Factorization of a group |
|
7 |
*) |
|
8 |
||
9 |
||
10 |
Open_locale "factgroup"; |
|
11 |
||
12 |
val H_normal = thm "H_normal"; |
|
13 |
val F_def = thm "F_def"; |
|
14 |
||
15 |
Addsimps [H_normal, F_def,setrcos_def]; |
|
16 |
||
17 |
Goal "carrier F = {* H *}"; |
|
18 |
by (afs [FactGroup_def] 1); |
|
19 |
qed "F_carrier"; |
|
20 |
||
12459
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
11448
diff
changeset
|
21 |
Goal "bin_op F = (%X: {* H *}. %Y: {* H *}. X <#> Y) "; |
11448 | 22 |
by (afs [FactGroup_def, setprod_def] 1); |
23 |
qed "F_bin_op"; |
|
24 |
||
12459
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
11448
diff
changeset
|
25 |
Goal "inverse F = (%X: {* H *}. I(X))"; |
11448 | 26 |
by (afs [FactGroup_def, setinv_def] 1); |
27 |
qed "F_inverse"; |
|
28 |
||
29 |
Goal "unit F = H"; |
|
30 |
by (afs [FactGroup_def] 1); |
|
31 |
qed "F_unit"; |
|
32 |
||
33 |
Goal "F = (| carrier = {* H *}, \ |
|
12459
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
11448
diff
changeset
|
34 |
\ bin_op = (%X: {* H *}. %Y: {* H *}. X <#> Y), \ |
6978ab7cac64
bounded abstraction now uses syntax "%" / "\<lambda>" instead of "lam";
wenzelm
parents:
11448
diff
changeset
|
35 |
\ inverse = (%X: {* H *}. I(X)), unit = H |)"; |
11448 | 36 |
by (afs [FactGroup_def, F_carrier, F_bin_op, F_inverse, F_unit] 1); |
37 |
by (auto_tac (claset() addSIs [restrict_ext], |
|
38 |
simpset() addsimps [set_prod_def, setprod_def, setinv_def])); |
|
39 |
qed "F_defI"; |
|
40 |
val F_DefI = export F_defI; |
|
41 |
||
42 |
Delsimps [setrcos_def]; |
|
43 |
||
44 |
(* MAIN PROOF *) |
|
45 |
Goal "F \\<in> Group"; |
|
46 |
val l1 = H_normal RS normal_imp_subgroup ; |
|
47 |
val l2 = l1 RS subgroup_imp_subset; |
|
48 |
by (stac F_defI 1); |
|
49 |
by (rtac GroupI 1); |
|
50 |
(* 1. *) |
|
51 |
by (afs [restrictI, setprod_closed] 1); |
|
52 |
(* 2. *) |
|
53 |
by (afs [restrictI, setinv_closed] 1); |
|
54 |
(* 3. H\\<in>{* H *} *) |
|
55 |
by (rtac (l1 RS setrcos_unit_closed) 1); |
|
56 |
(* 4. inverse property *) |
|
57 |
by (simp_tac (simpset() addsimps [setinv_closed, setrcos_inv_prod_eq]) 1); |
|
58 |
(* 5. unit property *) |
|
59 |
by (simp_tac (simpset() addsimps [normal_imp_subgroup, |
|
60 |
setrcos_unit_closed, setrcos_prod_eq]) 1); |
|
61 |
(* 6. associativity *) |
|
62 |
by (asm_simp_tac |
|
63 |
(simpset() addsimps [setprod_closed, H_normal RS setrcos_prod_assoc]) 1); |
|
64 |
qed "factorgroup_is_group"; |
|
65 |
val FactorGroup_is_Group = export factorgroup_is_group; |
|
66 |
||
67 |
||
68 |
Delsimps [H_normal, F_def]; |
|
69 |
Close_locale "factgroup"; |
|
70 |
||
71 |
||
72 |
Goalw [FactGroup_def] "FactGroup \\<in> (PI G: Group. {H. H <| G} \\<rightarrow> Group)"; |
|
73 |
by (rtac restrictI 1); |
|
74 |
by (rtac restrictI 1); |
|
75 |
by (asm_full_simp_tac |
|
76 |
(simpset() addsimps [F_DefI RS sym, FactorGroup_is_Group]) 1); |
|
77 |
qed "FactGroup_arity"; |
|
78 |
||
79 |
Close_locale "coset"; |
|
80 |
Close_locale "group"; |