(* Title: HOL/Algebra/CIdeal.thy Id: $Id: Ideal.thy,v 1.7 2008/04/24 14:53:09 haftmann Exp $ Author: Stephan Hohe, TU Muenchen *) theory Ideal imports Ring AbelCoset begin section {* Ideals *} subsection {* General definition *} locale ideal = additive_subgroup I R + ring R + assumes I_l_closed: "[|a ∈ I; x ∈ carrier R|] ==> x ⊗ a ∈ I" and I_r_closed: "[|a ∈ I; x ∈ carrier R|] ==> a ⊗ x ∈ I" interpretation ideal ⊆ abelian_subgroup I R apply (intro abelian_subgroupI3 abelian_group.intro) apply (rule ideal.axioms, rule ideal_axioms) apply (rule abelian_group.axioms, rule ring.axioms, rule ideal.axioms, rule ideal_axioms) apply (rule abelian_group.axioms, rule ring.axioms, rule ideal.axioms, rule ideal_axioms) done lemma (in ideal) is_ideal: "ideal I R" by (rule ideal_axioms) lemma idealI: includes ring assumes a_subgroup: "subgroup I (|carrier = carrier R, mult = add R, one = zero R|))," and I_l_closed: "!!a x. [|a ∈ I; x ∈ carrier R|] ==> x ⊗ a ∈ I" and I_r_closed: "!!a x. [|a ∈ I; x ∈ carrier R|] ==> a ⊗ x ∈ I" shows "ideal I R" apply (intro ideal.intro ideal_axioms.intro additive_subgroupI) apply (rule a_subgroup) apply (rule is_ring) apply (erule (1) I_l_closed) apply (erule (1) I_r_closed) done subsection {* Ideals Generated by a Subset of @{term [locale=ring] "carrier R"} *} constdefs (structure R) genideal :: "('a, 'b) ring_scheme => 'a set => 'a set" ("Idl\<index> _" [80] 79) "genideal R S ≡ Inter {I. ideal I R ∧ S ⊆ I}" subsection {* Principal Ideals *} locale principalideal = ideal + assumes generate: "∃i ∈ carrier R. I = Idl {i}" lemma (in principalideal) is_principalideal: shows "principalideal I R" by (rule principalideal_axioms) lemma principalidealI: includes ideal assumes generate: "∃i ∈ carrier R. I = Idl {i}" shows "principalideal I R" by (intro principalideal.intro principalideal_axioms.intro) (rule is_ideal, rule generate) subsection {* Maximal Ideals *} locale maximalideal = ideal + assumes I_notcarr: "carrier R ≠ I" and I_maximal: "[|ideal J R; I ⊆ J; J ⊆ carrier R|] ==> J = I ∨ J = carrier R" lemma (in maximalideal) is_maximalideal: shows "maximalideal I R" by (rule maximalideal_axioms) lemma maximalidealI: includes ideal assumes I_notcarr: "carrier R ≠ I" and I_maximal: "!!J. [|ideal J R; I ⊆ J; J ⊆ carrier R|] ==> J = I ∨ J = carrier R" shows "maximalideal I R" by (intro maximalideal.intro maximalideal_axioms.intro) (rule is_ideal, rule I_notcarr, rule I_maximal) subsection {* Prime Ideals *} locale primeideal = ideal + cring + assumes I_notcarr: "carrier R ≠ I" and I_prime: "[|a ∈ carrier R; b ∈ carrier R; a ⊗ b ∈ I|] ==> a ∈ I ∨ b ∈ I" lemma (in primeideal) is_primeideal: shows "primeideal I R" by (rule primeideal_axioms) lemma primeidealI: includes ideal includes cring assumes I_notcarr: "carrier R ≠ I" and I_prime: "!!a b. [|a ∈ carrier R; b ∈ carrier R; a ⊗ b ∈ I|] ==> a ∈ I ∨ b ∈ I" shows "primeideal I R" by (intro primeideal.intro primeideal_axioms.intro) (rule is_ideal, rule is_cring, rule I_notcarr, rule I_prime) lemma primeidealI2: includes additive_subgroup I R includes cring assumes I_l_closed: "!!a x. [|a ∈ I; x ∈ carrier R|] ==> x ⊗ a ∈ I" and I_r_closed: "!!a x. [|a ∈ I; x ∈ carrier R|] ==> a ⊗ x ∈ I" and I_notcarr: "carrier R ≠ I" and I_prime: "!!a b. [|a ∈ carrier R; b ∈ carrier R; a ⊗ b ∈ I|] ==> a ∈ I ∨ b ∈ I" shows "primeideal I R" apply (intro_locales) apply (intro ideal_axioms.intro) apply (erule (1) I_l_closed) apply (erule (1) I_r_closed) apply (intro primeideal_axioms.intro) apply (rule I_notcarr) apply (erule (2) I_prime) done section {* Properties of Ideals *} subsection {* Special Ideals *} lemma (in ring) zeroideal: shows "ideal {\<zero>} R" apply (intro idealI subgroup.intro) apply (rule is_ring) apply simp+ apply (fold a_inv_def, simp) apply simp+ done lemma (in ring) oneideal: shows "ideal (carrier R) R" apply (intro idealI subgroup.intro) apply (rule is_ring) apply simp+ apply (fold a_inv_def, simp) apply simp+ done lemma (in "domain") zeroprimeideal: shows "primeideal {\<zero>} R" apply (intro primeidealI) apply (rule zeroideal) apply (rule domain.axioms, rule domain_axioms) defer 1 apply (simp add: integral) proof (rule ccontr, simp) assume "carrier R = {\<zero>}" from this have "\<one> = \<zero>" by (rule one_zeroI) from this and one_not_zero show "False" by simp qed subsection {* General Ideal Properies *} lemma (in ideal) one_imp_carrier: assumes I_one_closed: "\<one> ∈ I" shows "I = carrier R" apply (rule) apply (rule) apply (rule a_Hcarr, simp) proof fix x assume xcarr: "x ∈ carrier R" from I_one_closed and this have "x ⊗ \<one> ∈ I" by (intro I_l_closed) from this and xcarr show "x ∈ I" by simp qed lemma (in ideal) Icarr: assumes iI: "i ∈ I" shows "i ∈ carrier R" using iI by (rule a_Hcarr) subsection {* Intersection of Ideals *} text {* \paragraph{Intersection of two ideals} The intersection of any two ideals is again an ideal in @{term R} *} lemma (in ring) i_intersect: includes ideal I R includes ideal J R shows "ideal (I ∩ J) R" apply (intro idealI subgroup.intro) apply (rule is_ring) apply (force simp add: a_subset) apply (simp add: a_inv_def[symmetric]) apply simp apply (simp add: a_inv_def[symmetric]) apply (clarsimp, rule) apply (fast intro: ideal.I_l_closed ideal.intro prems)+ apply (clarsimp, rule) apply (fast intro: ideal.I_r_closed ideal.intro prems)+ done subsubsection {* Intersection of a Set of Ideals *} text {* The intersection of any Number of Ideals is again an Ideal in @{term R} *} lemma (in ring) i_Intersect: assumes Sideals: "!!I. I ∈ S ==> ideal I R" and notempty: "S ≠ {}" shows "ideal (Inter S) R" apply (unfold_locales) apply (simp_all add: Inter_def INTER_def) apply (rule, simp) defer 1 apply rule defer 1 apply rule defer 1 apply (fold a_inv_def, rule) defer 1 apply rule defer 1 apply rule defer 1 proof - fix x assume "∀I∈S. x ∈ I" hence xI: "!!I. I ∈ S ==> x ∈ I" by simp from notempty have "∃I0. I0 ∈ S" by blast from this obtain I0 where I0S: "I0 ∈ S" by auto interpret ideal ["I0" "R"] by (rule Sideals[OF I0S]) from xI[OF I0S] have "x ∈ I0" . from this and a_subset show "x ∈ carrier R" by fast next fix x y assume "∀I∈S. x ∈ I" hence xI: "!!I. I ∈ S ==> x ∈ I" by simp assume "∀I∈S. y ∈ I" hence yI: "!!I. I ∈ S ==> y ∈ I" by simp fix J assume JS: "J ∈ S" interpret ideal ["J" "R"] by (rule Sideals[OF JS]) from xI[OF JS] and yI[OF JS] show "x ⊕ y ∈ J" by (rule a_closed) next fix J assume JS: "J ∈ S" interpret ideal ["J" "R"] by (rule Sideals[OF JS]) show "\<zero> ∈ J" by simp next fix x assume "∀I∈S. x ∈ I" hence xI: "!!I. I ∈ S ==> x ∈ I" by simp fix J assume JS: "J ∈ S" interpret ideal ["J" "R"] by (rule Sideals[OF JS]) from xI[OF JS] show "\<ominus> x ∈ J" by (rule a_inv_closed) next fix x y assume "∀I∈S. x ∈ I" hence xI: "!!I. I ∈ S ==> x ∈ I" by simp assume ycarr: "y ∈ carrier R" fix J assume JS: "J ∈ S" interpret ideal ["J" "R"] by (rule Sideals[OF JS]) from xI[OF JS] and ycarr show "y ⊗ x ∈ J" by (rule I_l_closed) next fix x y assume "∀I∈S. x ∈ I" hence xI: "!!I. I ∈ S ==> x ∈ I" by simp assume ycarr: "y ∈ carrier R" fix J assume JS: "J ∈ S" interpret ideal ["J" "R"] by (rule Sideals[OF JS]) from xI[OF JS] and ycarr show "x ⊗ y ∈ J" by (rule I_r_closed) qed subsection {* Addition of Ideals *} lemma (in ring) add_ideals: assumes idealI: "ideal I R" and idealJ: "ideal J R" shows "ideal (I <+> J) R" apply (rule ideal.intro) apply (rule add_additive_subgroups) apply (intro ideal.axioms[OF idealI]) apply (intro ideal.axioms[OF idealJ]) apply (rule is_ring) apply (rule ideal_axioms.intro) apply (simp add: set_add_defs, clarsimp) defer 1 apply (simp add: set_add_defs, clarsimp) defer 1 proof - fix x i j assume xcarr: "x ∈ carrier R" and iI: "i ∈ I" and jJ: "j ∈ J" from xcarr ideal.Icarr[OF idealI iI] ideal.Icarr[OF idealJ jJ] have c: "(i ⊕ j) ⊗ x = (i ⊗ x) ⊕ (j ⊗ x)" by algebra from xcarr and iI have a: "i ⊗ x ∈ I" by (simp add: ideal.I_r_closed[OF idealI]) from xcarr and jJ have b: "j ⊗ x ∈ J" by (simp add: ideal.I_r_closed[OF idealJ]) from a b c show "∃ha∈I. ∃ka∈J. (i ⊕ j) ⊗ x = ha ⊕ ka" by fast next fix x i j assume xcarr: "x ∈ carrier R" and iI: "i ∈ I" and jJ: "j ∈ J" from xcarr ideal.Icarr[OF idealI iI] ideal.Icarr[OF idealJ jJ] have c: "x ⊗ (i ⊕ j) = (x ⊗ i) ⊕ (x ⊗ j)" by algebra from xcarr and iI have a: "x ⊗ i ∈ I" by (simp add: ideal.I_l_closed[OF idealI]) from xcarr and jJ have b: "x ⊗ j ∈ J" by (simp add: ideal.I_l_closed[OF idealJ]) from a b c show "∃ha∈I. ∃ka∈J. x ⊗ (i ⊕ j) = ha ⊕ ka" by fast qed subsection {* Ideals generated by a subset of @{term [locale=ring] "carrier R"} *} subsubsection {* Generation of Ideals in General Rings *} text {* @{term genideal} generates an ideal *} lemma (in ring) genideal_ideal: assumes Scarr: "S ⊆ carrier R" shows "ideal (Idl S) R" unfolding genideal_def proof (rule i_Intersect, fast, simp) from oneideal and Scarr show "∃I. ideal I R ∧ S ≤ I" by fast qed lemma (in ring) genideal_self: assumes "S ⊆ carrier R" shows "S ⊆ Idl S" unfolding genideal_def by fast lemma (in ring) genideal_self': assumes carr: "i ∈ carrier R" shows "i ∈ Idl {i}" proof - from carr have "{i} ⊆ Idl {i}" by (fast intro!: genideal_self) thus "i ∈ Idl {i}" by fast qed text {* @{term genideal} generates the minimal ideal *} lemma (in ring) genideal_minimal: assumes a: "ideal I R" and b: "S ⊆ I" shows "Idl S ⊆ I" unfolding genideal_def by (rule, elim InterD, simp add: a b) text {* Generated ideals and subsets *} lemma (in ring) Idl_subset_ideal: assumes Iideal: "ideal I R" and Hcarr: "H ⊆ carrier R" shows "(Idl H ⊆ I) = (H ⊆ I)" proof assume a: "Idl H ⊆ I" from Hcarr have "H ⊆ Idl H" by (rule genideal_self) from this and a show "H ⊆ I" by simp next fix x assume HI: "H ⊆ I" from Iideal and HI have "I ∈ {I. ideal I R ∧ H ⊆ I}" by fast from this show "Idl H ⊆ I" unfolding genideal_def by fast qed lemma (in ring) subset_Idl_subset: assumes Icarr: "I ⊆ carrier R" and HI: "H ⊆ I" shows "Idl H ⊆ Idl I" proof - from HI and genideal_self[OF Icarr] have HIdlI: "H ⊆ Idl I" by fast from Icarr have Iideal: "ideal (Idl I) R" by (rule genideal_ideal) from HI and Icarr have "H ⊆ carrier R" by fast from Iideal and this have "(H ⊆ Idl I) = (Idl H ⊆ Idl I)" by (rule Idl_subset_ideal[symmetric]) from HIdlI and this show "Idl H ⊆ Idl I" by simp qed lemma (in ring) Idl_subset_ideal': assumes acarr: "a ∈ carrier R" and bcarr: "b ∈ carrier R" shows "(Idl {a} ⊆ Idl {b}) = (a ∈ Idl {b})" apply (subst Idl_subset_ideal[OF genideal_ideal[of "{b}"], of "{a}"]) apply (fast intro: bcarr, fast intro: acarr) apply fast done lemma (in ring) genideal_zero: "Idl {\<zero>} = {\<zero>}" apply rule apply (rule genideal_minimal[OF zeroideal], simp) apply (simp add: genideal_self') done lemma (in ring) genideal_one: "Idl {\<one>} = carrier R" proof - interpret ideal ["Idl {\<one>}" "R"] by (rule genideal_ideal, fast intro: one_closed) show "Idl {\<one>} = carrier R" apply (rule, rule a_subset) apply (simp add: one_imp_carrier genideal_self') done qed subsubsection {* Generation of Principal Ideals in Commutative Rings *} constdefs (structure R) cgenideal :: "('a, 'b) monoid_scheme => 'a => 'a set" ("PIdl\<index> _" [80] 79) "cgenideal R a ≡ { x ⊗ a | x. x ∈ carrier R }" text {* genhideal (?) really generates an ideal *} lemma (in cring) cgenideal_ideal: assumes acarr: "a ∈ carrier R" shows "ideal (PIdl a) R" apply (unfold cgenideal_def) apply (rule idealI[OF is_ring]) apply (rule subgroup.intro) apply (simp_all add: monoid_record_simps) apply (blast intro: acarr m_closed) apply clarsimp defer 1 defer 1 apply (fold a_inv_def, clarsimp) defer 1 apply clarsimp defer 1 apply clarsimp defer 1 proof - fix x y assume xcarr: "x ∈ carrier R" and ycarr: "y ∈ carrier R" note carr = acarr xcarr ycarr from carr have "x ⊗ a ⊕ y ⊗ a = (x ⊕ y) ⊗ a" by (simp add: l_distr) from this and carr show "∃z. x ⊗ a ⊕ y ⊗ a = z ⊗ a ∧ z ∈ carrier R" by fast next from l_null[OF acarr, symmetric] and zero_closed show "∃x. \<zero> = x ⊗ a ∧ x ∈ carrier R" by fast next fix x assume xcarr: "x ∈ carrier R" note carr = acarr xcarr from carr have "\<ominus> (x ⊗ a) = (\<ominus> x) ⊗ a" by (simp add: l_minus) from this and carr show "∃z. \<ominus> (x ⊗ a) = z ⊗ a ∧ z ∈ carrier R" by fast next fix x y assume xcarr: "x ∈ carrier R" and ycarr: "y ∈ carrier R" note carr = acarr xcarr ycarr from carr have "y ⊗ a ⊗ x = (y ⊗ x) ⊗ a" by (simp add: m_assoc, simp add: m_comm) from this and carr show "∃z. y ⊗ a ⊗ x = z ⊗ a ∧ z ∈ carrier R" by fast next fix x y assume xcarr: "x ∈ carrier R" and ycarr: "y ∈ carrier R" note carr = acarr xcarr ycarr from carr have "x ⊗ (y ⊗ a) = (x ⊗ y) ⊗ a" by (simp add: m_assoc) from this and carr show "∃z. x ⊗ (y ⊗ a) = z ⊗ a ∧ z ∈ carrier R" by fast qed lemma (in ring) cgenideal_self: assumes icarr: "i ∈ carrier R" shows "i ∈ PIdl i" unfolding cgenideal_def proof simp from icarr have "i = \<one> ⊗ i" by simp from this and icarr show "∃x. i = x ⊗ i ∧ x ∈ carrier R" by fast qed text {* @{const "cgenideal"} is minimal *} lemma (in ring) cgenideal_minimal: includes ideal J R assumes aJ: "a ∈ J" shows "PIdl a ⊆ J" unfolding cgenideal_def apply rule apply clarify using aJ apply (erule I_l_closed) done lemma (in cring) cgenideal_eq_genideal: assumes icarr: "i ∈ carrier R" shows "PIdl i = Idl {i}" apply rule apply (intro cgenideal_minimal) apply (rule genideal_ideal, fast intro: icarr) apply (rule genideal_self', fast intro: icarr) apply (intro genideal_minimal) apply (rule cgenideal_ideal [OF icarr]) apply (simp, rule cgenideal_self [OF icarr]) done lemma (in cring) cgenideal_eq_rcos: "PIdl i = carrier R #> i" unfolding cgenideal_def r_coset_def by fast lemma (in cring) cgenideal_is_principalideal: assumes icarr: "i ∈ carrier R" shows "principalideal (PIdl i) R" apply (rule principalidealI) apply (rule cgenideal_ideal [OF icarr]) proof - from icarr have "PIdl i = Idl {i}" by (rule cgenideal_eq_genideal) from icarr and this show "∃i'∈carrier R. PIdl i = Idl {i'}" by fast qed subsection {* Union of Ideals *} lemma (in ring) union_genideal: assumes idealI: "ideal I R" and idealJ: "ideal J R" shows "Idl (I ∪ J) = I <+> J" apply rule apply (rule ring.genideal_minimal) apply (rule R.is_ring) apply (rule add_ideals[OF idealI idealJ]) apply (rule) apply (simp add: set_add_defs) apply (elim disjE) defer 1 defer 1 apply (rule) apply (simp add: set_add_defs genideal_def) apply clarsimp defer 1 proof - fix x assume xI: "x ∈ I" have ZJ: "\<zero> ∈ J" by (intro additive_subgroup.zero_closed, rule ideal.axioms[OF idealJ]) from ideal.Icarr[OF idealI xI] have "x = x ⊕ \<zero>" by algebra from xI and ZJ and this show "∃h∈I. ∃k∈J. x = h ⊕ k" by fast next fix x assume xJ: "x ∈ J" have ZI: "\<zero> ∈ I" by (intro additive_subgroup.zero_closed, rule ideal.axioms[OF idealI]) from ideal.Icarr[OF idealJ xJ] have "x = \<zero> ⊕ x" by algebra from ZI and xJ and this show "∃h∈I. ∃k∈J. x = h ⊕ k" by fast next fix i j K assume iI: "i ∈ I" and jJ: "j ∈ J" and idealK: "ideal K R" and IK: "I ⊆ K" and JK: "J ⊆ K" from iI and IK have iK: "i ∈ K" by fast from jJ and JK have jK: "j ∈ K" by fast from iK and jK show "i ⊕ j ∈ K" by (intro additive_subgroup.a_closed) (rule ideal.axioms[OF idealK]) qed subsection {* Properties of Principal Ideals *} text {* @{text "\<zero>"} generates the zero ideal *} lemma (in ring) zero_genideal: shows "Idl {\<zero>} = {\<zero>}" apply rule apply (simp add: genideal_minimal zeroideal) apply (fast intro!: genideal_self) done text {* @{text "\<one>"} generates the unit ideal *} lemma (in ring) one_genideal: shows "Idl {\<one>} = carrier R" proof - have "\<one> ∈ Idl {\<one>}" by (simp add: genideal_self') thus "Idl {\<one>} = carrier R" by (intro ideal.one_imp_carrier, fast intro: genideal_ideal) qed text {* The zero ideal is a principal ideal *} corollary (in ring) zeropideal: shows "principalideal {\<zero>} R" apply (rule principalidealI) apply (rule zeroideal) apply (blast intro!: zero_closed zero_genideal[symmetric]) done text {* The unit ideal is a principal ideal *} corollary (in ring) onepideal: shows "principalideal (carrier R) R" apply (rule principalidealI) apply (rule oneideal) apply (blast intro!: one_closed one_genideal[symmetric]) done text {* Every principal ideal is a right coset of the carrier *} lemma (in principalideal) rcos_generate: includes cring shows "∃x∈I. I = carrier R #> x" proof - from generate obtain i where icarr: "i ∈ carrier R" and I1: "I = Idl {i}" by fast+ from icarr and genideal_self[of "{i}"] have "i ∈ Idl {i}" by fast hence iI: "i ∈ I" by (simp add: I1) from I1 icarr have I2: "I = PIdl i" by (simp add: cgenideal_eq_genideal) have "PIdl i = carrier R #> i" unfolding cgenideal_def r_coset_def by fast from I2 and this have "I = carrier R #> i" by simp from iI and this show "∃x∈I. I = carrier R #> x" by fast qed subsection {* Prime Ideals *} lemma (in ideal) primeidealCD: includes cring assumes notprime: "¬ primeideal I R" shows "carrier R = I ∨ (∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I)" proof (rule ccontr, clarsimp) assume InR: "carrier R ≠ I" and "∀a. a ∈ carrier R --> (∀b. a ⊗ b ∈ I --> b ∈ carrier R --> a ∈ I ∨ b ∈ I)" hence I_prime: "!! a b. [|a ∈ carrier R; b ∈ carrier R; a ⊗ b ∈ I|] ==> a ∈ I ∨ b ∈ I" by simp have "primeideal I R" apply (rule primeideal.intro [OF is_ideal is_cring]) apply (rule primeideal_axioms.intro) apply (rule InR) apply (erule (2) I_prime) done from this and notprime show "False" by simp qed lemma (in ideal) primeidealCE: includes cring assumes notprime: "¬ primeideal I R" obtains "carrier R = I" | "∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I" using primeidealCD [OF R.is_cring notprime] by blast text {* If @{text "{\<zero>}"} is a prime ideal of a commutative ring, the ring is a domain *} lemma (in cring) zeroprimeideal_domainI: assumes pi: "primeideal {\<zero>} R" shows "domain R" apply (rule domain.intro, rule is_cring) apply (rule domain_axioms.intro) proof (rule ccontr, simp) interpret primeideal ["{\<zero>}" "R"] by (rule pi) assume "\<one> = \<zero>" hence "carrier R = {\<zero>}" by (rule one_zeroD) from this[symmetric] and I_notcarr show "False" by simp next interpret primeideal ["{\<zero>}" "R"] by (rule pi) fix a b assume ab: "a ⊗ b = \<zero>" and carr: "a ∈ carrier R" "b ∈ carrier R" from ab have abI: "a ⊗ b ∈ {\<zero>}" by fast from carr and this have "a ∈ {\<zero>} ∨ b ∈ {\<zero>}" by (rule I_prime) thus "a = \<zero> ∨ b = \<zero>" by simp qed corollary (in cring) domain_eq_zeroprimeideal: shows "domain R = primeideal {\<zero>} R" apply rule apply (erule domain.zeroprimeideal) apply (erule zeroprimeideal_domainI) done subsection {* Maximal Ideals *} lemma (in ideal) helper_I_closed: assumes carr: "a ∈ carrier R" "x ∈ carrier R" "y ∈ carrier R" and axI: "a ⊗ x ∈ I" shows "a ⊗ (x ⊗ y) ∈ I" proof - from axI and carr have "(a ⊗ x) ⊗ y ∈ I" by (simp add: I_r_closed) also from carr have "(a ⊗ x) ⊗ y = a ⊗ (x ⊗ y)" by (simp add: m_assoc) finally show "a ⊗ (x ⊗ y) ∈ I" . qed lemma (in ideal) helper_max_prime: includes cring assumes acarr: "a ∈ carrier R" shows "ideal {x∈carrier R. a ⊗ x ∈ I} R" apply (rule idealI) apply (rule cring.axioms[OF is_cring]) apply (rule subgroup.intro) apply (simp, fast) apply clarsimp apply (simp add: r_distr acarr) apply (simp add: acarr) apply (simp add: a_inv_def[symmetric], clarify) defer 1 apply clarsimp defer 1 apply (fast intro!: helper_I_closed acarr) proof - fix x assume xcarr: "x ∈ carrier R" and ax: "a ⊗ x ∈ I" from ax and acarr xcarr have "\<ominus>(a ⊗ x) ∈ I" by simp also from acarr xcarr have "\<ominus>(a ⊗ x) = a ⊗ (\<ominus>x)" by algebra finally show "a ⊗ (\<ominus>x) ∈ I" . from acarr have "a ⊗ \<zero> = \<zero>" by simp next fix x y assume xcarr: "x ∈ carrier R" and ycarr: "y ∈ carrier R" and ayI: "a ⊗ y ∈ I" from ayI and acarr xcarr ycarr have "a ⊗ (y ⊗ x) ∈ I" by (simp add: helper_I_closed) moreover from xcarr ycarr have "y ⊗ x = x ⊗ y" by (simp add: m_comm) ultimately show "a ⊗ (x ⊗ y) ∈ I" by simp qed text {* In a cring every maximal ideal is prime *} lemma (in cring) maximalideal_is_prime: includes maximalideal shows "primeideal I R" apply (rule ccontr) apply (rule primeidealCE) apply (rule is_cring) apply assumption apply (simp add: I_notcarr) proof - assume "∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I" from this obtain a b where acarr: "a ∈ carrier R" and bcarr: "b ∈ carrier R" and abI: "a ⊗ b ∈ I" and anI: "a ∉ I" and bnI: "b ∉ I" by fast def J ≡ "{x∈carrier R. a ⊗ x ∈ I}" from R.is_cring and acarr have idealJ: "ideal J R" unfolding J_def by (rule helper_max_prime) have IsubJ: "I ⊆ J" proof fix x assume xI: "x ∈ I" from this and acarr have "a ⊗ x ∈ I" by (intro I_l_closed) from xI[THEN a_Hcarr] this show "x ∈ J" unfolding J_def by fast qed from abI and acarr bcarr have "b ∈ J" unfolding J_def by fast from bnI and this have JnI: "J ≠ I" by fast from acarr have "a = a ⊗ \<one>" by algebra from this and anI have "a ⊗ \<one> ∉ I" by simp from one_closed and this have "\<one> ∉ J" unfolding J_def by fast hence Jncarr: "J ≠ carrier R" by fast interpret ideal ["J" "R"] by (rule idealJ) have "J = I ∨ J = carrier R" apply (intro I_maximal) apply (rule idealJ) apply (rule IsubJ) apply (rule a_subset) done from this and JnI and Jncarr show "False" by simp qed subsection {* Derived Theorems Involving Ideals *} --"A non-zero cring that has only the two trivial ideals is a field" lemma (in cring) trivialideals_fieldI: assumes carrnzero: "carrier R ≠ {\<zero>}" and haveideals: "{I. ideal I R} = {{\<zero>}, carrier R}" shows "field R" apply (rule cring_fieldI) apply (rule, rule, rule) apply (erule Units_closed) defer 1 apply rule defer 1 proof (rule ccontr, simp) assume zUnit: "\<zero> ∈ Units R" hence a: "\<zero> ⊗ inv \<zero> = \<one>" by (rule Units_r_inv) from zUnit have "\<zero> ⊗ inv \<zero> = \<zero>" by (intro l_null, rule Units_inv_closed) from a[symmetric] and this have "\<one> = \<zero>" by simp hence "carrier R = {\<zero>}" by (rule one_zeroD) from this and carrnzero show "False" by simp next fix x assume xcarr': "x ∈ carrier R - {\<zero>}" hence xcarr: "x ∈ carrier R" by fast from xcarr' have xnZ: "x ≠ \<zero>" by fast from xcarr have xIdl: "ideal (PIdl x) R" by (intro cgenideal_ideal, fast) from xcarr have "x ∈ PIdl x" by (intro cgenideal_self, fast) from this and xnZ have "PIdl x ≠ {\<zero>}" by fast from haveideals and this have "PIdl x = carrier R" by (blast intro!: xIdl) hence "\<one> ∈ PIdl x" by simp hence "∃y. \<one> = y ⊗ x ∧ y ∈ carrier R" unfolding cgenideal_def by blast from this obtain y where ycarr: " y ∈ carrier R" and ylinv: "\<one> = y ⊗ x" by fast+ from ylinv and xcarr ycarr have yrinv: "\<one> = x ⊗ y" by (simp add: m_comm) from ycarr and ylinv[symmetric] and yrinv[symmetric] have "∃y ∈ carrier R. y ⊗ x = \<one> ∧ x ⊗ y = \<one>" by fast from this and xcarr show "x ∈ Units R" unfolding Units_def by fast qed lemma (in field) all_ideals: shows "{I. ideal I R} = {{\<zero>}, carrier R}" apply (rule, rule) proof - fix I assume a: "I ∈ {I. ideal I R}" with this interpret ideal ["I" "R"] by simp show "I ∈ {{\<zero>}, carrier R}" proof (cases "∃a. a ∈ I - {\<zero>}") assume "∃a. a ∈ I - {\<zero>}" from this obtain a where aI: "a ∈ I" and anZ: "a ≠ \<zero>" by fast+ from aI[THEN a_Hcarr] anZ have aUnit: "a ∈ Units R" by (simp add: field_Units) hence a: "a ⊗ inv a = \<one>" by (rule Units_r_inv) from aI and aUnit have "a ⊗ inv a ∈ I" by (simp add: I_r_closed) hence oneI: "\<one> ∈ I" by (simp add: a[symmetric]) have "carrier R ⊆ I" proof fix x assume xcarr: "x ∈ carrier R" from oneI and this have "\<one> ⊗ x ∈ I" by (rule I_r_closed) from this and xcarr show "x ∈ I" by simp qed from this and a_subset have "I = carrier R" by fast thus "I ∈ {{\<zero>}, carrier R}" by fast next assume "¬ (∃a. a ∈ I - {\<zero>})" hence IZ: "!!a. a ∈ I ==> a = \<zero>" by simp have a: "I ⊆ {\<zero>}" proof fix x assume "x ∈ I" hence "x = \<zero>" by (rule IZ) thus "x ∈ {\<zero>}" by fast qed have "\<zero> ∈ I" by simp hence "{\<zero>} ⊆ I" by fast from this and a have "I = {\<zero>}" by fast thus "I ∈ {{\<zero>}, carrier R}" by fast qed qed (simp add: zeroideal oneideal) --"Jacobson Theorem 2.2" lemma (in cring) trivialideals_eq_field: assumes carrnzero: "carrier R ≠ {\<zero>}" shows "({I. ideal I R} = {{\<zero>}, carrier R}) = field R" by (fast intro!: trivialideals_fieldI[OF carrnzero] field.all_ideals) text {* Like zeroprimeideal for domains *} lemma (in field) zeromaximalideal: "maximalideal {\<zero>} R" apply (rule maximalidealI) apply (rule zeroideal) proof- from one_not_zero have "\<one> ∉ {\<zero>}" by simp from this and one_closed show "carrier R ≠ {\<zero>}" by fast next fix J assume Jideal: "ideal J R" hence "J ∈ {I. ideal I R}" by fast from this and all_ideals show "J = {\<zero>} ∨ J = carrier R" by simp qed lemma (in cring) zeromaximalideal_fieldI: assumes zeromax: "maximalideal {\<zero>} R" shows "field R" apply (rule trivialideals_fieldI, rule maximalideal.I_notcarr[OF zeromax]) apply rule apply clarsimp defer 1 apply (simp add: zeroideal oneideal) proof - fix J assume Jn0: "J ≠ {\<zero>}" and idealJ: "ideal J R" interpret ideal ["J" "R"] by (rule idealJ) have "{\<zero>} ⊆ J" by (rule ccontr, simp) from zeromax and idealJ and this and a_subset have "J = {\<zero>} ∨ J = carrier R" by (rule maximalideal.I_maximal) from this and Jn0 show "J = carrier R" by simp qed lemma (in cring) zeromaximalideal_eq_field: "maximalideal {\<zero>} R = field R" apply rule apply (erule zeromaximalideal_fieldI) apply (erule field.zeromaximalideal) done end
lemma is_ideal:
ideal I R
lemma idealI:
[| Ring.ring R;
subgroup I (| carrier = carrier R, mult = op ⊕R, one = \<zero>R |);
!!a x. [| a ∈ I; x ∈ carrier R |] ==> x ⊗R a ∈ I;
!!a x. [| a ∈ I; x ∈ carrier R |] ==> a ⊗R x ∈ I |]
==> ideal I R
lemma is_principalideal:
principalideal I R
lemma principalidealI:
[| ideal I R; ∃i∈carrier R. I = IdlR {i} |] ==> principalideal I R
lemma is_maximalideal:
maximalideal I R
lemma maximalidealI:
[| ideal I R; carrier R ≠ I;
!!J. [| ideal J R; I ⊆ J; J ⊆ carrier R |] ==> J = I ∨ J = carrier R |]
==> maximalideal I R
lemma is_primeideal:
primeideal I R
lemma primeidealI:
[| ideal I R; cring R; carrier R ≠ I;
!!a b. [| a ∈ carrier R; b ∈ carrier R; a ⊗R b ∈ I |] ==> a ∈ I ∨ b ∈ I |]
==> primeideal I R
lemma primeidealI2:
[| additive_subgroup I R; cring R;
!!a x. [| a ∈ I; x ∈ carrier R |] ==> x ⊗R a ∈ I;
!!a x. [| a ∈ I; x ∈ carrier R |] ==> a ⊗R x ∈ I; carrier R ≠ I;
!!a b. [| a ∈ carrier R; b ∈ carrier R; a ⊗R b ∈ I |] ==> a ∈ I ∨ b ∈ I |]
==> primeideal I R
lemma zeroideal:
ideal {\<zero>} R
lemma oneideal:
ideal (carrier R) R
lemma zeroprimeideal:
primeideal {\<zero>} R
lemma one_imp_carrier:
\<one> ∈ I ==> I = carrier R
lemma Icarr:
i ∈ I ==> i ∈ carrier R
lemma i_intersect:
[| ideal I R; ideal J R |] ==> ideal (I ∩ J) R
lemma i_Intersect:
[| !!I. I ∈ S ==> ideal I R; S ≠ {} |] ==> ideal (Inter S) R
lemma add_ideals:
[| ideal I R; ideal J R |] ==> ideal (I <+> J) R
lemma genideal_ideal:
S ⊆ carrier R ==> ideal (Idl S) R
lemma genideal_self:
S ⊆ carrier R ==> S ⊆ Idl S
lemma genideal_self':
i ∈ carrier R ==> i ∈ Idl {i}
lemma genideal_minimal:
[| ideal I R; S ⊆ I |] ==> Idl S ⊆ I
lemma Idl_subset_ideal:
[| ideal I R; H ⊆ carrier R |] ==> (Idl H ⊆ I) = (H ⊆ I)
lemma subset_Idl_subset:
[| I ⊆ carrier R; H ⊆ I |] ==> Idl H ⊆ Idl I
lemma Idl_subset_ideal':
[| a ∈ carrier R; b ∈ carrier R |] ==> (Idl {a} ⊆ Idl {b}) = (a ∈ Idl {b})
lemma genideal_zero:
Idl {\<zero>} = {\<zero>}
lemma genideal_one:
Idl {\<one>} = carrier R
lemma cgenideal_ideal:
a ∈ carrier R ==> ideal (PIdl a) R
lemma cgenideal_self:
i ∈ carrier R ==> i ∈ PIdl i
lemma cgenideal_minimal:
[| ideal J R; a ∈ J |] ==> PIdl a ⊆ J
lemma cgenideal_eq_genideal:
i ∈ carrier R ==> PIdl i = Idl {i}
lemma cgenideal_eq_rcos:
PIdl i = carrier R #> i
lemma cgenideal_is_principalideal:
i ∈ carrier R ==> principalideal (PIdl i) R
lemma union_genideal:
[| ideal I R; ideal J R |] ==> Idl (I ∪ J) = I <+> J
lemma zero_genideal:
Idl {\<zero>} = {\<zero>}
lemma one_genideal:
Idl {\<one>} = carrier R
corollary zeropideal:
principalideal {\<zero>} R
corollary onepideal:
principalideal (carrier R) R
lemma rcos_generate:
cring R ==> ∃x∈I. I = carrier R #> x
lemma primeidealCD:
[| cring R; ¬ primeideal I R |]
==> carrier R = I ∨
(∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I)
lemma primeidealCE:
[| cring R; ¬ primeideal I R; carrier R = I ==> thesis;
∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I ==> thesis |]
==> thesis
lemma zeroprimeideal_domainI:
primeideal {\<zero>} R ==> domain R
corollary domain_eq_zeroprimeideal:
domain R = primeideal {\<zero>} R
lemma helper_I_closed:
[| a ∈ carrier R; x ∈ carrier R; y ∈ carrier R; a ⊗ x ∈ I |] ==> a ⊗ (x ⊗ y) ∈ I
lemma helper_max_prime:
[| cring R; a ∈ carrier R |] ==> ideal {x : carrier R. a ⊗ x ∈ I} R
lemma maximalideal_is_prime:
maximalideal I R ==> primeideal I R
lemma trivialideals_fieldI:
[| carrier R ≠ {\<zero>}; {I. ideal I R} = {{\<zero>}, carrier R} |]
==> Ring.field R
lemma all_ideals:
{I. ideal I R} = {{\<zero>}, carrier R}
lemma trivialideals_eq_field:
carrier R ≠ {\<zero>}
==> ({I. ideal I R} = {{\<zero>}, carrier R}) = Ring.field R
lemma zeromaximalideal:
maximalideal {\<zero>} R
lemma zeromaximalideal_fieldI:
maximalideal {\<zero>} R ==> Ring.field R
lemma zeromaximalideal_eq_field:
maximalideal {\<zero>} R = Ring.field R