src/HOL/GroupTheory/Ring.ML
author kleing
Mon, 15 Oct 2001 21:04:32 +0200
changeset 11787 85b3735a51e1
parent 11448 aa519e0cc050
permissions -rw-r--r--
canonical 'cases'/'induct' rules for n-tuples (n=3..7) (really belongs to theory Product_Type, but doesn't work there yet)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11448
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     1
(*  Title:      HOL/GroupTheory/Ring
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     2
    ID:         $Id$
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     3
    Author:     Florian Kammueller, with new proofs by L C Paulson
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     4
    Copyright   1998-2001  University of Cambridge
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     5
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     6
Ring theory. Sigma version
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     7
*)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     8
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     9
Goal
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    10
"[| (| carrier = carrier R, bin_op = R .<f>, \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    11
\      inverse = R .<inv>, unit = R .<e> |) \\<in> AbelianGroup;\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    12
\   (R.<m>) \\<in> (carrier R) \\<rightarrow> (carrier R) \\<rightarrow> (carrier R); \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    13
\   \\<forall>x \\<in> carrier R. \\<forall>y \\<in> carrier R. \\<forall>z \\<in> carrier R. (R.<m>) x ((R.<m>) y z) = (R.<m>) ((R.<m>) x y) z;\ 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    14
\   distr_l (carrier R)(R.<m>)(R.<f>); distr_r (carrier R)(R.<m>)(R.<f>) |]\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    15
\ ==> R \\<in> Ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    16
by (afs [Ring_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    17
qed "RingI";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    18
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    19
Open_locale "ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    20
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    21
val simp_R = simplify (simpset() addsimps [Ring_def]) (thm "Ring_R");
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    22
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    23
Addsimps [simp_R, thm "Ring_R", thm "rmult_def",thm "R_id_G"];
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    24
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    25
Goal "(| carrier = (carrier R), bin_op = (R.<f>), inverse = (R.<inv>), \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    26
\        unit = (R.<e>) |) \\<in> AbelianGroup";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    27
by (Asm_full_simp_tac 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    28
qed "R_Abel";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    29
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    30
Goal "group_of R \\<in> AbelianGroup";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    31
by (afs [group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    32
qed "R_forget";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    33
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    34
Goal "((group_of R).<cr>) = (carrier R)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    35
by (afs [group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    36
qed "FR_carrier";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    37
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    38
Goal "(G.<cr>) = (carrier R)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    39
by (simp_tac (simpset() addsimps [FR_carrier RS sym]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    40
qed "R_carrier_def";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    41
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    42
Goal "((group_of R).<f>) = op ##";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    43
by (afs [binop_def, thm "R_id_G"] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    44
qed "FR_bin_op";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    45
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    46
Goal "(R.<f>) = op ##";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    47
by (afs [FR_bin_op RS sym, group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    48
qed "R_binop_def";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    49
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    50
Goal "((group_of R).<inv>) = INV";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    51
by (afs [thm "inv_def"] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    52
qed "FR_inverse";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    53
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    54
Goal "(R.<inv>) = INV";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    55
by (afs [FR_inverse RS sym, group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    56
qed "R_inv_def";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    57
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    58
Goal "((group_of R).<e>) = e";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    59
by (afs [thm "e_def"] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    60
qed "FR_unit";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    61
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    62
Goal "(R.<e>) = e";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    63
by (afs [FR_unit RS sym, group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    64
qed "R_unit_def";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    65
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    66
Goal "G \\<in> AbelianGroup";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    67
by (afs [group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    68
qed "G_abelian";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    69
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    70
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    71
Delsimps [thm "R_id_G"];  (*needed below?*)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    72
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    73
Goal "[| x \\<in> (G.<cr>); y \\<in> (G.<cr>) |] ==> x ## y = y ## x";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    74
by (afs [thm "binop_def", G_abelian RS Group_commute] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    75
qed "binop_commute";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    76
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    77
Goal "op ** \\<in> (carrier R) \\<rightarrow> (carrier R) \\<rightarrow> (carrier R)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    78
by (simp_tac (simpset() addsimps [thm "rmult_def"]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    79
qed "rmult_funcset";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    80
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    81
Goal "[| x \\<in> (carrier R); y \\<in> (carrier R) |] ==>  x ** y \\<in> (carrier R)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    82
by (blast_tac
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    83
    (claset() addIs [rmult_funcset RS funcset_mem RS funcset_mem]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    84
qed "rmult_closed";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    85
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    86
Goal "[|x \\<in> (carrier R); y \\<in> (carrier R); z \\<in> (carrier R)|] \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    87
\     ==> x **(y ** z) = (x ** y)** z";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    88
by (Asm_full_simp_tac 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    89
qed "rmult_assoc";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    90
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    91
Goal "[|x \\<in> (carrier R); y \\<in> (carrier R); z \\<in> (carrier R)|] \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    92
\     ==> x **(y ## z) = (x ** y) ## (x ** z)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    93
by (cut_facts_tac [thm "Ring_R"] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    94
by (asm_full_simp_tac (simpset() delsimps [thm "Ring_R", simp_R]
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    95
                    addsimps [Ring_def, distr_l_def, R_binop_def]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    96
qed "R_distrib1";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    97
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    98
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    99
(* The following have been in the earlier version without locales and the
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   100
record extension proofs in which we needed to use conversion functions to
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   101
establish these facts.  We can transfer all facts that are
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   102
derived for groups to rings now. The subsequent proofs are not really hard
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   103
proofs, they are just instantiations of the known facts to rings. This is
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   104
because the elements of the ring and the group are now identified!! Before, in
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   105
the older version we could do something similar, but we always had to go the
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   106
longer way, via the implication R \\<in> Ring ==> R \\<in> Abelian group and then
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   107
conversion functions for the operators *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   108
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   109
Goal "e \\<in> carrier R";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   110
by (afs [R_carrier_def RS sym,e_closed] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   111
qed "R_e_closed";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   112
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   113
Goal "\\<forall>x \\<in> carrier R. e ## x = x";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   114
by (afs [R_carrier_def RS sym,e_ax1] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   115
qed "R_e_ax1";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   116
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   117
Goal "op ## \\<in> carrier R \\<rightarrow> carrier R \\<rightarrow> carrier R";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   118
by (afs [R_carrier_def RS sym, binop_funcset] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   119
qed "rplus_funcset";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   120
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   121
Goal "[| x \\<in> carrier R; y \\<in> carrier R |] ==> x ## y \\<in> carrier R";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   122
by (afs  [rplus_funcset RS funcset_mem RS funcset_mem] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   123
qed "rplus_closed";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   124
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   125
Goal "[| a \\<in> carrier R; a ## a = a |] ==> a = e";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   126
by (afs [ R_carrier_def RS sym, idempotent_e] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   127
qed "R_idempotent_e";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   128
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   129
Delsimps [simp_R, thm "Ring_R", thm "rmult_def", thm "R_id_G"];
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   130
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   131
Goal "e ** e = e";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   132
by (rtac R_idempotent_e 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   133
by (blast_tac (claset() addIs [rmult_closed, R_e_closed]) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   134
by (simp_tac (simpset() addsimps [R_distrib1 RS sym, R_e_closed]) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   135
qed "R_e_mult_base";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   136
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   137
Close_locale "ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   138
Close_locale "group";