# Theory Ideal

Up to index of Isabelle/HOL/Free-Groups

theory Ideal
imports AbelCoset
`(*  Title:      HOL/Algebra/Ideal.thy    Author:     Stephan Hohe, TU Muenchen*)theory Idealimports Ring AbelCosetbeginsection {* Ideals *}subsection {* Definitions *}subsubsection {* General definition *}locale ideal = additive_subgroup I R + ring R for I and R (structure) +  assumes I_l_closed: "[|a ∈ I; x ∈ carrier R|] ==> x ⊗ a ∈ I"    and I_r_closed: "[|a ∈ I; x ∈ carrier R|] ==> a ⊗ x ∈ I"sublocale 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)  donelemma (in ideal) is_ideal: "ideal I R"  by (rule ideal_axioms)lemma idealI:  fixes R (structure)  assumes "ring R"  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"proof -  interpret ring R by fact  show ?thesis  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)  doneqedsubsubsection (in ring) {* Ideals Generated by a Subset of @{term "carrier R"} *}definition genideal :: "_ => 'a set => 'a set"  ("Idl\<index> _" [80] 79)  where "genideal R S = Inter {I. ideal I R ∧ S ⊆ I}"subsubsection {* Principal Ideals *}locale principalideal = ideal +  assumes generate: "∃i ∈ carrier R. I = Idl {i}"lemma (in principalideal) is_principalideal: "principalideal I R"  by (rule principalideal_axioms)lemma principalidealI:  fixes R (structure)  assumes "ideal I R"    and generate: "∃i ∈ carrier R. I = Idl {i}"  shows "principalideal I R"proof -  interpret ideal I R by fact  show ?thesis    by (intro principalideal.intro principalideal_axioms.intro)      (rule is_ideal, rule generate)qedsubsubsection {* 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: "maximalideal I R"  by (rule maximalideal_axioms)lemma maximalidealI:  fixes R  assumes "ideal I R"    and 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"proof -  interpret ideal I R by fact  show ?thesis    by (intro maximalideal.intro maximalideal_axioms.intro)      (rule is_ideal, rule I_notcarr, rule I_maximal)qedsubsubsection {* 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: "primeideal I R"  by (rule primeideal_axioms)lemma primeidealI:  fixes R (structure)  assumes "ideal I R"    and "cring R"    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"proof -  interpret ideal I R by fact  interpret cring R by fact  show ?thesis    by (intro primeideal.intro primeideal_axioms.intro)      (rule is_ideal, rule is_cring, rule I_notcarr, rule I_prime)qedlemma primeidealI2:  fixes R (structure)  assumes "additive_subgroup I R"    and "cring 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"    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"proof -  interpret additive_subgroup I R by fact  interpret cring R by fact  show ?thesis 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)    doneqedsubsection {* Special Ideals *}lemma (in ring) zeroideal: "ideal {\<zero>} R"  apply (intro idealI subgroup.intro)        apply (rule is_ring)       apply simp+    apply (fold a_inv_def, simp)   apply simp+  donelemma (in ring) oneideal: "ideal (carrier R) R"  by (rule idealI) (auto intro: is_ring add.subgroupI)lemma (in "domain") zeroprimeideal: "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>}"  then have "\<one> = \<zero>" by (rule one_zeroI)  with one_not_zero show False by simpqedsubsection {* 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"  with I_one_closed have "x ⊗ \<one> ∈ I" by (intro I_l_closed)  with xcarr show "x ∈ I" by simpqedlemma (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:  assumes "ideal I R"  assumes "ideal J R"  shows "ideal (I ∩ J) R"proof -  interpret ideal I R by fact  interpret ideal J R by fact  show ?thesis    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 assms)+    apply (clarsimp, rule)     apply (fast intro: ideal.I_r_closed ideal.intro assms)+    doneqedtext {* 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_eq)        apply rule unfolding mem_Collect_eq 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 1proof -  fix x y  assume "∀I∈S. x ∈ I"  then have xI: "!!I. I ∈ S ==> x ∈ I" by simp  assume "∀I∈S. y ∈ I"  then have 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 simpnext  fix x  assume "∀I∈S. x ∈ I"  then have 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"  then have 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"  then have 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)next  fix x  assume "∀I∈S. x ∈ I"  then have xI: "!!I. I ∈ S ==> x ∈ I" by simp  from notempty have "∃I0. I0 ∈ S" by blast  then obtain I0 where I0S: "I0 ∈ S" by auto  interpret ideal I0 R by (rule Sideals[OF I0S])  from xI[OF I0S] have "x ∈ I0" .  with a_subset show "x ∈ carrier R" by fastnextqedsubsection {* 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 1proof -  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 fastnext  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 fastqedsubsection (in ring) {* Ideals generated by a subset of @{term "carrier R"} *}text {* @{term genideal} generates an ideal *}lemma (in ring) genideal_ideal:  assumes Scarr: "S ⊆ carrier R"  shows "ideal (Idl S) R"unfolding genideal_defproof (rule i_Intersect, fast, simp)  from oneideal and Scarr  show "∃I. ideal I R ∧ S ≤ I" by fastqedlemma (in ring) genideal_self:  assumes "S ⊆ carrier R"  shows "S ⊆ Idl S"  unfolding genideal_def by fastlemma (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)  then show "i ∈ Idl {i}" by fastqedtext {* @{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)  with a show "H ⊆ I" by simpnext  fix x  assume "H ⊆ I"  with Iideal have "I ∈ {I. ideal I R ∧ H ⊆ I}" by fast  then show "Idl H ⊆ I" unfolding genideal_def by fastqedlemma (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  with Iideal have "(H ⊆ Idl I) = (Idl H ⊆ Idl I)"    by (rule Idl_subset_ideal[symmetric])  with HIdlI show "Idl H ⊆ Idl I" by simpqedlemma (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  donelemma (in ring) genideal_zero: "Idl {\<zero>} = {\<zero>}"  apply rule   apply (rule genideal_minimal[OF zeroideal], simp)  apply (simp add: genideal_self')  donelemma (in ring) genideal_one: "Idl {\<one>} = carrier R"proof -  interpret ideal "Idl {\<one>}" "R" by (rule genideal_ideal) fast  show "Idl {\<one>} = carrier R"  apply (rule, rule a_subset)  apply (simp add: one_imp_carrier genideal_self')  doneqedtext {* Generation of Principal Ideals in Commutative Rings *}definition cgenideal :: "_ => 'a => 'a set"  ("PIdl\<index> _" [80] 79)  where "cgenideal R a = {x ⊗⇘R⇙ 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        apply (blast intro: acarr)        apply clarsimp defer 1        defer 1        apply (fold a_inv_def, clarsimp) defer 1        apply clarsimp defer 1        apply clarsimp defer 1proof -  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)  with carr show "∃z. x ⊗ a ⊕ y ⊗ a = z ⊗ a ∧ z ∈ carrier R"    by fastnext  from l_null[OF acarr, symmetric] and zero_closed  show "∃x. \<zero> = x ⊗ a ∧ x ∈ carrier R" by fastnext  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)  with carr show "∃z. \<ominus> (x ⊗ a) = z ⊗ a ∧ z ∈ carrier R"    by fastnext  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)  with carr show "∃z. y ⊗ a ⊗ x = z ⊗ a ∧ z ∈ carrier R"    by fastnext  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)  with carr show "∃z. x ⊗ (y ⊗ a) = z ⊗ a ∧ z ∈ carrier R"    by fastqedlemma (in ring) cgenideal_self:  assumes icarr: "i ∈ carrier R"  shows "i ∈ PIdl i"  unfolding cgenideal_defproof simp  from icarr have "i = \<one> ⊗ i"    by simp  with icarr show "∃x. i = x ⊗ i ∧ x ∈ carrier R"    by fastqedtext {* @{const "cgenideal"} is minimal *}lemma (in ring) cgenideal_minimal:  assumes "ideal J R"  assumes aJ: "a ∈ J"  shows "PIdl a ⊆ J"proof -  interpret ideal J R by fact  show ?thesis    unfolding cgenideal_def    apply rule    apply clarify    using aJ    apply (erule I_l_closed)    doneqedlemma (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])  donelemma (in cring) cgenideal_eq_rcos: "PIdl i = carrier R #> i"  unfolding cgenideal_def r_coset_def by fastlemma (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)  with icarr show "∃i'∈carrier R. PIdl i = Idl {i'}"    by fastqedsubsection {* 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 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 1proof -  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  with xI and ZJ show "∃h∈I. ∃k∈J. x = h ⊕ k"    by fastnext  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  with ZI and xJ show "∃h∈I. ∃k∈J. x = h ⊕ k"    by fastnext  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])qedsubsection {* Properties of Principal Ideals *}text {* @{text "\<zero>"} generates the zero ideal *}lemma (in ring) zero_genideal: "Idl {\<zero>} = {\<zero>}"  apply rule  apply (simp add: genideal_minimal zeroideal)  apply (fast intro!: genideal_self)  donetext {* @{text "\<one>"} generates the unit ideal *}lemma (in ring) one_genideal: "Idl {\<one>} = carrier R"proof -  have "\<one> ∈ Idl {\<one>}"    by (simp add: genideal_self')  then show "Idl {\<one>} = carrier R"    by (intro ideal.one_imp_carrier) (fast intro: genideal_ideal)qedtext {* The zero ideal is a principal ideal *}corollary (in ring) zeropideal: "principalideal {\<zero>} R"  apply (rule principalidealI)   apply (rule zeroideal)  apply (blast intro!: zero_genideal[symmetric])  donetext {* The unit ideal is a principal ideal *}corollary (in ring) onepideal: "principalideal (carrier R) R"  apply (rule principalidealI)   apply (rule oneideal)  apply (blast intro!: one_genideal[symmetric])  donetext {* Every principal ideal is a right coset of the carrier *}lemma (in principalideal) rcos_generate:  assumes "cring R"  shows "∃x∈I. I = carrier R #> x"proof -  interpret cring R by fact  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  then have 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  with I2 have "I = carrier R #> i"    by simp  with iI show "∃x∈I. I = carrier R #> x"    by fastqedsubsection {* Prime Ideals *}lemma (in ideal) primeidealCD:  assumes "cring R"  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)  interpret cring R by fact  assume InR: "carrier R ≠ I"    and "∀a. a ∈ carrier R --> (∀b. a ⊗ b ∈ I --> b ∈ carrier R --> a ∈ I ∨ b ∈ I)"  then have 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  with notprime show False by simpqedlemma (in ideal) primeidealCE:  assumes "cring R"  assumes notprime: "¬ primeideal I R"  obtains "carrier R = I"    | "∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I"proof -  interpret R: cring R by fact  assume "carrier R = I ==> thesis"    and "∃a b. a ∈ carrier R ∧ b ∈ carrier R ∧ a ⊗ b ∈ I ∧ a ∉ I ∧ b ∉ I ==> thesis"  then show thesis using primeidealCD [OF R.is_cring notprime] by blastqedtext {* 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>"  then have "carrier R = {\<zero>}" by (rule one_zeroD)  from this[symmetric] and I_notcarr show False    by simpnext  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  with carr have "a ∈ {\<zero>} ∨ b ∈ {\<zero>}"    by (rule I_prime)  then show "a = \<zero> ∨ b = \<zero>" by simpqedcorollary (in cring) domain_eq_zeroprimeideal: "domain R = primeideal {\<zero>} R"  apply rule   apply (erule domain.zeroprimeideal)  apply (erule zeroprimeideal_domainI)  donesubsection {* 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" .qedlemma (in ideal) helper_max_prime:  assumes "cring R"  assumes acarr: "a ∈ carrier R"  shows "ideal {x∈carrier R. a ⊗ x ∈ I} R"proof -  interpret cring R by fact  show ?thesis 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  qedqedtext {* In a cring every maximal ideal is prime *}lemma (in cring) maximalideal_is_prime:  assumes "maximalideal I R"  shows "primeideal I R"proof -  interpret maximalideal I R by fact  show ?thesis 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"    then 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 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"      with acarr have "a ⊗ x ∈ I"        by (intro I_l_closed)      with xI[THEN a_Hcarr] show "x ∈ J"        unfolding J_def by fast    qed        from abI and acarr bcarr have "b ∈ J"      unfolding J_def by fast    with bnI have JnI: "J ≠ I" by fast    from acarr    have "a = a ⊗ \<one>" by algebra    with anI have "a ⊗ \<one> ∉ I" by simp    with one_closed have "\<one> ∉ J"      unfolding J_def by fast    then have 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        with JnI and Jncarr show False by simp  qedqedsubsection {* Derived Theorems *}--"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 1proof (rule ccontr, simp)  assume zUnit: "\<zero> ∈ Units R"  then have 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)  with a[symmetric] have "\<one> = \<zero>" by simp  then have "carrier R = {\<zero>}" by (rule one_zeroD)  with carrnzero show False by simpnext  fix x  assume xcarr': "x ∈ carrier R - {\<zero>}"  then have 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  with xnZ have "PIdl x ≠ {\<zero>}" by fast  with haveideals have "PIdl x = carrier R"    by (blast intro!: xIdl)  then have "\<one> ∈ PIdl x" by simp  then have "∃y. \<one> = y ⊗ x ∧ y ∈ carrier R"    unfolding cgenideal_def by blast  then 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  with xcarr show "x ∈ Units R"    unfolding Units_def by fastqedlemma (in field) all_ideals: "{I. ideal I R} = {{\<zero>}, carrier R}"  apply (rule, rule)proof -  fix I  assume a: "I ∈ {I. ideal I R}"  then interpret ideal I R by simp  show "I ∈ {{\<zero>}, carrier R}"  proof (cases "∃a. a ∈ I - {\<zero>}")    case True    then 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)    then have 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 del: Units_r_inv)    then have oneI: "\<one> ∈ I" by (simp add: a[symmetric])    have "carrier R ⊆ I"    proof      fix x      assume xcarr: "x ∈ carrier R"      with oneI have "\<one> ⊗ x ∈ I" by (rule I_r_closed)      with xcarr show "x ∈ I" by simp    qed    with a_subset have "I = carrier R" by fast    then show "I ∈ {{\<zero>}, carrier R}" by fast  next    case False    then have IZ: "!!a. a ∈ I ==> a = \<zero>" by simp    have a: "I ⊆ {\<zero>}"    proof      fix x      assume "x ∈ I"      then have "x = \<zero>" by (rule IZ)      then show "x ∈ {\<zero>}" by fast    qed    have "\<zero> ∈ I" by simp    then have "{\<zero>} ⊆ I" by fast    with a have "I = {\<zero>}" by fast    then show "I ∈ {{\<zero>}, carrier R}" by fast  qedqed (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  with one_closed show "carrier R ≠ {\<zero>}" by fastnext  fix J  assume Jideal: "ideal J R"  then have "J ∈ {I. ideal I R}" by fast  with all_ideals show "J = {\<zero>} ∨ J = carrier R"    by simpqedlemma (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)  with Jn0 show "J = carrier R"    by simpqedlemma (in cring) zeromaximalideal_eq_field: "maximalideal {\<zero>} R = field R"  apply rule   apply (erule zeromaximalideal_fieldI)  apply (erule field.zeromaximalideal)  doneend`