src/HOL/GroupTheory/RingConstr.ML
author wenzelm
Thu, 06 Dec 2001 00:39:40 +0100
changeset 12397 6766aa05e4eb
parent 11448 aa519e0cc050
permissions -rw-r--r--
less_induct, wf_induct_rule;
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/RingConstr
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
Construction of a ring from a semigroup and an Abelian group 
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 "[| G \\<in> AbelianGroup; S \\<in> Semigroup; (S.<cr>) = (G.<cr>); \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    10
\        R \\<in> ring_constr `` {G} `` {S} |] \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    11
\     ==> R \\<in>  Ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    12
by (force_tac (claset(), 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    13
         simpset() addsimps [Ring_def, ring_constr_def, Abel_Abel, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    14
                             Semigroup_def]@[distr_l_def, distr_r_def]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    15
qed "RingC_Ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    16
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    17
Goal "R = (| carrier = R .<cr>, bin_op = R .<f>, inverse = R .<inv>,\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    18
\                unit = R .<e>, Rmult = R .<m> |)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    19
by Auto_tac; 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    20
qed "surjective_Ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    21
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    22
Goal "R \\<in>  Ring \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    23
\     ==> \\<exists>G \\<in> AbelianGroup. \\<exists>S \\<in> Semigroup. R \\<in> ring_constr `` {G} `` {S}";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    24
by (res_inst_tac [("x","group_of R")] bexI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    25
by (afs [Ring_def, group_of_def] 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    26
by (res_inst_tac [("x","(| carrier = (R.<cr>), bin_op = (R.<m>) |)")] bexI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    27
by (afs [Ring_def, AbelianGroup_def, Semigroup_def] 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    28
(* Now the main conjecture:
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    29
 R\\<in>Ring
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    30
         ==> R\\<in>ring_constr `` {group_of R} ``
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    31
                 {(| carrier = R .<cr>, bin_op = R .<m> |)} *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    32
by (afs [ring_constr_def, Ring_def, group_of_def, AbelianGroup_def, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    33
         Semigroup_def,distr_l_def,distr_r_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    34
qed "Ring_RingC";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    35
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    36
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    37
Goal "[| G \\<in> AbelianGroup; S \\<in> Semigroup; (S.<cr>) = (G.<cr>); \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    38
\        distr_l (G .<cr>) (S .<f>) (G .<f>); \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    39
\        distr_r (G .<cr>) (S .<f>) (G .<f>) |] \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    40
\     ==> ring_from G S \\<in>  Ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    41
by (rtac RingI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    42
by (ALLGOALS
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    43
    (asm_full_simp_tac (simpset() addsimps [ring_from_def, Abel_Abel, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    44
                                            Semigroup_def]))); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    45
qed "RingFrom_is_Ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    46
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    47
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    48
Goal "ring_from \\<in> (PI G : AbelianGroup. {M. M \\<in> Semigroup & (M.<cr>) = (G.<cr>) \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    49
\         & distr_l (G.<cr>) (M.<f>) (G.<f>) & distr_r (G.<cr>) (M.<f>) (G.<f>)} \\<rightarrow> Ring)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    50
by (rtac Pi_I 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    51
by (afs [ring_from_def] 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    52
by (rtac funcsetI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    53
by (asm_full_simp_tac (simpset() addsimps [ring_from_def]) 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    54
by (Force_tac 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    55
by (afs [RingFrom_is_Ring] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    56
qed "RingFrom_arity";
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
(* group_of, i.e. the group in a ring *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    59
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    60
Goal "R \\<in> Ring ==> group_of R \\<in> AbelianGroup";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    61
by (afs [group_of_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    62
by (etac (export R_Abel) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    63
qed "group_of_in_AbelianGroup";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    64
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    65
val R_Group = group_of_in_AbelianGroup RS Abel_imp_Group;
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    66
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    67