diff -r a7d1a3fdc30d -r 63f5f4c265dd src/HOL/Algebra/CRing.thy --- a/src/HOL/Algebra/CRing.thy Sat Jul 31 20:54:23 2004 +0200 +++ b/src/HOL/Algebra/CRing.thy Mon Aug 02 09:44:46 2004 +0200 @@ -17,7 +17,7 @@ text {* Derived operations. *} constdefs (structure R) - a_inv :: "[_, 'a ] => 'a" ("\\ _" [81] 80) + a_inv :: "[('a, 'm) ring_scheme, 'a ] => 'a" ("\\ _" [81] 80) "a_inv R == m_inv (| carrier = carrier R, mult = add R, one = zero R |)" minus :: "[('a, 'm) ring_scheme, 'a, 'a] => 'a" (infixl "\\" 65) @@ -40,29 +40,31 @@ subsection {* Basic Properties *} lemma abelian_monoidI: + includes struct R assumes a_closed: - "!!x y. [| x \ carrier R; y \ carrier R |] ==> add R x y \ carrier R" - and zero_closed: "zero R \ carrier R" + "!!x y. [| x \ carrier R; y \ carrier R |] ==> x \ y \ carrier R" + and zero_closed: "\ \ carrier R" and a_assoc: "!!x y z. [| x \ carrier R; y \ carrier R; z \ carrier R |] ==> - add R (add R x y) z = add R x (add R y z)" - and l_zero: "!!x. x \ carrier R ==> add R (zero R) x = x" + (x \ y) \ z = x \ (y \ z)" + and l_zero: "!!x. x \ carrier R ==> \ \ x = x" and a_comm: - "!!x y. [| x \ carrier R; y \ carrier R |] ==> add R x y = add R y x" + "!!x y. [| x \ carrier R; y \ carrier R |] ==> x \ y = y \ x" shows "abelian_monoid R" by (auto intro!: abelian_monoid.intro comm_monoidI intro: prems) lemma abelian_groupI: + includes struct R assumes a_closed: - "!!x y. [| x \ carrier R; y \ carrier R |] ==> add R x y \ carrier R" + "!!x y. [| x \ carrier R; y \ carrier R |] ==> x \ y \ carrier R" and zero_closed: "zero R \ carrier R" and a_assoc: "!!x y z. [| x \ carrier R; y \ carrier R; z \ carrier R |] ==> - add R (add R x y) z = add R x (add R y z)" + (x \ y) \ z = x \ (y \ z)" and a_comm: - "!!x y. [| x \ carrier R; y \ carrier R |] ==> add R x y = add R y x" - and l_zero: "!!x. x \ carrier R ==> add R (zero R) x = x" - and l_inv_ex: "!!x. x \ carrier R ==> EX y : carrier R. add R y x = zero R" + "!!x y. [| x \ carrier R; y \ carrier R |] ==> x \ y = y \ x" + and l_zero: "!!x. x \ carrier R ==> \ \ x = x" + and l_inv_ex: "!!x. x \ carrier R ==> EX y : carrier R. y \ x = \" shows "abelian_group R" by (auto intro!: abelian_group.intro abelian_monoidI abelian_group_axioms.intro comm_monoidI comm_groupI @@ -169,7 +171,7 @@ *} constdefs - finsum :: "[_, 'a => 'b, 'a set] => 'b" + finsum :: "[('b, 'm) ring_scheme, 'a => 'b, 'a set] => 'b" "finsum G f A == finprod (| carrier = carrier G, mult = add G, one = zero G |) f A" @@ -183,7 +185,8 @@ "_finsum" :: "index => idt => 'a set => 'b => 'b" ("(3\__\_. _)" [1000, 0, 51, 10] 10) translations - "\\i:A. b" == "finsum \\ (%i. b) A" -- {* Beware of argument permutation! *} + "\\i:A. b" == "finsum \\ (%i. b) A" + -- {* Beware of argument permutation! *} (* lemmas (in abelian_monoid) finsum_empty [simp] = @@ -194,10 +197,10 @@ lemmas (in abelian_monoid) finsum_empty [simp] = abelian_monoid.finprod_empty [OF a_abelian_monoid, folded finsum_def, simplified monoid_record_simps] -makes the locale slow, because proofs are repeated for every -"lemma (in abelian_monoid)" command. -When lemma is used time in UnivPoly.thy from beginning to UP_cring goes down -from 110 secs to 60 secs. + makes the locale slow, because proofs are repeated for every + "lemma (in abelian_monoid)" command. + When lemma is used time in UnivPoly.thy from beginning to UP_cring goes down + from 110 secs to 60 secs. *) lemma (in abelian_monoid) finsum_empty [simp]: @@ -212,7 +215,7 @@ folded finsum_def, simplified monoid_record_simps]) lemma (in abelian_monoid) finsum_zero [simp]: - "finite A ==> (\i: A. \) = \" + "finite A ==> (\i\A. \) = \" by (rule comm_monoid.finprod_one [OF a_comm_monoid, folded finsum_def, simplified monoid_record_simps]) @@ -310,7 +313,7 @@ assumes abelian_group: "abelian_group R" and monoid: "monoid R" and l_distr: "!!x y z. [| x \ carrier R; y \ carrier R; z \ carrier R |] - ==> mult R (add R x y) z = add R (mult R x z) (mult R y z)" + ==> (x \ y) \ z = x \ z \ y \ z" and r_distr: "!!x y z. [| x \ carrier R; y \ carrier R; z \ carrier R |] ==> z \ (x \ y) = z \ x \ z \ y" shows "ring R" @@ -330,7 +333,7 @@ assumes abelian_group: "abelian_group R" and comm_monoid: "comm_monoid R" and l_distr: "!!x y z. [| x \ carrier R; y \ carrier R; z \ carrier R |] - ==> mult R (add R x y) z = add R (mult R x z) (mult R y z)" + ==> (x \ y) \ z = x \ z \ y \ z" shows "cring R" proof (rule cring.intro) show "ring_axioms R" @@ -457,7 +460,7 @@ lemma includes ring R + cring S shows "[| a \ carrier R; b \ carrier R; c \ carrier S; d \ carrier S |] ==> - a \ \ (a \ \ b) = b & c \\<^sub>2 d = d \\<^sub>2 c" + a \ \ (a \ \ b) = b & c \\<^bsub>S\<^esub> d = d \\<^bsub>S\<^esub> c" by algebra lemma @@ -528,21 +531,21 @@ subsection {* Morphisms *} -constdefs +constdefs (structure R S) ring_hom :: "[('a, 'm) ring_scheme, ('b, 'n) ring_scheme] => ('a => 'b) set" "ring_hom R S == {h. h \ carrier R -> carrier S & (ALL x y. x \ carrier R & y \ carrier R --> - h (mult R x y) = mult S (h x) (h y) & - h (add R x y) = add S (h x) (h y)) & - h (one R) = one S}" + h (x \ y) = h x \\<^bsub>S\<^esub> h y & h (x \ y) = h x \\<^bsub>S\<^esub> h y) & + h \ = \\<^bsub>S\<^esub>}" lemma ring_hom_memI: + includes struct R + struct S assumes hom_closed: "!!x. x \ carrier R ==> h x \ carrier S" and hom_mult: "!!x y. [| x \ carrier R; y \ carrier R |] ==> - h (mult R x y) = mult S (h x) (h y)" + h (x \ y) = h x \\<^bsub>S\<^esub> h y" and hom_add: "!!x y. [| x \ carrier R; y \ carrier R |] ==> - h (add R x y) = add S (h x) (h y)" - and hom_one: "h (one R) = one S" + h (x \ y) = h x \\<^bsub>S\<^esub> h y" + and hom_one: "h \ = \\<^bsub>S\<^esub>" shows "h \ ring_hom R S" by (auto simp add: ring_hom_def prems Pi_def) @@ -551,17 +554,22 @@ by (auto simp add: ring_hom_def funcset_mem) lemma ring_hom_mult: - "[| h \ ring_hom R S; x \ carrier R; y \ carrier R |] ==> - h (mult R x y) = mult S (h x) (h y)" - by (simp add: ring_hom_def) + includes struct R + struct S + shows + "[| h \ ring_hom R S; x \ carrier R; y \ carrier R |] ==> + h (x \ y) = h x \\<^bsub>S\<^esub> h y" + by (simp add: ring_hom_def) lemma ring_hom_add: - "[| h \ ring_hom R S; x \ carrier R; y \ carrier R |] ==> - h (add R x y) = add S (h x) (h y)" - by (simp add: ring_hom_def) + includes struct R + struct S + shows + "[| h \ ring_hom R S; x \ carrier R; y \ carrier R |] ==> + h (x \ y) = h x \\<^bsub>S\<^esub> h y" + by (simp add: ring_hom_def) lemma ring_hom_one: - "h \ ring_hom R S ==> h (one R) = one S" + includes struct R + struct S + shows "h \ ring_hom R S ==> h \ = \\<^bsub>S\<^esub>" by (simp add: ring_hom_def) locale ring_hom_cring = cring R + cring S + var h + @@ -572,18 +580,18 @@ and hom_one [simp] = ring_hom_one [OF homh] lemma (in ring_hom_cring) hom_zero [simp]: - "h \ = \\<^sub>2" + "h \ = \\<^bsub>S\<^esub>" proof - - have "h \ \\<^sub>2 h \ = h \ \\<^sub>2 \\<^sub>2" + have "h \ \\<^bsub>S\<^esub> h \ = h \ \\<^bsub>S\<^esub> \\<^bsub>S\<^esub>" by (simp add: hom_add [symmetric] del: hom_add) then show ?thesis by (simp del: S.r_zero) qed lemma (in ring_hom_cring) hom_a_inv [simp]: - "x \ carrier R ==> h (\ x) = \\<^sub>2 h x" + "x \ carrier R ==> h (\ x) = \\<^bsub>S\<^esub> h x" proof - assume R: "x \ carrier R" - then have "h x \\<^sub>2 h (\ x) = h x \\<^sub>2 (\\<^sub>2 h x)" + then have "h x \\<^bsub>S\<^esub> h (\ x) = h x \\<^bsub>S\<^esub> (\\<^bsub>S\<^esub> h x)" by (simp add: hom_add [symmetric] R.r_neg S.r_neg del: hom_add) with R show ?thesis by simp qed