Theory Examples_Noetherian_Rings

section ‹Examples›
theory Examples_Noetherian_Rings

imports 
  "Hilbert_Basis" 
  Real_Ring_Definition
begin

subsection ‹Examples of noetherian rings with ℤ› and ℤ[X]›
lemma INTEG_euclidean_domain:euclidean_domain INTEG (λx. nat (abs x))
  apply(rule domain.euclidean_domainI)
  unfolding domain_def domain_axioms_def using INTEG_cring apply(simp add:INTEG_def)
  unfolding INTEG_def 
  using abs_mod_less div_mod_decomp_int mult.commute 
  by (metis Diff_iff INTEG.R.r_null INTEG_def INTEG_mult UNIV_I abs_ge_zero insert_iff 
      mult_zero_left nat_less_eq_zless partial_object.select_convs(1) ring_record_simps(12))


lemma principal_ideal_INTEG:ideal I INTEG  principalideal I INTEG
proof(rule principalidealI)
  assume h:ideal I INTEG
  then show ideal I INTEG by(simp)
  {assume h1:I  {0}
    define E where imp:E{nat (abs x)|x. xI  x0}
    then have E{} 
      using h h1 additive_subgroup.zero_closed unfolding ideal_def 
      by fastforce
    then have nE. xE. nx  n>0
      using abs_ge_zero imp zero_less_abs_iff 
      by (smt (verit) all_not_in_conv exists_least_iff gr_zeroI leI mem_Collect_eq nat_0_iff)
    define E' where imp2:E'{(abs x)|x. xI  x0}
    then have bij_betw nat E' E
      unfolding bij_betw_def
      apply(safe) 
      using inj_on_def apply force
      using imp apply blast
      using imp by blast
    then have nE'. xE'. nx  n>0 
      by (smt (verit, best) nE. xE. n  x  0 < n 
          bij_betw_iff_bijections le_nat_iff nat_eq_iff2 nat_le_iff zero_less_nat_eq) 
    then obtain n where f1:xE'. nx  n>0  nE' by blast
    then have aI. abs a =  n 
      using nE'. xE'. n  x  0 < n imp2 by blast 
    then obtain a where f0:aI  abs a =  n by blast
    then have x. q r. x = a*q+r  abs r < abs a
      using INTEG_euclidean_domain unfolding euclidean_domain_def 
      by (metis nE'. xE'. n  x  0 < n xE'. n  x  0 < n  n  E' 
          abs_mod_less div_mod_decomp_int mult.commute zero_less_abs_iff)
    then have f2:xI r =x - a*q  rI for q r x
      using h unfolding ideal_def INTEG_def additive_subgroup_def subgroup_def ideal_axioms_def
        ring_def apply(safe, simp)
      by (metis a  I  ¦a¦ = n integer_group_def inv_integer_group uminus_add_conv_diff)
    have f3:xI r =x - a*q  abs r < abs a  r = 0 for r q x 
      apply(frule f2)
      using imp2 f1 f0
      by fastforce
    have xI r =x - a*q  abs r < abs a  x  IdlINTEG{a}
      for x r q 
      apply(frule f3)
       apply blast
      unfolding genideal_def ideal_def INTEG_def additive_subgroup_def 
        subgroup_def ideal_axioms_def by(auto)
    then have xI  x  IdlINTEG{a}   for x
      by (metis x. q r. x = a * q + r  ¦r¦ < ¦a¦ add_diff_cancel_left')
    then have ideal I INTEG  icarrier INTEG. I = IdlINTEG{i}
      using INTEG.R.cgenideal_eq_genideal INTEG.R.cgenideal_minimal f0 by blast
  }note non_trivial_ideal=this
  show icarrier INTEG. I = IdlINTEG{i}
    apply(cases I={0}) 
     apply (metis INTEG.R.genideal_self 
        INTEG.R.ring_axioms INTEG_closed h ring.Idl_subset_ideal subsetI subset_antisym)
    using non_trivial_ideal h by auto
qed


lemma INTEG_noetherian_ring:noetherian_ring INTEG
  apply(rule ring.noetherian_ringI)
   apply (simp add: INTEG.R.ring_axioms)
  using principal_ideal_INTEG unfolding principalideal_def
  by (meson INTEG_closed finite.emptyI finite_insert principalideal_axioms_def subsetI)

lemma INTEG_noetherian_domain:noetherian_domain INTEG
  unfolding noetherian_domain_def 
  using INTEG_noetherian_ring INTEG_euclidean_domain euclidean_domain.axioms(1) by blast

lemma Polynomials_INTEG_noetherian_ring:noetherian_ring (univ_poly INTEG (carrier INTEG))
  by (simp add: INTEG_noetherian_domain noetherian_domain.weak_Hilbert_basis)

lemma Polynomials_INTEG_noetherian_domain: noetherian_domain (univ_poly INTEG (carrier INTEG))
  using INTEG.R.ring_axioms INTEG_noetherian_domain Polynomials_INTEG_noetherian_ring 
    domain.univ_poly_is_domain noetherian_domain.axioms(2) noetherian_domain.intro 
    ring.carrier_is_subring by blast



subsection ‹Another example with ℝ› and ℝ[X]›

lemma REAL_noetherian_domain:noetherian_domain REAL
  unfolding noetherian_domain_def 
  by (simp add: REAL_field domain.noetherian_RX_imp_noetherian_R domain.univ_poly_is_principal 
      field.axioms(1) field.carrier_is_subfield principal_imp_noetherian)

lemma PolyREAL_noetherian_domain:noetherian_domain (univ_poly REAL (carrier REAL))
  unfolding noetherian_domain_def 
  by (simp add: REAL_field REAL_noetherian_domain REAL_ring domain.univ_poly_is_domain 
      field.axioms(1) noetherian_domain.weak_Hilbert_basis ring.carrier_is_subring)


end