diff -r 4822d9597d1e -r d3671b878828 src/HOL/Algebra/Module.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Algebra/Module.thy Wed Apr 30 10:01:35 2003 +0200 @@ -0,0 +1,161 @@ +(* Title: HOL/Algebra/Module + ID: $Id$ + Author: Clemens Ballarin, started 15 April 2003 + Copyright: Clemens Ballarin +*) + +theory Module = CRing: + +section {* Modules over an Abelian Group *} + +record ('a, 'b) module = "'b ring" + + smult :: "['a, 'b] => 'b" (infixl "\\" 70) + +locale module = cring R + abelian_group M + + assumes smult_closed [simp, intro]: + "[| a \ carrier R; x \ carrier M |] ==> a \\<^sub>2 x \ carrier M" + and smult_l_distr: + "[| a \ carrier R; b \ carrier R; x \ carrier M |] ==> + (a \ b) \\<^sub>2 x = a \\<^sub>2 x \\<^sub>2 b \\<^sub>2 x" + and smult_r_distr: + "[| a \ carrier R; x \ carrier M; y \ carrier M |] ==> + a \\<^sub>2 (x \\<^sub>2 y) = a \\<^sub>2 x \\<^sub>2 a \\<^sub>2 y" + and smult_assoc1: + "[| a \ carrier R; b \ carrier R; x \ carrier M |] ==> + (a \ b) \\<^sub>2 x = a \\<^sub>2 (b \\<^sub>2 x)" + and smult_one [simp]: + "x \ carrier M ==> \ \\<^sub>2 x = x" + +locale algebra = module R M + cring M + + assumes smult_assoc2: + "[| a \ carrier R; x \ carrier M; y \ carrier M |] ==> + (a \\<^sub>2 x) \\<^sub>2 y = a \\<^sub>2 (x \\<^sub>2 y)" + +lemma moduleI: + assumes cring: "cring R" + and abelian_group: "abelian_group M" + and smult_closed: + "!!a x. [| a \ carrier R; x \ carrier M |] ==> smult M a x \ carrier M" + and smult_l_distr: + "!!a b x. [| a \ carrier R; b \ carrier R; x \ carrier M |] ==> + smult M (add R a b) x = add M (smult M a x) (smult M b x)" + and smult_r_distr: + "!!a x y. [| a \ carrier R; x \ carrier M; y \ carrier M |] ==> + smult M a (add M x y) = add M (smult M a x) (smult M a y)" + and smult_assoc1: + "!!a b x. [| a \ carrier R; b \ carrier R; x \ carrier M |] ==> + smult M (mult R a b) x = smult M a (smult M b x)" + and smult_one: + "!!x. x \ carrier M ==> smult M (one R) x = x" + shows "module R M" + by (auto intro: module.intro cring.axioms abelian_group.axioms + module_axioms.intro prems) + +lemma algebraI: + assumes R_cring: "cring R" + and M_cring: "cring M" + and smult_closed: + "!!a x. [| a \ carrier R; x \ carrier M |] ==> smult M a x \ carrier M" + and smult_l_distr: + "!!a b x. [| a \ carrier R; b \ carrier R; x \ carrier M |] ==> + smult M (add R a b) x = add M (smult M a x) (smult M b x)" + and smult_r_distr: + "!!a x y. [| a \ carrier R; x \ carrier M; y \ carrier M |] ==> + smult M a (add M x y) = add M (smult M a x) (smult M a y)" + and smult_assoc1: + "!!a b x. [| a \ carrier R; b \ carrier R; x \ carrier M |] ==> + smult M (mult R a b) x = smult M a (smult M b x)" + and smult_one: + "!!x. x \ carrier M ==> smult M (one R) x = x" + and smult_assoc2: + "!!a x y. [| a \ carrier R; x \ carrier M; y \ carrier M |] ==> + mult M (smult M a x) y = smult M a (mult M x y)" + shows "algebra R M" + by (auto intro!: algebra.intro algebra_axioms.intro cring.axioms + module_axioms.intro prems) + +lemma (in algebra) R_cring: + "cring R" + by (rule cring.intro) assumption+ + +lemma (in algebra) M_cring: + "cring M" + by (rule cring.intro) assumption+ + +lemma (in algebra) module: + "module R M" + by (auto intro: moduleI R_cring is_abelian_group + smult_l_distr smult_r_distr smult_assoc1) + +subsection {* Basic Properties of Algebras *} + +lemma (in algebra) smult_l_null [simp]: + "x \ carrier M ==> \ \\<^sub>2 x = \\<^sub>2" +proof - + assume M: "x \ carrier M" + note facts = M smult_closed + from facts have "\ \\<^sub>2 x = (\ \\<^sub>2 x \\<^sub>2 \ \\<^sub>2 x) \\<^sub>2 \\<^sub>2 (\ \\<^sub>2 x)" by algebra + also from M have "... = (\ \ \) \\<^sub>2 x \\<^sub>2 \\<^sub>2 (\ \\<^sub>2 x)" + by (simp add: smult_l_distr del: R.l_zero R.r_zero) + also from facts have "... = \\<^sub>2" by algebra + finally show ?thesis . +qed + +lemma (in algebra) smult_r_null [simp]: + "a \ carrier R ==> a \\<^sub>2 \\<^sub>2 = \\<^sub>2"; +proof - + assume R: "a \ carrier R" + note facts = R smult_closed + from facts have "a \\<^sub>2 \\<^sub>2 = (a \\<^sub>2 \\<^sub>2 \\<^sub>2 a \\<^sub>2 \\<^sub>2) \\<^sub>2 \\<^sub>2 (a \\<^sub>2 \\<^sub>2)" + by algebra + also from R have "... = a \\<^sub>2 (\\<^sub>2 \\<^sub>2 \\<^sub>2) \\<^sub>2 \\<^sub>2 (a \\<^sub>2 \\<^sub>2)" + by (simp add: smult_r_distr del: M.l_zero M.r_zero) + also from facts have "... = \\<^sub>2" by algebra + finally show ?thesis . +qed + +lemma (in algebra) smult_l_minus: + "[| a \ carrier R; x \ carrier M |] ==> (\a) \\<^sub>2 x = \\<^sub>2 (a \\<^sub>2 x)" +proof - + assume RM: "a \ carrier R" "x \ carrier M" + note facts = RM smult_closed + from facts have "(\a) \\<^sub>2 x = (\a \\<^sub>2 x \\<^sub>2 a \\<^sub>2 x) \\<^sub>2 \\<^sub>2(a \\<^sub>2 x)" by algebra + also from RM have "... = (\a \ a) \\<^sub>2 x \\<^sub>2 \\<^sub>2(a \\<^sub>2 x)" + by (simp add: smult_l_distr) + also from facts smult_l_null have "... = \\<^sub>2(a \\<^sub>2 x)" by algebra + finally show ?thesis . +qed + +lemma (in algebra) smult_r_minus: + "[| a \ carrier R; x \ carrier M |] ==> a \\<^sub>2 (\\<^sub>2x) = \\<^sub>2 (a \\<^sub>2 x)" +proof - + assume RM: "a \ carrier R" "x \ carrier M" + note facts = RM smult_closed + from facts have "a \\<^sub>2 (\\<^sub>2x) = (a \\<^sub>2 \\<^sub>2x \\<^sub>2 a \\<^sub>2 x) \\<^sub>2 \\<^sub>2(a \\<^sub>2 x)" + by algebra + also from RM have "... = a \\<^sub>2 (\\<^sub>2x \\<^sub>2 x) \\<^sub>2 \\<^sub>2(a \\<^sub>2 x)" + by (simp add: smult_r_distr) + also from facts smult_r_null have "... = \\<^sub>2(a \\<^sub>2 x)" by algebra + finally show ?thesis . +qed + +subsection {* Every Abelian Group is a $\mathbb{Z}$-module *} + +text {* Not finished. *} + +constdefs + INTEG :: "int ring" + "INTEG == (| carrier = UNIV, mult = op *, one = 1, zero = 0, add = op + |)" + +(* + INTEG_MODULE :: "('a, 'm) ring_scheme => (int, 'a) module" + "INTEG_MODULE R == (| carrier = carrier R, mult = mult R, one = one R, + zero = zero R, add = add R, smult = (%n. %x:carrier R. ... ) |)" +*) + +lemma cring_INTEG: + "cring INTEG" + by (unfold INTEG_def) (auto intro!: cringI abelian_groupI comm_monoidI + zadd_zminus_inverse2 zadd_zmult_distrib) + +end