src/HOL/GroupTheory/Homomorphism.ML
author paulson
Mon, 23 Jul 2001 17:47:49 +0200
changeset 11448 aa519e0cc050
child 12459 6978ab7cac64
permissions -rw-r--r--
Final version of Florian Kammueller's examples
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/Homomorphism
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
Homomorphisms of groups, rings, and automorphisms.
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
     7
Sigma version with Locales
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
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    10
Open_locale "bij";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    11
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    12
Addsimps [B_def, o'_def, inv'_def];
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    13
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    14
Goal "[|x \\<in> S; f \\<in> B|] ==> EX x'. x = f x'";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    15
by (dtac BijE2 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    16
by Auto_tac; 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    17
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
Goal "[| f \\<in> B; g \\<in> S \\<rightarrow> S \\<rightarrow> S; x \\<in> S; y \\<in> S;\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    20
\      \\<forall>x \\<in> S. \\<forall>y \\<in> S. f(g x y) = g (f x) (f y) |] \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    21
\     ==> inv' f (g x y) = g (inv' f x) (inv' f y)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    22
by (subgoal_tac "EX x':S. EX y':S. x = f x' & y = f y'" 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    23
by (blast_tac (claset() addDs [BijE2]) 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    24
by (Clarify_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    25
(*the next step could be avoided if we could re-orient the quanitifed 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    26
  assumption, to rewrite g (f x') (f y') ...*)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    27
by (rtac inj_onD 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    28
by (etac BijE3 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    29
by (asm_full_simp_tac (simpset() addsimps [f_Inv_f, Inv_f_f, BijE2, BijE3, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    30
                                  funcset_mem RS funcset_mem]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    31
by (ALLGOALS
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    32
    (asm_full_simp_tac
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    33
     (simpset() addsimps [funcset_mem RS funcset_mem, BijE2, Inv_mem])));
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    34
qed "Bij_op_lemma";
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
Goal "[| a \\<in> B; b \\<in> B; g \\<in> S \\<rightarrow> S \\<rightarrow> S; x \\<in> S; y \\<in> S; \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    37
\       \\<forall>x \\<in> S. \\<forall>y \\<in> S. a (b (g x y)) = g (a (b x)) (a (b y)) |]  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    38
\     ==> (a o' b) (g x y) = g ((a o' b) x) ((a o' b) y)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    39
by (afs [o'_def, compose_eq, B_def, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    40
         funcset_mem RS funcset_mem] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    41
qed "Bij_comp_lemma";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    42
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    43
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    44
Goal "[| R1 \\<in> Ring; R2 \\<in> Ring |]  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    45
\  ==> RingHom `` {R1} `` {R2} = \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    46
\      {Phi. Phi \\<in> (R1.<cr>) \\<rightarrow> (R2.<cr>) & \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    47
\            (\\<forall>x \\<in> (R1.<cr>). \\<forall>y \\<in> (R1.<cr>). \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    48
\               (Phi((R1.<f>) x y) = (R2.<f>) (Phi x) (Phi y))) &\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    49
\            (\\<forall>x \\<in> (R1.<cr>). \\<forall>y \\<in> (R1.<cr>). \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    50
\               (Phi((R1.<m>) x y) = (R2.<m>) (Phi x) (Phi y)))}";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    51
by (afs [Image_def,RingHom_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    52
qed "RingHom_apply";
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
(* derive the defining properties as single lemmas *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    55
Goal "(R1,R2,Phi) \\<in> RingHom ==> Phi \\<in> (R1.<cr>) \\<rightarrow> (R2.<cr>)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    56
by (afs [RingHom_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    57
qed "RingHom_imp_funcset";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    58
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    59
Goal "[| (R1,R2,Phi) \\<in> RingHom; x \\<in> (R1.<cr>); y \\<in> (R1.<cr>) |]  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    60
\     ==> Phi((R1.<f>) x y) = (R2.<f>) (Phi x) (Phi y)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    61
by (afs [RingHom_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    62
qed "RingHom_preserves_rplus";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    63
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    64
Goal "[| (R1,R2,Phi) \\<in> RingHom; x \\<in> (R1.<cr>); y \\<in> (R1.<cr>) |]  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    65
\     ==> Phi((R1.<m>) x y) = (R2.<m>) (Phi x) (Phi y)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    66
by (afs [RingHom_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    67
qed "RingHom_preserves_rmult";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    68
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    69
Goal "[| R1 \\<in> Ring; R2 \\<in> Ring; Phi \\<in> (R1.<cr>) \\<rightarrow> (R2.<cr>); \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    70
\        \\<forall>x \\<in> (R1.<cr>). \\<forall>y \\<in> (R1.<cr>). \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    71
\          Phi((R1.<f>) x y) = (R2.<f>) (Phi x) (Phi y);\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    72
\        \\<forall>x \\<in> (R1.<cr>). \\<forall>y \\<in> (R1.<cr>). \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    73
\          Phi((R1.<m>) x y) = (R2.<m>) (Phi x) (Phi y)|]\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    74
\    ==> (R1,R2,Phi) \\<in> RingHom";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    75
by (afs [RingHom_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    76
qed "RingHomI";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    77
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    78
Open_locale "ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    79
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    80
val Ring_R = thm "Ring_R";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    81
val rmult_def = thm "rmult_def";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    82
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    83
Addsimps [simp_R, Ring_R];
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    84
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
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    87
(* RingAutomorphisms *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    88
Goal "RingAuto `` {R} = \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    89
\ {Phi. (R,R,Phi)  \\<in> RingHom & inj_on Phi (R.<cr>) & Phi ` (R.<cr>) = (R.<cr>)}";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    90
by (rewtac RingAuto_def);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    91
by (afs [Image_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    92
qed "RingAuto_apply";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    93
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    94
Goal "(R,Phi) \\<in> RingAuto  ==> (R, R, Phi)  \\<in> RingHom";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    95
by (afs [RingAuto_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    96
qed "RingAuto_imp_RingHom";
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
Goal "(R,Phi) \\<in> RingAuto ==> inj_on Phi (R.<cr>)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
    99
by (afs [RingAuto_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   100
qed "RingAuto_imp_inj_on";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   101
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   102
Goal "(R,Phi) \\<in> RingAuto ==> Phi ` (R.<cr>) = (R.<cr>)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   103
by (afs [RingAuto_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   104
qed "RingAuto_imp_preserves_R";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   105
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   106
Goal "(R,Phi) \\<in> RingAuto ==> Phi \\<in> (R.<cr>) \\<rightarrow> (R.<cr>)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   107
by (etac (RingAuto_imp_RingHom RS RingHom_imp_funcset) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   108
qed "RingAuto_imp_funcset";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   109
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   110
Goal "[| (R,R,Phi) \\<in> RingHom; \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   111
\        inj_on Phi (R.<cr>); \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   112
\        Phi ` (R.<cr>) = (R.<cr>) |]\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   113
\     ==> (R,Phi) \\<in> RingAuto";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   114
by (afs [RingAuto_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   115
qed "RingAutoI";
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
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   118
(* major result: RingAutomorphism builds a group *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   119
(* We prove that they are a subgroup of the bijection group.
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   120
   Note!!! Here we need "RingAuto `` {R} ~= {}", (as a result from the
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   121
   resolution with subgroupI). That is, this is an example where one might say
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   122
   the discipline of Pi types pays off, because there we have the proof basically
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   123
   already there (compare the Pi-version).
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   124
   Here in the Sigma version, we have to redo now the proofs (or slightly
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   125
   adapted verisions) of promoteRingHom and promoteRingAuto *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   126
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   127
Goal "RingAuto `` {R} ~= {}";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   128
by (stac RingAuto_apply 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   129
by Auto_tac; 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   130
by (res_inst_tac [("x","lam y: (R.<cr>). y")] exI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   131
by (auto_tac (claset(), simpset() addsimps [inj_on_def])); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   132
by (asm_full_simp_tac (simpset() addsimps [RingHom_def, restrictI, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   133
     R_binop_def, symmetric (rmult_def), rplus_closed, rmult_closed]) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   134
qed "RingAutoEx";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   135
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   136
Goal "(R,f) \\<in> RingAuto ==> f \\<in> Bij (R.<cr>)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   137
by (afs [RingAuto_imp_RingHom RS RingHom_imp_funcset, RingAuto_imp_inj_on, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   138
                RingAuto_imp_preserves_R, export BijI] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   139
qed "RingAuto_Bij";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   140
Addsimps [RingAuto_Bij];
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   141
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   142
Goal "[| (R,a) \\<in> RingAuto; (R,b) \\<in> RingAuto; \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   143
\        g \\<in> (R.<cr>) \\<rightarrow> (R.<cr>) \\<rightarrow> (R.<cr>); x \\<in> carrier R; y \\<in> carrier R; \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   144
\        \\<forall>Phi. (R,Phi) \\<in> RingAuto --> \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   145
\          (\\<forall>x \\<in> (R.<cr>). \\<forall>y \\<in> (R.<cr>). Phi(g x y) = g(Phi x) (Phi y)) |] \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   146
\     ==> compose (R.<cr>) a b (g x y) = \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   147
\           g (compose (R.<cr>) a b x) (compose (R.<cr>) a b y)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   148
by (asm_simp_tac (simpset() addsimps [export Bij_comp_lemma, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   149
                                    RingAuto_imp_funcset RS funcset_mem]) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   150
qed "Auto_comp_lemma";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   151
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   152
Goal "[|(R, a) \\<in> RingAuto; x \\<in> carrier R; y \\<in> carrier R|]  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   153
\     ==> Inv (carrier R) a (x ## y) =  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   154
\         Inv (carrier R) a x ## Inv (carrier R) a y"; 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   155
by (rtac (export Bij_op_lemma) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   156
by (etac RingAuto_Bij 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   157
by (rtac rplus_funcset 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   158
by (assume_tac 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   159
by (assume_tac 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   160
by (asm_simp_tac (simpset() addsimps [R_binop_def RS sym, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   161
                         RingAuto_imp_RingHom RS RingHom_preserves_rplus]) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   162
qed "Inv_rplus_lemma";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   163
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   164
Goal "(R,a) \\<in> RingAuto \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   165
\     ==> (R, grouptype.inverse (BijGroup (carrier R)) a) \\<in> RingAuto";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   166
by (rtac RingAutoI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   167
by (afs [BijGroup_def, export (restrict_Inv_Bij RS BijE3)] 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   168
by (afs [BijGroup_def, export (restrict_Inv_Bij RS BijE2)] 2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   169
by (rtac RingHomI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   170
by (rtac (Ring_R) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   171
by (rtac (Ring_R) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   172
(* ...  ==> (BijGroup (R .<R>) .<inv>) a \\<in> (R .<R>) \\<rightarrow> (R .<R>) *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   173
by (asm_simp_tac (simpset() addsimps [BijGroup_def, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   174
                     export restrict_Inv_Bij RS export BijE1]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   175
by (asm_simp_tac (simpset() addsimps [BijGroup_def, R_binop_def, rplus_closed, Inv_rplus_lemma]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   176
by (afs [BijGroup_def, symmetric (rmult_def), rmult_closed] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   177
by (afs [export Bij_op_lemma, rmult_funcset, rmult_def, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   178
         RingAuto_imp_RingHom RS RingHom_preserves_rmult] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   179
qed "inverse_BijGroup_lemma";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   180
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   181
Goal "[|(R, a) \\<in> RingAuto; (R, b) \\<in> RingAuto|]  \
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   182
\     ==> (R, bin_op (BijGroup (carrier R)) a b) \\<in> RingAuto";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   183
by (afs [BijGroup_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   184
by (rtac RingAutoI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   185
by (rtac RingHomI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   186
by (rtac (Ring_R) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   187
by (rtac (Ring_R) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   188
by (afs [RingAuto_Bij,export compose_Bij,export BijE1] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   189
by (Clarify_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   190
by (rtac Auto_comp_lemma 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   191
by (ALLGOALS Asm_full_simp_tac);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   192
by (asm_full_simp_tac (simpset() addsimps [R_binop_def, rplus_funcset]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   193
by (blast_tac (claset() addIs [RingAuto_imp_RingHom RS RingHom_preserves_rplus]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   194
by (Clarify_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   195
by (rtac Auto_comp_lemma 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   196
by (assume_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   197
by (assume_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   198
by (asm_full_simp_tac (simpset() addsimps [rmult_funcset]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   199
by (assume_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   200
by (assume_tac 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   201
by (blast_tac (claset() addIs [RingAuto_imp_RingHom RS RingHom_preserves_rmult]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   202
(*       ==> inj_on (compose (R .<R>) a b) (R .<R>) *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   203
by (blast_tac (claset() delrules [equalityI]
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   204
			addIs [inj_on_compose, RingAuto_imp_inj_on, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   205
                          RingAuto_imp_funcset, RingAuto_imp_preserves_R]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   206
(*      ==> compose (R .<R>) a b ` (R .<R>) = (R .<R>) *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   207
by (blast_tac (claset() delrules [equalityI] 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   208
      addIs [surj_compose, RingAuto_imp_funcset, RingAuto_imp_preserves_R]) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   209
qed "binop_BijGroup_lemma";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   210
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   211
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   212
(* Ring automorphisms are a subgroup of the group of bijections over the 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   213
   ring's carrier, and thus a group *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   214
Goal "RingAuto `` {R} <<= BijGroup (R.<cr>)";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   215
by (rtac SubgroupI 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   216
by (rtac (export Bij_are_Group) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   217
(* 1. RingAuto `` {R} <= (BijGroup (R .<R>) .<cr>) *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   218
by (afs [subset_def, BijGroup_def, Bij_def, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   219
         RingAuto_imp_RingHom RS RingHom_imp_funcset, RingAuto_imp_inj_on, 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   220
         RingAuto_imp_preserves_R, Image_def] 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   221
(* 1. !!R. R \\<in> Ring ==> RingAuto `` {R} ~= {} *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   222
by (rtac RingAutoEx 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   223
by (auto_tac (claset(),
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   224
         simpset() addsimps [inverse_BijGroup_lemma, binop_BijGroup_lemma])); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   225
qed "RingAuto_SG_BijGroup";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   226
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   227
Delsimps [simp_R, Ring_R];
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   228
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   229
Close_locale "ring";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   230
Close_locale "group";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   231
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   232
val RingAuto_are_Group = (export RingAuto_SG_BijGroup) RS (export Bij_are_Group RS SubgroupE2);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   233
(* So far:
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   234
"[| ?R2 \\<in> Ring; group_of ?R2 \\<in> Group |]
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   235
   ==> (| carrier = RingAuto `` {?R2},
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   236
          bin_op =
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   237
            lam x:RingAuto `` {?R2}.
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   238
               restrict ((BijGroup (?R2 .<cr>) .<f>) x) (RingAuto `` {?R2}),
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   239
          inverse = restrict (BijGroup (?R2 .<cr>) .<inv>) (RingAuto `` {?R2}),
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   240
          unit = BijGroup (?R2 .<cr>) .<e> |) \\<in> Group" *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   241
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   242
(* Unfortunately we have to eliminate the extra assumptions 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   243
Now only group_of R \\<in> Group *)
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   244
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   245
Goal "R \\<in> Ring ==> group_of R \\<in> Group";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   246
by (asm_full_simp_tac (simpset() addsimps [group_of_def]) 1); 
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   247
by (rtac Abel_imp_Group 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   248
by (etac (export R_Abel) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   249
qed "R_Group";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   250
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   251
Goal "R \\<in> Ring ==> (| carrier = RingAuto `` {R},\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   252
\          bin_op =  lam x:RingAuto `` {R}. lam y: RingAuto `` {R}.\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   253
\                             (BijGroup (R.<cr>) .<f>) x y ,\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   254
\          inverse = lam x: RingAuto `` {R}. (BijGroup (R.<cr>) .<inv>) x,\
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   255
\          unit = BijGroup (R.<cr>) .<e> |) \\<in> Group";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   256
by (rtac (R_Group RSN (2, RingAuto_are_Group)) 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   257
by (assume_tac 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   258
by (assume_tac 1);
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   259
qed "RingAuto_are_Groupf";
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   260
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   261
(* "?R \\<in> Ring
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   262
   ==> (| carrier = RingAuto `` {?R},
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   263
          bin_op =
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   264
            lam x:RingAuto `` {?R}.
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   265
               restrict ((BijGroup (?R .<cr>) .<f>) x) (RingAuto `` {?R}),
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   266
          inverse = restrict (BijGroup (?R .<cr>) .<inv>) (RingAuto `` {?R}),
aa519e0cc050 Final version of Florian Kammueller's examples
paulson
parents:
diff changeset
   267
          unit = BijGroup (?R .<cr>) .<e> |) \\<in> Group" *)