src/HOL/GroupTheory/Module.thy
changeset 13870 cf947d1ec5ff
parent 13869 18112403c809
child 13871 26e5f5e624f6
equal deleted inserted replaced
13869:18112403c809 13870:cf947d1ec5ff
     1 (*  Title:      HOL/GroupTheory/Module
       
     2     ID:         $Id$
       
     3     Author:     Lawrence C Paulson
       
     4 
       
     5 *)
       
     6 
       
     7 header{*Modules*}
       
     8 
       
     9 theory Module = Ring:
       
    10 
       
    11 text{*The record includes all the group components (carrier, sum, gminus,
       
    12 zero), adding the scalar product.*}
       
    13 record ('a,'b) module  = "'a group" + 
       
    14   sprod :: "'b \<Rightarrow> 'a \<Rightarrow> 'a"   (infixl "\<star>\<index>" 70) 
       
    15 
       
    16 text{*The locale assumes all the properties of a ring and an Abelian group,
       
    17 adding laws relating them.*}
       
    18 locale module = ring R + abelian_group M +
       
    19   assumes sprod_funcset: "sprod M \<in> carrier R \<rightarrow> carrier M \<rightarrow> carrier M"
       
    20       and sprod_assoc:   
       
    21             "[|r \<in> carrier R; s \<in> carrier R; a \<in> carrier M|] 
       
    22              ==> (r \<cdot>\<^sub>1 s) \<star>\<^sub>2 a = r \<star>\<^sub>2 (s \<star>\<^sub>2 a)"
       
    23       and sprod_distrib_left:
       
    24             "[|r \<in> carrier R; a \<in> carrier M; b \<in> carrier M|] 
       
    25              ==> r \<star>\<^sub>2 (a \<oplus>\<^sub>2 b) = (r \<star>\<^sub>2 a) \<oplus>\<^sub>2 (r \<star>\<^sub>2 b)"
       
    26       and sprod_distrib_right:
       
    27             "[|r \<in> carrier R; s \<in> carrier R; a \<in> carrier M|] 
       
    28              ==> (r \<oplus>\<^sub>1 s) \<star>\<^sub>2 a = (r \<star>\<^sub>2 a) \<oplus>\<^sub>2 (s \<star>\<^sub>2 a)"
       
    29 
       
    30 lemma module_iff:
       
    31      "module R M = (ring R & abelian_group M & module_axioms R M)"
       
    32 by (simp add: module_def ring_def abelian_group_def) 
       
    33 
       
    34 text{*The sum and product in @{text R} are @{text "r \<oplus>\<^sub>1 s"} and @{text
       
    35 "r \<cdot>\<^sub>1 s"}, respectively.  The sum in @{text M} is @{text "a \<oplus>\<^sub>2 b"}.*}
       
    36 
       
    37 
       
    38 text{*We have to write the ring product as @{text "\<cdot>\<^sub>2"}. But if we
       
    39 refer to the scalar product as @{text "\<cdot>\<^sub>1"} then syntactic ambiguities
       
    40 arise.  This presumably happens because the subscript merely determines which
       
    41 structure argument to insert, which happens after parsing.  Better to use a
       
    42 different symbol such as @{text "\<star>"}*}
       
    43 
       
    44 subsection {*Trivial Example: Every Ring is an R-Module Over Itself *}
       
    45 
       
    46 constdefs
       
    47  triv_mod :: "('a,'b) ring_scheme => ('a,'a) module"
       
    48   "triv_mod R == (|carrier = carrier R,
       
    49                  sum = sum R,
       
    50                  gminus = gminus R,
       
    51                  zero = zero R, 
       
    52                  sprod = prod R|)"
       
    53 
       
    54 theorem module_triv_mod: "ring R ==> module R (triv_mod R)"
       
    55 apply (simp add: triv_mod_def module_iff module_axioms_def
       
    56                  ring_def ring_axioms_def abelian_group_def
       
    57                  distrib_l_def distrib_r_def semigroup_def group_axioms_def)
       
    58 apply (simp add: abelian_group_axioms_def)
       
    59   --{*Combining the two simplifications causes looping!*}
       
    60 done
       
    61 
       
    62 end