diff -r a246a0a52dfb -r 5fcc8bf538ee src/HOL/GroupTheory/Ring.thy --- a/src/HOL/GroupTheory/Ring.thy Wed Sep 25 11:23:26 2002 +0200 +++ b/src/HOL/GroupTheory/Ring.thy Thu Sep 26 10:40:13 2002 +0200 @@ -1,60 +1,204 @@ (* Title: HOL/GroupTheory/Ring ID: $Id$ Author: Florian Kammueller, with new proofs by L C Paulson - Copyright 1998-2001 University of Cambridge -Ring theory. Sigma version *) -Ring = Coset + +header{*Ring Theory*} + +theory Ring = Bij + Coset: + + +subsection{*Definition of a Ring*} + +record 'a ring = "'a group" + + prod :: "'a \ 'a \ 'a" (infixl "\\" 70) + +record 'a unit_ring = "'a ring" + + one :: 'a ("\\") + + +text{*Abbrevations for the left and right distributive laws*} +constdefs + distrib_l :: "['a set, ['a, 'a] => 'a, ['a, 'a] => 'a] => bool" + "distrib_l A f g == + (\x \ A. \y \ A. \z \ A. (f x (g y z) = g (f x y) (f x z)))" -record 'a ringtype = 'a grouptype + - Rmult :: "['a, 'a] => 'a" + distrib_r :: "['a set, ['a, 'a] => 'a, ['a, 'a] => 'a] => bool" + "distrib_r A f g == + (\x \ A. \y \ A. \z \ A. (f (g y z) x = g (f y x) (f z x)))" + + +locale ring = abelian_group R + + assumes prod_funcset: "prod R \ carrier R \ carrier R \ carrier R" + and prod_assoc: + "[|x \ carrier R; y \ carrier R; z \ carrier R|] + ==> (x \ y) \ z = x \ (y \ z)" + and left: "distrib_l (carrier R) (prod R) (sum R)" + and right: "distrib_r (carrier R) (prod R) (sum R)" + +constdefs (*????FIXME needed?*) + Ring :: "('a,'b) ring_scheme set" + "Ring == Collect ring" + + +lemma ring_is_abelian_group: "ring(R) ==> abelian_group(R)" +by (simp add: ring_def abelian_group_def) -syntax - "@Rmult" :: "('a ringtype) => (['a, 'a] => 'a)" ("_ ." [10] 10) +text{*Construction of a ring from a semigroup and an Abelian group*} +lemma "[|abelian_group R; + semigroup(|carrier = carrier R, sum = prod R|); + distrib_l (carrier R) (prod R) (sum R); + distrib_r (carrier R) (prod R) (sum R)|] ==> ring R" +by (simp add: abelian_group_def ring_def ring_axioms_def semigroup_def) + +lemma (in ring) prod_closed [simp]: + "[| x \ carrier R; y \ carrier R |] ==> x \ y \ carrier R" +apply (insert prod_funcset) +apply (blast dest: funcset_mem) +done + +declare ring.prod_closed [simp] + +lemma (in ring) sum_closed: + "[| x \ carrier R; y \ carrier R |] ==> x \ y \ carrier R" +by simp + +declare ring.sum_closed [simp] -translations - "R." == "Rmult R" +lemma (in ring) distrib_left: + "[|x \ carrier R; y \ carrier R; z \ carrier R|] + ==> x \ (y \ z) = (x \ y) \ (x \ z)" +apply (insert left) +apply (simp add: distrib_l_def) +done + +lemma (in ring) distrib_right: + "[|x \ carrier R; y \ carrier R; z \ carrier R|] + ==> (y \ z) \ x = (y \ x) \ (z \ x)" +apply (insert right) +apply (simp add: distrib_r_def) +done + +lemma (in ring) prod_zero_left: "x \ carrier R ==> \ \ x = \" +by (simp add: idempotent_imp_zero distrib_right [symmetric]) + +lemma (in ring) prod_zero_right: "x \ carrier R ==> x \ \ = \" +by (simp add: idempotent_imp_zero distrib_left [symmetric]) + +lemma (in ring) prod_minus_left: + "[|x \ carrier R; y \ carrier R|] + ==> (\x) \ y = \ (x \ y)" +by (simp add: minus_unique prod_zero_left distrib_right [symmetric]) + +lemma (in ring) prod_minus_right: + "[|x \ carrier R; y \ carrier R|] + ==> x \ (\y) = \ (x \ y)" +by (simp add: minus_unique prod_zero_right distrib_left [symmetric]) + + +subsection {*Ring Homomorphisms*} constdefs - distr_l :: "['a set, ['a, 'a] => 'a, ['a, 'a] => 'a] => bool" - "distr_l S f1 f2 == (\\x \\ S. \\y \\ S. \\z \\ S. - (f1 x (f2 y z) = f2 (f1 x y) (f1 x z)))" - distr_r :: "['a set, ['a, 'a] => 'a, ['a, 'a] => 'a] => bool" - "distr_r S f1 f2 == (\\x \\ S. \\y \\ S. \\z \\ S. - (f1 (f2 y z) x = f2 (f1 y x) (f1 z x)))" + ring_hom :: "[('a,'c)ring_scheme, ('b,'d)ring_scheme] => ('a => 'b)set" + "ring_hom R R' == + {h. h \ carrier R -> carrier R' & + (\x \ carrier R. \y \ carrier R. h(sum R x y) = sum R' (h x) (h y)) & + (\x \ carrier R. \y \ carrier R. h(prod R x y) = prod R' (h x) (h y))}" + + ring_auto :: "('a,'b)ring_scheme => ('a => 'a)set" + "ring_auto R == ring_hom R R \ Bij(carrier R)" -consts - Ring :: "('a ringtype) set" + RingAutoGroup :: "[('a,'c) ring_scheme] => ('a=>'a) group" + "RingAutoGroup R == BijGroup (carrier R) (|carrier := ring_auto R |)" + + +lemma ring_hom_subset_hom: "ring_hom R R' <= hom R R'" +by (force simp add: ring_hom_def hom_def) + +subsection{*The Ring Automorphisms From a Group*} + +lemma id_in_ring_auto: "ring R ==> (%x: carrier R. x) \ ring_auto R" +by (simp add: ring_auto_def ring_hom_def restrictI ring.axioms id_Bij) -defs - Ring_def - "Ring == - {R. (| carrier = (R.), bin_op = (R.), - inverse = (R.), unit = (R.) |) \\ AbelianGroup & - (R.) \\ (R.) \\ (R.) \\ (R.) & - (\\x \\ (R.). \\y \\ (R.). \\z \\ (R.). - ((R.) x ((R.) y z) = (R.) ((R.) x y) z)) & - distr_l (R.)(R.)(R.) & - distr_r (R.)(R.)(R.) }" +lemma restrict_Inv_ring_hom: + "[|ring R; h \ ring_hom R R; h \ Bij (carrier R)|] + ==> restrict (Inv (carrier R) h) (carrier R) \ ring_hom R R" +by (simp add: ring.axioms group.axioms + ring_hom_def Bij_Inv_mem restrictI ring.sum_closed + semigroup.sum_funcset ring.prod_funcset Bij_Inv_lemma) + +text{*Ring automorphisms are a subgroup of the group of bijections over the + ring's carrier, and thus a group*} +lemma subgroup_ring_auto: + "ring R ==> subgroup (ring_auto R) (BijGroup (carrier R))" +apply (rule group.subgroupI) + apply (rule group_BijGroup) + apply (force simp add: ring_auto_def BijGroup_def) + apply (blast intro: dest: id_in_ring_auto) + apply (simp add: ring_auto_def BijGroup_def restrict_Inv_Bij + restrict_Inv_ring_hom) +apply (simp add: ring_auto_def BijGroup_def compose_Bij) +apply (simp add: ring_hom_def compose_def Pi_def) +done + +lemma ring_auto: "ring R ==> group (RingAutoGroup R)" +apply (drule subgroup_ring_auto) +apply (simp add: subgroup_def RingAutoGroup_def) +done -constdefs - group_of :: "'a ringtype => 'a grouptype" - "group_of == %R: Ring. (| carrier = (R.), bin_op = (R.), - inverse = (R.), unit = (R.) |)" +subsection{*A Locale for a Pair of Rings and a Homomorphism*} + +locale ring_homomorphism = ring R + ring R' + + fixes h + assumes homh: "h \ ring_hom R R'" + +lemma ring_hom_sum: + "[|h \ ring_hom R R'; x \ carrier R; y \ carrier R|] + ==> h(sum R x y) = sum R' (h x) (h y)" +by (simp add: ring_hom_def) + +lemma ring_hom_prod: + "[|h \ ring_hom R R'; x \ carrier R; y \ carrier R|] + ==> h(prod R x y) = prod R' (h x) (h y)" +by (simp add: ring_hom_def) + +lemma ring_hom_closed: + "[|h \ ring_hom G G'; x \ carrier G|] ==> h x \ carrier G'" +by (auto simp add: ring_hom_def funcset_mem) + +lemma (in ring_homomorphism) ring_hom_sum [simp]: + "[|x \ carrier R; y \ carrier R|] ==> h (x \\<^sub>1 y) = (h x) \\<^sub>2 (h y)" +by (simp add: ring_hom_sum [OF homh]) -locale ring = group + - fixes - R :: "'a ringtype" - rmult :: "['a, 'a] => 'a" (infixr "**" 80) - assumes - Ring_R "R \\ Ring" - defines - rmult_def "op ** == (R.)" - R_id_G "G == group_of R" +lemma (in ring_homomorphism) ring_hom_prod [simp]: + "[|x \ carrier R; y \ carrier R|] ==> h (x \\<^sub>1 y) = (h x) \\<^sub>2 (h y)" +by (simp add: ring_hom_prod [OF homh]) + +lemma (in ring_homomorphism) group_homomorphism: "group_homomorphism R R' h" +by (simp add: group_homomorphism_def group_homomorphism_axioms_def + prems homh ring_hom_subset_hom [THEN subsetD]) + +lemma (in ring_homomorphism) hom_zero_closed [simp]: "h \\<^sub>1 \ carrier R'" +by (simp add: ring_hom_closed [OF homh]) + +lemma (in ring_homomorphism) hom_zero [simp]: "h \\<^sub>1 = \\<^sub>2" +by (rule group_homomorphism.hom_zero [OF group_homomorphism]) + +lemma (in ring_homomorphism) hom_minus_closed [simp]: + "x \ carrier R ==> h (\x) \ carrier R'" +by (rule group_homomorphism.hom_minus_closed [OF group_homomorphism]) + +lemma (in ring_homomorphism) hom_minus [simp]: + "x \ carrier R ==> h (\\<^sub>1 x) = \\<^sub>2 (h x)" +by (rule group_homomorphism.hom_minus [OF group_homomorphism]) + + +text{*Needed because the standard theorem @{text "ring_homomorphism.intro"} +is unnatural.*} +lemma ring_homomorphismI: + "[|ring R; ring R'; h \ ring_hom R R'|] ==> ring_homomorphism R R' h" +by (simp add: ring_def ring_homomorphism_def ring_homomorphism_axioms_def) end - -