src/HOL/Algebra/Ideal.thy
author wenzelm
Mon Apr 09 21:29:47 2012 +0200 (2012-04-09)
changeset 47409 c5be1120980d
parent 44677 3fb27b19e058
child 61382 efac889fccbc
permissions -rw-r--r--
tuned proofs;
     1 (*  Title:      HOL/Algebra/Ideal.thy
     2     Author:     Stephan Hohe, TU Muenchen
     3 *)
     4 
     5 theory Ideal
     6 imports Ring AbelCoset
     7 begin
     8 
     9 section {* Ideals *}
    10 
    11 subsection {* Definitions *}
    12 
    13 subsubsection {* General definition *}
    14 
    15 locale ideal = additive_subgroup I R + ring R for I and R (structure) +
    16   assumes I_l_closed: "\<lbrakk>a \<in> I; x \<in> carrier R\<rbrakk> \<Longrightarrow> x \<otimes> a \<in> I"
    17     and I_r_closed: "\<lbrakk>a \<in> I; x \<in> carrier R\<rbrakk> \<Longrightarrow> a \<otimes> x \<in> I"
    18 
    19 sublocale ideal \<subseteq> abelian_subgroup I R
    20   apply (intro abelian_subgroupI3 abelian_group.intro)
    21     apply (rule ideal.axioms, rule ideal_axioms)
    22    apply (rule abelian_group.axioms, rule ring.axioms, rule ideal.axioms, rule ideal_axioms)
    23   apply (rule abelian_group.axioms, rule ring.axioms, rule ideal.axioms, rule ideal_axioms)
    24   done
    25 
    26 lemma (in ideal) is_ideal: "ideal I R"
    27   by (rule ideal_axioms)
    28 
    29 lemma idealI:
    30   fixes R (structure)
    31   assumes "ring R"
    32   assumes a_subgroup: "subgroup I \<lparr>carrier = carrier R, mult = add R, one = zero R\<rparr>"
    33     and I_l_closed: "\<And>a x. \<lbrakk>a \<in> I; x \<in> carrier R\<rbrakk> \<Longrightarrow> x \<otimes> a \<in> I"
    34     and I_r_closed: "\<And>a x. \<lbrakk>a \<in> I; x \<in> carrier R\<rbrakk> \<Longrightarrow> a \<otimes> x \<in> I"
    35   shows "ideal I R"
    36 proof -
    37   interpret ring R by fact
    38   show ?thesis  apply (intro ideal.intro ideal_axioms.intro additive_subgroupI)
    39      apply (rule a_subgroup)
    40     apply (rule is_ring)
    41    apply (erule (1) I_l_closed)
    42   apply (erule (1) I_r_closed)
    43   done
    44 qed
    45 
    46 
    47 subsubsection (in ring) {* Ideals Generated by a Subset of @{term "carrier R"} *}
    48 
    49 definition genideal :: "_ \<Rightarrow> 'a set \<Rightarrow> 'a set"  ("Idl\<index> _" [80] 79)
    50   where "genideal R S = Inter {I. ideal I R \<and> S \<subseteq> I}"
    51 
    52 subsubsection {* Principal Ideals *}
    53 
    54 locale principalideal = ideal +
    55   assumes generate: "\<exists>i \<in> carrier R. I = Idl {i}"
    56 
    57 lemma (in principalideal) is_principalideal: "principalideal I R"
    58   by (rule principalideal_axioms)
    59 
    60 lemma principalidealI:
    61   fixes R (structure)
    62   assumes "ideal I R"
    63     and generate: "\<exists>i \<in> carrier R. I = Idl {i}"
    64   shows "principalideal I R"
    65 proof -
    66   interpret ideal I R by fact
    67   show ?thesis
    68     by (intro principalideal.intro principalideal_axioms.intro)
    69       (rule is_ideal, rule generate)
    70 qed
    71 
    72 
    73 subsubsection {* Maximal Ideals *}
    74 
    75 locale maximalideal = ideal +
    76   assumes I_notcarr: "carrier R \<noteq> I"
    77     and I_maximal: "\<lbrakk>ideal J R; I \<subseteq> J; J \<subseteq> carrier R\<rbrakk> \<Longrightarrow> J = I \<or> J = carrier R"
    78 
    79 lemma (in maximalideal) is_maximalideal: "maximalideal I R"
    80   by (rule maximalideal_axioms)
    81 
    82 lemma maximalidealI:
    83   fixes R
    84   assumes "ideal I R"
    85     and I_notcarr: "carrier R \<noteq> I"
    86     and I_maximal: "\<And>J. \<lbrakk>ideal J R; I \<subseteq> J; J \<subseteq> carrier R\<rbrakk> \<Longrightarrow> J = I \<or> J = carrier R"
    87   shows "maximalideal I R"
    88 proof -
    89   interpret ideal I R by fact
    90   show ?thesis
    91     by (intro maximalideal.intro maximalideal_axioms.intro)
    92       (rule is_ideal, rule I_notcarr, rule I_maximal)
    93 qed
    94 
    95 
    96 subsubsection {* Prime Ideals *}
    97 
    98 locale primeideal = ideal + cring +
    99   assumes I_notcarr: "carrier R \<noteq> I"
   100     and I_prime: "\<lbrakk>a \<in> carrier R; b \<in> carrier R; a \<otimes> b \<in> I\<rbrakk> \<Longrightarrow> a \<in> I \<or> b \<in> I"
   101 
   102 lemma (in primeideal) is_primeideal: "primeideal I R"
   103   by (rule primeideal_axioms)
   104 
   105 lemma primeidealI:
   106   fixes R (structure)
   107   assumes "ideal I R"
   108     and "cring R"
   109     and I_notcarr: "carrier R \<noteq> I"
   110     and I_prime: "\<And>a b. \<lbrakk>a \<in> carrier R; b \<in> carrier R; a \<otimes> b \<in> I\<rbrakk> \<Longrightarrow> a \<in> I \<or> b \<in> I"
   111   shows "primeideal I R"
   112 proof -
   113   interpret ideal I R by fact
   114   interpret cring R by fact
   115   show ?thesis
   116     by (intro primeideal.intro primeideal_axioms.intro)
   117       (rule is_ideal, rule is_cring, rule I_notcarr, rule I_prime)
   118 qed
   119 
   120 lemma primeidealI2:
   121   fixes R (structure)
   122   assumes "additive_subgroup I R"
   123     and "cring R"
   124     and I_l_closed: "\<And>a x. \<lbrakk>a \<in> I; x \<in> carrier R\<rbrakk> \<Longrightarrow> x \<otimes> a \<in> I"
   125     and I_r_closed: "\<And>a x. \<lbrakk>a \<in> I; x \<in> carrier R\<rbrakk> \<Longrightarrow> a \<otimes> x \<in> I"
   126     and I_notcarr: "carrier R \<noteq> I"
   127     and I_prime: "\<And>a b. \<lbrakk>a \<in> carrier R; b \<in> carrier R; a \<otimes> b \<in> I\<rbrakk> \<Longrightarrow> a \<in> I \<or> b \<in> I"
   128   shows "primeideal I R"
   129 proof -
   130   interpret additive_subgroup I R by fact
   131   interpret cring R by fact
   132   show ?thesis apply (intro_locales)
   133     apply (intro ideal_axioms.intro)
   134     apply (erule (1) I_l_closed)
   135     apply (erule (1) I_r_closed)
   136     apply (intro primeideal_axioms.intro)
   137     apply (rule I_notcarr)
   138     apply (erule (2) I_prime)
   139     done
   140 qed
   141 
   142 
   143 subsection {* Special Ideals *}
   144 
   145 lemma (in ring) zeroideal: "ideal {\<zero>} R"
   146   apply (intro idealI subgroup.intro)
   147         apply (rule is_ring)
   148        apply simp+
   149     apply (fold a_inv_def, simp)
   150    apply simp+
   151   done
   152 
   153 lemma (in ring) oneideal: "ideal (carrier R) R"
   154   by (rule idealI) (auto intro: is_ring add.subgroupI)
   155 
   156 lemma (in "domain") zeroprimeideal: "primeideal {\<zero>} R"
   157   apply (intro primeidealI)
   158      apply (rule zeroideal)
   159     apply (rule domain.axioms, rule domain_axioms)
   160    defer 1
   161    apply (simp add: integral)
   162 proof (rule ccontr, simp)
   163   assume "carrier R = {\<zero>}"
   164   then have "\<one> = \<zero>" by (rule one_zeroI)
   165   with one_not_zero show False by simp
   166 qed
   167 
   168 
   169 subsection {* General Ideal Properies *}
   170 
   171 lemma (in ideal) one_imp_carrier:
   172   assumes I_one_closed: "\<one> \<in> I"
   173   shows "I = carrier R"
   174   apply (rule)
   175   apply (rule)
   176   apply (rule a_Hcarr, simp)
   177 proof
   178   fix x
   179   assume xcarr: "x \<in> carrier R"
   180   with I_one_closed have "x \<otimes> \<one> \<in> I" by (intro I_l_closed)
   181   with xcarr show "x \<in> I" by simp
   182 qed
   183 
   184 lemma (in ideal) Icarr:
   185   assumes iI: "i \<in> I"
   186   shows "i \<in> carrier R"
   187   using iI by (rule a_Hcarr)
   188 
   189 
   190 subsection {* Intersection of Ideals *}
   191 
   192 text {* \paragraph{Intersection of two ideals} The intersection of any
   193   two ideals is again an ideal in @{term R} *}
   194 lemma (in ring) i_intersect:
   195   assumes "ideal I R"
   196   assumes "ideal J R"
   197   shows "ideal (I \<inter> J) R"
   198 proof -
   199   interpret ideal I R by fact
   200   interpret ideal J R by fact
   201   show ?thesis
   202     apply (intro idealI subgroup.intro)
   203           apply (rule is_ring)
   204          apply (force simp add: a_subset)
   205         apply (simp add: a_inv_def[symmetric])
   206        apply simp
   207       apply (simp add: a_inv_def[symmetric])
   208      apply (clarsimp, rule)
   209       apply (fast intro: ideal.I_l_closed ideal.intro assms)+
   210     apply (clarsimp, rule)
   211      apply (fast intro: ideal.I_r_closed ideal.intro assms)+
   212     done
   213 qed
   214 
   215 text {* The intersection of any Number of Ideals is again
   216         an Ideal in @{term R} *}
   217 lemma (in ring) i_Intersect:
   218   assumes Sideals: "\<And>I. I \<in> S \<Longrightarrow> ideal I R"
   219     and notempty: "S \<noteq> {}"
   220   shows "ideal (Inter S) R"
   221   apply (unfold_locales)
   222   apply (simp_all add: Inter_eq)
   223         apply rule unfolding mem_Collect_eq defer 1
   224         apply rule defer 1
   225         apply rule defer 1
   226         apply (fold a_inv_def, rule) defer 1
   227         apply rule defer 1
   228         apply rule defer 1
   229 proof -
   230   fix x y
   231   assume "\<forall>I\<in>S. x \<in> I"
   232   then have xI: "\<And>I. I \<in> S \<Longrightarrow> x \<in> I" by simp
   233   assume "\<forall>I\<in>S. y \<in> I"
   234   then have yI: "\<And>I. I \<in> S \<Longrightarrow> y \<in> I" by simp
   235 
   236   fix J
   237   assume JS: "J \<in> S"
   238   interpret ideal J R by (rule Sideals[OF JS])
   239   from xI[OF JS] and yI[OF JS] show "x \<oplus> y \<in> J" by (rule a_closed)
   240 next
   241   fix J
   242   assume JS: "J \<in> S"
   243   interpret ideal J R by (rule Sideals[OF JS])
   244   show "\<zero> \<in> J" by simp
   245 next
   246   fix x
   247   assume "\<forall>I\<in>S. x \<in> I"
   248   then have xI: "\<And>I. I \<in> S \<Longrightarrow> x \<in> I" by simp
   249 
   250   fix J
   251   assume JS: "J \<in> S"
   252   interpret ideal J R by (rule Sideals[OF JS])
   253 
   254   from xI[OF JS] show "\<ominus> x \<in> J" by (rule a_inv_closed)
   255 next
   256   fix x y
   257   assume "\<forall>I\<in>S. x \<in> I"
   258   then have xI: "\<And>I. I \<in> S \<Longrightarrow> x \<in> I" by simp
   259   assume ycarr: "y \<in> carrier R"
   260 
   261   fix J
   262   assume JS: "J \<in> S"
   263   interpret ideal J R by (rule Sideals[OF JS])
   264 
   265   from xI[OF JS] and ycarr show "y \<otimes> x \<in> J" by (rule I_l_closed)
   266 next
   267   fix x y
   268   assume "\<forall>I\<in>S. x \<in> I"
   269   then have xI: "\<And>I. I \<in> S \<Longrightarrow> x \<in> I" by simp
   270   assume ycarr: "y \<in> carrier R"
   271 
   272   fix J
   273   assume JS: "J \<in> S"
   274   interpret ideal J R by (rule Sideals[OF JS])
   275 
   276   from xI[OF JS] and ycarr show "x \<otimes> y \<in> J" by (rule I_r_closed)
   277 next
   278   fix x
   279   assume "\<forall>I\<in>S. x \<in> I"
   280   then have xI: "\<And>I. I \<in> S \<Longrightarrow> x \<in> I" by simp
   281 
   282   from notempty have "\<exists>I0. I0 \<in> S" by blast
   283   then obtain I0 where I0S: "I0 \<in> S" by auto
   284 
   285   interpret ideal I0 R by (rule Sideals[OF I0S])
   286 
   287   from xI[OF I0S] have "x \<in> I0" .
   288   with a_subset show "x \<in> carrier R" by fast
   289 next
   290 
   291 qed
   292 
   293 
   294 subsection {* Addition of Ideals *}
   295 
   296 lemma (in ring) add_ideals:
   297   assumes idealI: "ideal I R"
   298       and idealJ: "ideal J R"
   299   shows "ideal (I <+> J) R"
   300   apply (rule ideal.intro)
   301     apply (rule add_additive_subgroups)
   302      apply (intro ideal.axioms[OF idealI])
   303     apply (intro ideal.axioms[OF idealJ])
   304    apply (rule is_ring)
   305   apply (rule ideal_axioms.intro)
   306    apply (simp add: set_add_defs, clarsimp) defer 1
   307    apply (simp add: set_add_defs, clarsimp) defer 1
   308 proof -
   309   fix x i j
   310   assume xcarr: "x \<in> carrier R"
   311     and iI: "i \<in> I"
   312     and jJ: "j \<in> J"
   313   from xcarr ideal.Icarr[OF idealI iI] ideal.Icarr[OF idealJ jJ]
   314   have c: "(i \<oplus> j) \<otimes> x = (i \<otimes> x) \<oplus> (j \<otimes> x)"
   315     by algebra
   316   from xcarr and iI have a: "i \<otimes> x \<in> I"
   317     by (simp add: ideal.I_r_closed[OF idealI])
   318   from xcarr and jJ have b: "j \<otimes> x \<in> J"
   319     by (simp add: ideal.I_r_closed[OF idealJ])
   320   from a b c show "\<exists>ha\<in>I. \<exists>ka\<in>J. (i \<oplus> j) \<otimes> x = ha \<oplus> ka"
   321     by fast
   322 next
   323   fix x i j
   324   assume xcarr: "x \<in> carrier R"
   325     and iI: "i \<in> I"
   326     and jJ: "j \<in> J"
   327   from xcarr ideal.Icarr[OF idealI iI] ideal.Icarr[OF idealJ jJ]
   328   have c: "x \<otimes> (i \<oplus> j) = (x \<otimes> i) \<oplus> (x \<otimes> j)" by algebra
   329   from xcarr and iI have a: "x \<otimes> i \<in> I"
   330     by (simp add: ideal.I_l_closed[OF idealI])
   331   from xcarr and jJ have b: "x \<otimes> j \<in> J"
   332     by (simp add: ideal.I_l_closed[OF idealJ])
   333   from a b c show "\<exists>ha\<in>I. \<exists>ka\<in>J. x \<otimes> (i \<oplus> j) = ha \<oplus> ka"
   334     by fast
   335 qed
   336 
   337 
   338 subsection (in ring) {* Ideals generated by a subset of @{term "carrier R"} *}
   339 
   340 text {* @{term genideal} generates an ideal *}
   341 lemma (in ring) genideal_ideal:
   342   assumes Scarr: "S \<subseteq> carrier R"
   343   shows "ideal (Idl S) R"
   344 unfolding genideal_def
   345 proof (rule i_Intersect, fast, simp)
   346   from oneideal and Scarr
   347   show "\<exists>I. ideal I R \<and> S \<le> I" by fast
   348 qed
   349 
   350 lemma (in ring) genideal_self:
   351   assumes "S \<subseteq> carrier R"
   352   shows "S \<subseteq> Idl S"
   353   unfolding genideal_def by fast
   354 
   355 lemma (in ring) genideal_self':
   356   assumes carr: "i \<in> carrier R"
   357   shows "i \<in> Idl {i}"
   358 proof -
   359   from carr have "{i} \<subseteq> Idl {i}" by (fast intro!: genideal_self)
   360   then show "i \<in> Idl {i}" by fast
   361 qed
   362 
   363 text {* @{term genideal} generates the minimal ideal *}
   364 lemma (in ring) genideal_minimal:
   365   assumes a: "ideal I R"
   366     and b: "S \<subseteq> I"
   367   shows "Idl S \<subseteq> I"
   368   unfolding genideal_def by rule (elim InterD, simp add: a b)
   369 
   370 text {* Generated ideals and subsets *}
   371 lemma (in ring) Idl_subset_ideal:
   372   assumes Iideal: "ideal I R"
   373     and Hcarr: "H \<subseteq> carrier R"
   374   shows "(Idl H \<subseteq> I) = (H \<subseteq> I)"
   375 proof
   376   assume a: "Idl H \<subseteq> I"
   377   from Hcarr have "H \<subseteq> Idl H" by (rule genideal_self)
   378   with a show "H \<subseteq> I" by simp
   379 next
   380   fix x
   381   assume "H \<subseteq> I"
   382   with Iideal have "I \<in> {I. ideal I R \<and> H \<subseteq> I}" by fast
   383   then show "Idl H \<subseteq> I" unfolding genideal_def by fast
   384 qed
   385 
   386 lemma (in ring) subset_Idl_subset:
   387   assumes Icarr: "I \<subseteq> carrier R"
   388     and HI: "H \<subseteq> I"
   389   shows "Idl H \<subseteq> Idl I"
   390 proof -
   391   from HI and genideal_self[OF Icarr] have HIdlI: "H \<subseteq> Idl I"
   392     by fast
   393 
   394   from Icarr have Iideal: "ideal (Idl I) R"
   395     by (rule genideal_ideal)
   396   from HI and Icarr have "H \<subseteq> carrier R"
   397     by fast
   398   with Iideal have "(H \<subseteq> Idl I) = (Idl H \<subseteq> Idl I)"
   399     by (rule Idl_subset_ideal[symmetric])
   400 
   401   with HIdlI show "Idl H \<subseteq> Idl I" by simp
   402 qed
   403 
   404 lemma (in ring) Idl_subset_ideal':
   405   assumes acarr: "a \<in> carrier R" and bcarr: "b \<in> carrier R"
   406   shows "(Idl {a} \<subseteq> Idl {b}) = (a \<in> Idl {b})"
   407   apply (subst Idl_subset_ideal[OF genideal_ideal[of "{b}"], of "{a}"])
   408     apply (fast intro: bcarr, fast intro: acarr)
   409   apply fast
   410   done
   411 
   412 lemma (in ring) genideal_zero: "Idl {\<zero>} = {\<zero>}"
   413   apply rule
   414    apply (rule genideal_minimal[OF zeroideal], simp)
   415   apply (simp add: genideal_self')
   416   done
   417 
   418 lemma (in ring) genideal_one: "Idl {\<one>} = carrier R"
   419 proof -
   420   interpret ideal "Idl {\<one>}" "R" by (rule genideal_ideal) fast
   421   show "Idl {\<one>} = carrier R"
   422   apply (rule, rule a_subset)
   423   apply (simp add: one_imp_carrier genideal_self')
   424   done
   425 qed
   426 
   427 
   428 text {* Generation of Principal Ideals in Commutative Rings *}
   429 
   430 definition cgenideal :: "_ \<Rightarrow> 'a \<Rightarrow> 'a set"  ("PIdl\<index> _" [80] 79)
   431   where "cgenideal R a = {x \<otimes>\<^bsub>R\<^esub> a | x. x \<in> carrier R}"
   432 
   433 text {* genhideal (?) really generates an ideal *}
   434 lemma (in cring) cgenideal_ideal:
   435   assumes acarr: "a \<in> carrier R"
   436   shows "ideal (PIdl a) R"
   437   apply (unfold cgenideal_def)
   438   apply (rule idealI[OF is_ring])
   439      apply (rule subgroup.intro)
   440         apply simp_all
   441         apply (blast intro: acarr)
   442         apply clarsimp defer 1
   443         defer 1
   444         apply (fold a_inv_def, clarsimp) defer 1
   445         apply clarsimp defer 1
   446         apply clarsimp defer 1
   447 proof -
   448   fix x y
   449   assume xcarr: "x \<in> carrier R"
   450     and ycarr: "y \<in> carrier R"
   451   note carr = acarr xcarr ycarr
   452 
   453   from carr have "x \<otimes> a \<oplus> y \<otimes> a = (x \<oplus> y) \<otimes> a"
   454     by (simp add: l_distr)
   455   with carr show "\<exists>z. x \<otimes> a \<oplus> y \<otimes> a = z \<otimes> a \<and> z \<in> carrier R"
   456     by fast
   457 next
   458   from l_null[OF acarr, symmetric] and zero_closed
   459   show "\<exists>x. \<zero> = x \<otimes> a \<and> x \<in> carrier R" by fast
   460 next
   461   fix x
   462   assume xcarr: "x \<in> carrier R"
   463   note carr = acarr xcarr
   464 
   465   from carr have "\<ominus> (x \<otimes> a) = (\<ominus> x) \<otimes> a"
   466     by (simp add: l_minus)
   467   with carr show "\<exists>z. \<ominus> (x \<otimes> a) = z \<otimes> a \<and> z \<in> carrier R"
   468     by fast
   469 next
   470   fix x y
   471   assume xcarr: "x \<in> carrier R"
   472      and ycarr: "y \<in> carrier R"
   473   note carr = acarr xcarr ycarr
   474   
   475   from carr have "y \<otimes> a \<otimes> x = (y \<otimes> x) \<otimes> a"
   476     by (simp add: m_assoc) (simp add: m_comm)
   477   with carr show "\<exists>z. y \<otimes> a \<otimes> x = z \<otimes> a \<and> z \<in> carrier R"
   478     by fast
   479 next
   480   fix x y
   481   assume xcarr: "x \<in> carrier R"
   482      and ycarr: "y \<in> carrier R"
   483   note carr = acarr xcarr ycarr
   484 
   485   from carr have "x \<otimes> (y \<otimes> a) = (x \<otimes> y) \<otimes> a"
   486     by (simp add: m_assoc)
   487   with carr show "\<exists>z. x \<otimes> (y \<otimes> a) = z \<otimes> a \<and> z \<in> carrier R"
   488     by fast
   489 qed
   490 
   491 lemma (in ring) cgenideal_self:
   492   assumes icarr: "i \<in> carrier R"
   493   shows "i \<in> PIdl i"
   494   unfolding cgenideal_def
   495 proof simp
   496   from icarr have "i = \<one> \<otimes> i"
   497     by simp
   498   with icarr show "\<exists>x. i = x \<otimes> i \<and> x \<in> carrier R"
   499     by fast
   500 qed
   501 
   502 text {* @{const "cgenideal"} is minimal *}
   503 
   504 lemma (in ring) cgenideal_minimal:
   505   assumes "ideal J R"
   506   assumes aJ: "a \<in> J"
   507   shows "PIdl a \<subseteq> J"
   508 proof -
   509   interpret ideal J R by fact
   510   show ?thesis
   511     unfolding cgenideal_def
   512     apply rule
   513     apply clarify
   514     using aJ
   515     apply (erule I_l_closed)
   516     done
   517 qed
   518 
   519 lemma (in cring) cgenideal_eq_genideal:
   520   assumes icarr: "i \<in> carrier R"
   521   shows "PIdl i = Idl {i}"
   522   apply rule
   523    apply (intro cgenideal_minimal)
   524     apply (rule genideal_ideal, fast intro: icarr)
   525    apply (rule genideal_self', fast intro: icarr)
   526   apply (intro genideal_minimal)
   527    apply (rule cgenideal_ideal [OF icarr])
   528   apply (simp, rule cgenideal_self [OF icarr])
   529   done
   530 
   531 lemma (in cring) cgenideal_eq_rcos: "PIdl i = carrier R #> i"
   532   unfolding cgenideal_def r_coset_def by fast
   533 
   534 lemma (in cring) cgenideal_is_principalideal:
   535   assumes icarr: "i \<in> carrier R"
   536   shows "principalideal (PIdl i) R"
   537   apply (rule principalidealI)
   538   apply (rule cgenideal_ideal [OF icarr])
   539 proof -
   540   from icarr have "PIdl i = Idl {i}"
   541     by (rule cgenideal_eq_genideal)
   542   with icarr show "\<exists>i'\<in>carrier R. PIdl i = Idl {i'}"
   543     by fast
   544 qed
   545 
   546 
   547 subsection {* Union of Ideals *}
   548 
   549 lemma (in ring) union_genideal:
   550   assumes idealI: "ideal I R"
   551     and idealJ: "ideal J R"
   552   shows "Idl (I \<union> J) = I <+> J"
   553   apply rule
   554    apply (rule ring.genideal_minimal)
   555      apply (rule is_ring)
   556     apply (rule add_ideals[OF idealI idealJ])
   557    apply (rule)
   558    apply (simp add: set_add_defs) apply (elim disjE) defer 1 defer 1
   559    apply (rule) apply (simp add: set_add_defs genideal_def) apply clarsimp defer 1
   560 proof -
   561   fix x
   562   assume xI: "x \<in> I"
   563   have ZJ: "\<zero> \<in> J"
   564     by (intro additive_subgroup.zero_closed) (rule ideal.axioms[OF idealJ])
   565   from ideal.Icarr[OF idealI xI] have "x = x \<oplus> \<zero>"
   566     by algebra
   567   with xI and ZJ show "\<exists>h\<in>I. \<exists>k\<in>J. x = h \<oplus> k"
   568     by fast
   569 next
   570   fix x
   571   assume xJ: "x \<in> J"
   572   have ZI: "\<zero> \<in> I"
   573     by (intro additive_subgroup.zero_closed, rule ideal.axioms[OF idealI])
   574   from ideal.Icarr[OF idealJ xJ] have "x = \<zero> \<oplus> x"
   575     by algebra
   576   with ZI and xJ show "\<exists>h\<in>I. \<exists>k\<in>J. x = h \<oplus> k"
   577     by fast
   578 next
   579   fix i j K
   580   assume iI: "i \<in> I"
   581     and jJ: "j \<in> J"
   582     and idealK: "ideal K R"
   583     and IK: "I \<subseteq> K"
   584     and JK: "J \<subseteq> K"
   585   from iI and IK have iK: "i \<in> K" by fast
   586   from jJ and JK have jK: "j \<in> K" by fast
   587   from iK and jK show "i \<oplus> j \<in> K"
   588     by (intro additive_subgroup.a_closed) (rule ideal.axioms[OF idealK])
   589 qed
   590 
   591 
   592 subsection {* Properties of Principal Ideals *}
   593 
   594 text {* @{text "\<zero>"} generates the zero ideal *}
   595 lemma (in ring) zero_genideal: "Idl {\<zero>} = {\<zero>}"
   596   apply rule
   597   apply (simp add: genideal_minimal zeroideal)
   598   apply (fast intro!: genideal_self)
   599   done
   600 
   601 text {* @{text "\<one>"} generates the unit ideal *}
   602 lemma (in ring) one_genideal: "Idl {\<one>} = carrier R"
   603 proof -
   604   have "\<one> \<in> Idl {\<one>}"
   605     by (simp add: genideal_self')
   606   then show "Idl {\<one>} = carrier R"
   607     by (intro ideal.one_imp_carrier) (fast intro: genideal_ideal)
   608 qed
   609 
   610 
   611 text {* The zero ideal is a principal ideal *}
   612 corollary (in ring) zeropideal: "principalideal {\<zero>} R"
   613   apply (rule principalidealI)
   614    apply (rule zeroideal)
   615   apply (blast intro!: zero_genideal[symmetric])
   616   done
   617 
   618 text {* The unit ideal is a principal ideal *}
   619 corollary (in ring) onepideal: "principalideal (carrier R) R"
   620   apply (rule principalidealI)
   621    apply (rule oneideal)
   622   apply (blast intro!: one_genideal[symmetric])
   623   done
   624 
   625 
   626 text {* Every principal ideal is a right coset of the carrier *}
   627 lemma (in principalideal) rcos_generate:
   628   assumes "cring R"
   629   shows "\<exists>x\<in>I. I = carrier R #> x"
   630 proof -
   631   interpret cring R by fact
   632   from generate obtain i where icarr: "i \<in> carrier R" and I1: "I = Idl {i}"
   633     by fast+
   634 
   635   from icarr and genideal_self[of "{i}"] have "i \<in> Idl {i}"
   636     by fast
   637   then have iI: "i \<in> I" by (simp add: I1)
   638 
   639   from I1 icarr have I2: "I = PIdl i"
   640     by (simp add: cgenideal_eq_genideal)
   641 
   642   have "PIdl i = carrier R #> i"
   643     unfolding cgenideal_def r_coset_def by fast
   644 
   645   with I2 have "I = carrier R #> i"
   646     by simp
   647 
   648   with iI show "\<exists>x\<in>I. I = carrier R #> x"
   649     by fast
   650 qed
   651 
   652 
   653 subsection {* Prime Ideals *}
   654 
   655 lemma (in ideal) primeidealCD:
   656   assumes "cring R"
   657   assumes notprime: "\<not> primeideal I R"
   658   shows "carrier R = I \<or> (\<exists>a b. a \<in> carrier R \<and> b \<in> carrier R \<and> a \<otimes> b \<in> I \<and> a \<notin> I \<and> b \<notin> I)"
   659 proof (rule ccontr, clarsimp)
   660   interpret cring R by fact
   661   assume InR: "carrier R \<noteq> I"
   662     and "\<forall>a. a \<in> carrier R \<longrightarrow> (\<forall>b. a \<otimes> b \<in> I \<longrightarrow> b \<in> carrier R \<longrightarrow> a \<in> I \<or> b \<in> I)"
   663   then have I_prime: "\<And> a b. \<lbrakk>a \<in> carrier R; b \<in> carrier R; a \<otimes> b \<in> I\<rbrakk> \<Longrightarrow> a \<in> I \<or> b \<in> I"
   664     by simp
   665   have "primeideal I R"
   666     apply (rule primeideal.intro [OF is_ideal is_cring])
   667     apply (rule primeideal_axioms.intro)
   668      apply (rule InR)
   669     apply (erule (2) I_prime)
   670     done
   671   with notprime show False by simp
   672 qed
   673 
   674 lemma (in ideal) primeidealCE:
   675   assumes "cring R"
   676   assumes notprime: "\<not> primeideal I R"
   677   obtains "carrier R = I"
   678     | "\<exists>a b. a \<in> carrier R \<and> b \<in> carrier R \<and> a \<otimes> b \<in> I \<and> a \<notin> I \<and> b \<notin> I"
   679 proof -
   680   interpret R: cring R by fact
   681   assume "carrier R = I ==> thesis"
   682     and "\<exists>a b. a \<in> carrier R \<and> b \<in> carrier R \<and> a \<otimes> b \<in> I \<and> a \<notin> I \<and> b \<notin> I \<Longrightarrow> thesis"
   683   then show thesis using primeidealCD [OF R.is_cring notprime] by blast
   684 qed
   685 
   686 text {* If @{text "{\<zero>}"} is a prime ideal of a commutative ring, the ring is a domain *}
   687 lemma (in cring) zeroprimeideal_domainI:
   688   assumes pi: "primeideal {\<zero>} R"
   689   shows "domain R"
   690   apply (rule domain.intro, rule is_cring)
   691   apply (rule domain_axioms.intro)
   692 proof (rule ccontr, simp)
   693   interpret primeideal "{\<zero>}" "R" by (rule pi)
   694   assume "\<one> = \<zero>"
   695   then have "carrier R = {\<zero>}" by (rule one_zeroD)
   696   from this[symmetric] and I_notcarr show False
   697     by simp
   698 next
   699   interpret primeideal "{\<zero>}" "R" by (rule pi)
   700   fix a b
   701   assume ab: "a \<otimes> b = \<zero>" and carr: "a \<in> carrier R" "b \<in> carrier R"
   702   from ab have abI: "a \<otimes> b \<in> {\<zero>}"
   703     by fast
   704   with carr have "a \<in> {\<zero>} \<or> b \<in> {\<zero>}"
   705     by (rule I_prime)
   706   then show "a = \<zero> \<or> b = \<zero>" by simp
   707 qed
   708 
   709 corollary (in cring) domain_eq_zeroprimeideal: "domain R = primeideal {\<zero>} R"
   710   apply rule
   711    apply (erule domain.zeroprimeideal)
   712   apply (erule zeroprimeideal_domainI)
   713   done
   714 
   715 
   716 subsection {* Maximal Ideals *}
   717 
   718 lemma (in ideal) helper_I_closed:
   719   assumes carr: "a \<in> carrier R" "x \<in> carrier R" "y \<in> carrier R"
   720     and axI: "a \<otimes> x \<in> I"
   721   shows "a \<otimes> (x \<otimes> y) \<in> I"
   722 proof -
   723   from axI and carr have "(a \<otimes> x) \<otimes> y \<in> I"
   724     by (simp add: I_r_closed)
   725   also from carr have "(a \<otimes> x) \<otimes> y = a \<otimes> (x \<otimes> y)"
   726     by (simp add: m_assoc)
   727   finally show "a \<otimes> (x \<otimes> y) \<in> I" .
   728 qed
   729 
   730 lemma (in ideal) helper_max_prime:
   731   assumes "cring R"
   732   assumes acarr: "a \<in> carrier R"
   733   shows "ideal {x\<in>carrier R. a \<otimes> x \<in> I} R"
   734 proof -
   735   interpret cring R by fact
   736   show ?thesis apply (rule idealI)
   737     apply (rule cring.axioms[OF is_cring])
   738     apply (rule subgroup.intro)
   739     apply (simp, fast)
   740     apply clarsimp apply (simp add: r_distr acarr)
   741     apply (simp add: acarr)
   742     apply (simp add: a_inv_def[symmetric], clarify) defer 1
   743     apply clarsimp defer 1
   744     apply (fast intro!: helper_I_closed acarr)
   745   proof -
   746     fix x
   747     assume xcarr: "x \<in> carrier R"
   748       and ax: "a \<otimes> x \<in> I"
   749     from ax and acarr xcarr
   750     have "\<ominus>(a \<otimes> x) \<in> I" by simp
   751     also from acarr xcarr
   752     have "\<ominus>(a \<otimes> x) = a \<otimes> (\<ominus>x)" by algebra
   753     finally show "a \<otimes> (\<ominus>x) \<in> I" .
   754     from acarr have "a \<otimes> \<zero> = \<zero>" by simp
   755   next
   756     fix x y
   757     assume xcarr: "x \<in> carrier R"
   758       and ycarr: "y \<in> carrier R"
   759       and ayI: "a \<otimes> y \<in> I"
   760     from ayI and acarr xcarr ycarr have "a \<otimes> (y \<otimes> x) \<in> I"
   761       by (simp add: helper_I_closed)
   762     moreover
   763     from xcarr ycarr have "y \<otimes> x = x \<otimes> y"
   764       by (simp add: m_comm)
   765     ultimately
   766     show "a \<otimes> (x \<otimes> y) \<in> I" by simp
   767   qed
   768 qed
   769 
   770 text {* In a cring every maximal ideal is prime *}
   771 lemma (in cring) maximalideal_is_prime:
   772   assumes "maximalideal I R"
   773   shows "primeideal I R"
   774 proof -
   775   interpret maximalideal I R by fact
   776   show ?thesis apply (rule ccontr)
   777     apply (rule primeidealCE)
   778     apply (rule is_cring)
   779     apply assumption
   780     apply (simp add: I_notcarr)
   781   proof -
   782     assume "\<exists>a b. a \<in> carrier R \<and> b \<in> carrier R \<and> a \<otimes> b \<in> I \<and> a \<notin> I \<and> b \<notin> I"
   783     then obtain a b where
   784       acarr: "a \<in> carrier R" and
   785       bcarr: "b \<in> carrier R" and
   786       abI: "a \<otimes> b \<in> I" and
   787       anI: "a \<notin> I" and
   788       bnI: "b \<notin> I" by fast
   789     def J \<equiv> "{x\<in>carrier R. a \<otimes> x \<in> I}"
   790     
   791     from is_cring and acarr have idealJ: "ideal J R"
   792       unfolding J_def by (rule helper_max_prime)
   793     
   794     have IsubJ: "I \<subseteq> J"
   795     proof
   796       fix x
   797       assume xI: "x \<in> I"
   798       with acarr have "a \<otimes> x \<in> I"
   799         by (intro I_l_closed)
   800       with xI[THEN a_Hcarr] show "x \<in> J"
   801         unfolding J_def by fast
   802     qed
   803     
   804     from abI and acarr bcarr have "b \<in> J"
   805       unfolding J_def by fast
   806     with bnI have JnI: "J \<noteq> I" by fast
   807     from acarr
   808     have "a = a \<otimes> \<one>" by algebra
   809     with anI have "a \<otimes> \<one> \<notin> I" by simp
   810     with one_closed have "\<one> \<notin> J"
   811       unfolding J_def by fast
   812     then have Jncarr: "J \<noteq> carrier R" by fast
   813     
   814     interpret ideal J R by (rule idealJ)
   815     
   816     have "J = I \<or> J = carrier R"
   817       apply (intro I_maximal)
   818       apply (rule idealJ)
   819       apply (rule IsubJ)
   820       apply (rule a_subset)
   821       done
   822     
   823     with JnI and Jncarr show False by simp
   824   qed
   825 qed
   826 
   827 
   828 subsection {* Derived Theorems *}
   829 
   830 --"A non-zero cring that has only the two trivial ideals is a field"
   831 lemma (in cring) trivialideals_fieldI:
   832   assumes carrnzero: "carrier R \<noteq> {\<zero>}"
   833     and haveideals: "{I. ideal I R} = {{\<zero>}, carrier R}"
   834   shows "field R"
   835   apply (rule cring_fieldI)
   836   apply (rule, rule, rule)
   837    apply (erule Units_closed)
   838   defer 1
   839     apply rule
   840   defer 1
   841 proof (rule ccontr, simp)
   842   assume zUnit: "\<zero> \<in> Units R"
   843   then have a: "\<zero> \<otimes> inv \<zero> = \<one>" by (rule Units_r_inv)
   844   from zUnit have "\<zero> \<otimes> inv \<zero> = \<zero>"
   845     by (intro l_null) (rule Units_inv_closed)
   846   with a[symmetric] have "\<one> = \<zero>" by simp
   847   then have "carrier R = {\<zero>}" by (rule one_zeroD)
   848   with carrnzero show False by simp
   849 next
   850   fix x
   851   assume xcarr': "x \<in> carrier R - {\<zero>}"
   852   then have xcarr: "x \<in> carrier R" by fast
   853   from xcarr' have xnZ: "x \<noteq> \<zero>" by fast
   854   from xcarr have xIdl: "ideal (PIdl x) R"
   855     by (intro cgenideal_ideal) fast
   856 
   857   from xcarr have "x \<in> PIdl x"
   858     by (intro cgenideal_self) fast
   859   with xnZ have "PIdl x \<noteq> {\<zero>}" by fast
   860   with haveideals have "PIdl x = carrier R"
   861     by (blast intro!: xIdl)
   862   then have "\<one> \<in> PIdl x" by simp
   863   then have "\<exists>y. \<one> = y \<otimes> x \<and> y \<in> carrier R"
   864     unfolding cgenideal_def by blast
   865   then obtain y where ycarr: " y \<in> carrier R" and ylinv: "\<one> = y \<otimes> x"
   866     by fast+
   867   from ylinv and xcarr ycarr have yrinv: "\<one> = x \<otimes> y"
   868     by (simp add: m_comm)
   869   from ycarr and ylinv[symmetric] and yrinv[symmetric]
   870   have "\<exists>y \<in> carrier R. y \<otimes> x = \<one> \<and> x \<otimes> y = \<one>" by fast
   871   with xcarr show "x \<in> Units R"
   872     unfolding Units_def by fast
   873 qed
   874 
   875 lemma (in field) all_ideals: "{I. ideal I R} = {{\<zero>}, carrier R}"
   876   apply (rule, rule)
   877 proof -
   878   fix I
   879   assume a: "I \<in> {I. ideal I R}"
   880   then interpret ideal I R by simp
   881 
   882   show "I \<in> {{\<zero>}, carrier R}"
   883   proof (cases "\<exists>a. a \<in> I - {\<zero>}")
   884     case True
   885     then obtain a where aI: "a \<in> I" and anZ: "a \<noteq> \<zero>"
   886       by fast+
   887     from aI[THEN a_Hcarr] anZ have aUnit: "a \<in> Units R"
   888       by (simp add: field_Units)
   889     then have a: "a \<otimes> inv a = \<one>" by (rule Units_r_inv)
   890     from aI and aUnit have "a \<otimes> inv a \<in> I"
   891       by (simp add: I_r_closed del: Units_r_inv)
   892     then have oneI: "\<one> \<in> I" by (simp add: a[symmetric])
   893 
   894     have "carrier R \<subseteq> I"
   895     proof
   896       fix x
   897       assume xcarr: "x \<in> carrier R"
   898       with oneI have "\<one> \<otimes> x \<in> I" by (rule I_r_closed)
   899       with xcarr show "x \<in> I" by simp
   900     qed
   901     with a_subset have "I = carrier R" by fast
   902     then show "I \<in> {{\<zero>}, carrier R}" by fast
   903   next
   904     case False
   905     then have IZ: "\<And>a. a \<in> I \<Longrightarrow> a = \<zero>" by simp
   906 
   907     have a: "I \<subseteq> {\<zero>}"
   908     proof
   909       fix x
   910       assume "x \<in> I"
   911       then have "x = \<zero>" by (rule IZ)
   912       then show "x \<in> {\<zero>}" by fast
   913     qed
   914 
   915     have "\<zero> \<in> I" by simp
   916     then have "{\<zero>} \<subseteq> I" by fast
   917 
   918     with a have "I = {\<zero>}" by fast
   919     then show "I \<in> {{\<zero>}, carrier R}" by fast
   920   qed
   921 qed (simp add: zeroideal oneideal)
   922 
   923 --"Jacobson Theorem 2.2"
   924 lemma (in cring) trivialideals_eq_field:
   925   assumes carrnzero: "carrier R \<noteq> {\<zero>}"
   926   shows "({I. ideal I R} = {{\<zero>}, carrier R}) = field R"
   927   by (fast intro!: trivialideals_fieldI[OF carrnzero] field.all_ideals)
   928 
   929 
   930 text {* Like zeroprimeideal for domains *}
   931 lemma (in field) zeromaximalideal: "maximalideal {\<zero>} R"
   932   apply (rule maximalidealI)
   933     apply (rule zeroideal)
   934 proof-
   935   from one_not_zero have "\<one> \<notin> {\<zero>}" by simp
   936   with one_closed show "carrier R \<noteq> {\<zero>}" by fast
   937 next
   938   fix J
   939   assume Jideal: "ideal J R"
   940   then have "J \<in> {I. ideal I R}" by fast
   941   with all_ideals show "J = {\<zero>} \<or> J = carrier R"
   942     by simp
   943 qed
   944 
   945 lemma (in cring) zeromaximalideal_fieldI:
   946   assumes zeromax: "maximalideal {\<zero>} R"
   947   shows "field R"
   948   apply (rule trivialideals_fieldI, rule maximalideal.I_notcarr[OF zeromax])
   949   apply rule apply clarsimp defer 1
   950    apply (simp add: zeroideal oneideal)
   951 proof -
   952   fix J
   953   assume Jn0: "J \<noteq> {\<zero>}"
   954     and idealJ: "ideal J R"
   955   interpret ideal J R by (rule idealJ)
   956   have "{\<zero>} \<subseteq> J" by (rule ccontr) simp
   957   from zeromax and idealJ and this and a_subset
   958   have "J = {\<zero>} \<or> J = carrier R"
   959     by (rule maximalideal.I_maximal)
   960   with Jn0 show "J = carrier R"
   961     by simp
   962 qed
   963 
   964 lemma (in cring) zeromaximalideal_eq_field: "maximalideal {\<zero>} R = field R"
   965   apply rule
   966    apply (erule zeromaximalideal_fieldI)
   967   apply (erule field.zeromaximalideal)
   968   done
   969 
   970 end