Theorem: DiscreteValuationRing.TFAE
File: Mathlib/RingTheory/DiscreteValuationRing/TFAE.lean

tactic: have ne_bot := Ring.ne_bot_of_isMaximal_of_not_isField (maximalIdeal.isMaximal R) h
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), FiniteDimensional.finrank (ResidueField R) (CotangentSpace R) = 1,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: rw [finrank_eq_one_iff']
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), FiniteDimensional.finrank (ResidueField R) (CotangentSpace R) = 1,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 1 → 2
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 2 → 1
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 1 → 4
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 4 → 3
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 3 → 5
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 5 → 6
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 6 → 5
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 5 → 7
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_have 7 → 2
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: tfae_finish
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
tfae_7_to_2 : (∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n) → ValuationRing R
⊢ List.TFAE
    [DiscreteValuationRing R, ValuationRing R, IsDedekindDomain R, IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P,
      Submodule.IsPrincipal (maximalIdeal R), ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w,
      ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n]

tactic: intro
state_before: case tfae_1_to_2
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
⊢ DiscreteValuationRing R → ValuationRing R

tactic: infer_instance
state_before: case tfae_1_to_2
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
✝ : DiscreteValuationRing R
⊢ ValuationRing R

tactic: intro
state_before: case tfae_2_to_1
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
⊢ ValuationRing R → DiscreteValuationRing R

tactic: haveI := IsBezout.toGCDDomain R
state_before: case tfae_2_to_1
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
⊢ DiscreteValuationRing R

tactic: haveI : UniqueFactorizationMonoid R := ufm_of_gcd_of_wfDvdMonoid
state_before: case tfae_2_to_1
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
this : GCDMonoid R
⊢ DiscreteValuationRing R

tactic: apply DiscreteValuationRing.of_ufd_of_unique_irreducible
state_before: case tfae_2_to_1
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
this✝ : GCDMonoid R
this : UniqueFactorizationMonoid R
⊢ DiscreteValuationRing R

tactic: obtain ⟨x, hx₁, hx₂⟩ := Ring.exists_not_isUnit_of_not_isField h
state_before: case tfae_2_to_1.h₁
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
this✝ : GCDMonoid R
this : UniqueFactorizationMonoid R
⊢ ∃ p, Irreducible p

tactic: obtain ⟨p, hp₁, -⟩ := WfDvdMonoid.exists_irreducible_factor hx₂ hx₁
state_before: case tfae_2_to_1.h₁.intro.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
this✝ : GCDMonoid R
this : UniqueFactorizationMonoid R
x : R
hx₁ : x ≠ 0
hx₂ : ¬IsUnit x
⊢ ∃ p, Irreducible p

tactic: exact ⟨p, hp₁⟩
state_before: case tfae_2_to_1.h₁.intro.intro.intro.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
this✝ : GCDMonoid R
this : UniqueFactorizationMonoid R
x : R
hx₁ : x ≠ 0
hx₂ : ¬IsUnit x
p : R
hp₁ : Irreducible p
⊢ ∃ p, Irreducible p

tactic: exact ValuationRing.unique_irreducible
state_before: case tfae_2_to_1.h₂
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
✝ : ValuationRing R
this✝ : GCDMonoid R
this : UniqueFactorizationMonoid R
⊢ ∀ ⦃p q : R⦄, Irreducible p → Irreducible q → Associated p q

tactic: intro H
state_before: case tfae_1_to_4
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
⊢ DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P

tactic: exact ⟨inferInstance, ((DiscreteValuationRing.iff_pid_with_one_nonzero_prime R).mp H).2⟩
state_before: case tfae_1_to_4
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
H : DiscreteValuationRing R
⊢ IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P

tactic: rintro ⟨h₁, h₂⟩
state_before: case tfae_4_to_3
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
⊢ (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R

tactic: exact
  ⟨inferInstance, fun I hI hI' =>
    ExistsUnique.unique h₂ ⟨ne_bot, inferInstance⟩ ⟨hI, hI'⟩ ▸ maximalIdeal.isMaximal R, h₁⟩
state_before: case tfae_4_to_3.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
h₁ : IsIntegrallyClosed R
h₂ : ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
⊢ IsDedekindDomain R

tactic: intro h
state_before: case tfae_3_to_5
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
⊢ IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)

tactic: exact maximalIdeal_isPrincipal_of_isDedekindDomain R
state_before: case tfae_3_to_5
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h✝ : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
h : IsDedekindDomain R
⊢ Submodule.IsPrincipal (maximalIdeal R)

tactic: rintro ⟨x, hx⟩
state_before: case tfae_5_to_6
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
⊢ Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w

tactic: have : x ∈ maximalIdeal R := by rw [hx]; exact Submodule.subset_span (Set.mem_singleton x)
state_before: case tfae_5_to_6.mk.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
⊢ ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w

tactic: let x' : maximalIdeal R := ⟨x, this⟩
state_before: case tfae_5_to_6.mk.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
⊢ ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w

tactic: use Submodule.Quotient.mk x'
state_before: case tfae_5_to_6.mk.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
⊢ ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w

tactic: constructor
state_before: case tfae_5_to_6.mk.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
⊢ ∃ _n, ∀ (w : CotangentSpace R), ∃ c, c • Submodule.Quotient.mk x' = w

tactic: swap
state_before: case tfae_5_to_6.mk.intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
⊢ ∀ (w : CotangentSpace R), ∃ c, c • Submodule.Quotient.mk x' = w

case tfae_5_to_6.mk.intro.w
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
⊢ Submodule.Quotient.mk x' ≠ 0

tactic: rw [hx]
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
⊢ x ∈ maximalIdeal R

tactic: exact Submodule.subset_span (Set.mem_singleton x)
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
⊢ x ∈ Submodule.span R {x}

tactic: intro e
state_before: case tfae_5_to_6.mk.intro.w
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
⊢ Submodule.Quotient.mk x' ≠ 0

tactic: rw [Submodule.Quotient.mk_eq_zero] at e
state_before: case tfae_5_to_6.mk.intro.w
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : Submodule.Quotient.mk x' = 0
⊢ False

tactic: apply Ring.ne_bot_of_isMaximal_of_not_isField (maximalIdeal.isMaximal R) h
state_before: case tfae_5_to_6.mk.intro.w
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : x' ∈ maximalIdeal R • ⊤
⊢ False

tactic: apply Submodule.eq_bot_of_le_smul_of_le_jacobson_bot (maximalIdeal R)
state_before: case tfae_5_to_6.mk.intro.w
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : x' ∈ maximalIdeal R • ⊤
⊢ maximalIdeal R = ⊥

tactic: exact ⟨{x}, (Finset.coe_singleton x).symm ▸ hx.symm⟩
state_before: case tfae_5_to_6.mk.intro.w.hN
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : x' ∈ maximalIdeal R • ⊤
⊢ Submodule.FG (maximalIdeal R)

tactic: conv_lhs => rw [hx]
state_before: case tfae_5_to_6.mk.intro.w.hIN
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : x' ∈ maximalIdeal R • ⊤
⊢ maximalIdeal R ≤ maximalIdeal R • maximalIdeal R

tactic: rw [Submodule.mem_smul_top_iff] at e
state_before: case tfae_5_to_6.mk.intro.w.hIN
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : x' ∈ maximalIdeal R • ⊤
⊢ Submodule.span R {x} ≤ maximalIdeal R • maximalIdeal R

tactic: rwa [Submodule.span_le, Set.singleton_subset_iff]
state_before: case tfae_5_to_6.mk.intro.w.hIN
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : ↑x' ∈ maximalIdeal R • maximalIdeal R
⊢ Submodule.span R {x} ≤ maximalIdeal R • maximalIdeal R

tactic: rw [LocalRing.jacobson_eq_maximalIdeal (⊥ : Ideal R) bot_ne_top]
state_before: case tfae_5_to_6.mk.intro.w.hIjac
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
e : x' ∈ maximalIdeal R • ⊤
⊢ maximalIdeal R ≤ Ideal.jacobson ⊥

tactic: refine' fun w => Quotient.inductionOn' w fun y => _
state_before: case tfae_5_to_6.mk.intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
⊢ ∀ (w : CotangentSpace R), ∃ c, c • Submodule.Quotient.mk x' = w

tactic: obtain ⟨y, hy⟩ := y
state_before: case tfae_5_to_6.mk.intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
w : CotangentSpace R
y : { x // x ∈ maximalIdeal R }
⊢ ∃ c, c • Submodule.Quotient.mk x' = Quotient.mk'' y

tactic: rw [hx, Submodule.mem_span_singleton] at hy
state_before: case tfae_5_to_6.mk.intro.h.mk
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
w : CotangentSpace R
y : R
hy : y ∈ maximalIdeal R
⊢ ∃ c, c • Submodule.Quotient.mk x' = Quotient.mk'' { val := y, property := hy }

tactic: obtain ⟨a, rfl⟩ := hy
state_before: case tfae_5_to_6.mk.intro.h.mk
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
w : CotangentSpace R
y : R
hy✝ : y ∈ maximalIdeal R
hy : ∃ a, a • x = y
⊢ ∃ c, c • Submodule.Quotient.mk x' = Quotient.mk'' { val := y, property := hy✝ }

tactic: exact ⟨Ideal.Quotient.mk _ a, rfl⟩
state_before: case tfae_5_to_6.mk.intro.h.mk.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
x : R
hx : maximalIdeal R = Submodule.span R {x}
this : x ∈ maximalIdeal R
x' : { x // x ∈ maximalIdeal R } := { val := x, property := this }
w : CotangentSpace R
a : R
hy : a • x ∈ maximalIdeal R
⊢ ∃ c, c • Submodule.Quotient.mk x' = Quotient.mk'' { val := a • x, property := hy }

tactic: rintro ⟨x, hx, hx'⟩
state_before: case tfae_6_to_5
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
⊢ (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)

tactic: induction x using Quotient.inductionOn' with | h x => ?_
state_before: case tfae_6_to_5.intro.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : CotangentSpace R
hx : x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • x = w
⊢ Submodule.IsPrincipal (maximalIdeal R)

tactic: use x
state_before: case tfae_6_to_5.intro.intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ Submodule.IsPrincipal (maximalIdeal R)

tactic: apply le_antisymm
state_before: case tfae_6_to_5.intro.intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ maximalIdeal R = Submodule.span R {↑x}

tactic: swap
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ maximalIdeal R ≤ Submodule.span R {↑x}

case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ Submodule.span R {↑x} ≤ maximalIdeal R

tactic: have h₂ : maximalIdeal R ≤ (⊥ : Ideal R).jacobson := by
  rw [LocalRing.jacobson_eq_maximalIdeal]
  exact bot_ne_top
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
⊢ maximalIdeal R ≤ Submodule.span R {↑x}

tactic: have :=
  Submodule.smul_sup_eq_smul_sup_of_le_smul_of_le_jacobson (IsNoetherian.noetherian _) h₂ h₁
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
h₂ : maximalIdeal R ≤ Ideal.jacobson ⊥
⊢ maximalIdeal R ≤ Submodule.span R {↑x}

tactic: rw [Submodule.bot_smul, sup_bot_eq] at this
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
h₂ : maximalIdeal R ≤ Ideal.jacobson ⊥
this : Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R = Ideal.span {↑x} ⊔ ⊥ • maximalIdeal R
⊢ maximalIdeal R ≤ Submodule.span R {↑x}

tactic: rw [← sup_eq_left, eq_comm]
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
h₂ : maximalIdeal R ≤ Ideal.jacobson ⊥
this : Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R = Ideal.span {↑x}
⊢ maximalIdeal R ≤ Submodule.span R {↑x}

tactic: exact le_sup_left.antisymm (h₁.trans <| le_of_eq this)
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
h₂ : maximalIdeal R ≤ Ideal.jacobson ⊥
this : Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R = Ideal.span {↑x}
⊢ Submodule.span R {↑x} = Submodule.span R {↑x} ⊔ maximalIdeal R

tactic: rw [Submodule.span_le, Set.singleton_subset_iff]
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ Submodule.span R {↑x} ≤ maximalIdeal R

tactic: exact x.prop
state_before: case tfae_6_to_5.intro.intro.h.a
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ ↑x ∈ ↑(maximalIdeal R)

tactic: refine' sup_le le_sup_left _
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: rintro m hm
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
⊢ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: obtain ⟨c, hc⟩ := hx' (Submodule.Quotient.mk ⟨m, hm⟩)
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
⊢ m ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: induction c using Quotient.inductionOn' with | h c => ?_
state_before: case intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : ResidueField R
hc : c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
⊢ m ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: rw [← sub_sub_cancel (c * x) m]
state_before: case intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : R
hc : Quotient.mk'' c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
⊢ m ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: apply sub_mem _ _
state_before: case intro.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : R
hc : Quotient.mk'' c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
⊢ c * ↑x - (c * ↑x - m) ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: refine' Ideal.mem_sup_left (Ideal.mem_span_singleton'.mpr ⟨c, rfl⟩)
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : R
hc : Quotient.mk'' c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
⊢ c * ↑x ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: have := (Submodule.Quotient.eq _).mp hc
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : R
hc : Quotient.mk'' c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
⊢ c * ↑x - m ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: rw [Submodule.mem_smul_top_iff] at this
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : R
hc : Quotient.mk'' c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
this : (fun x x_1 => x • x_1) c x - { val := m, property := hm } ∈ maximalIdeal R • ⊤
⊢ c * ↑x - m ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: exact Ideal.mem_sup_right this
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
m : R
hm : m ∈ maximalIdeal R
c : R
hc : Quotient.mk'' c • Quotient.mk'' x = Submodule.Quotient.mk { val := m, property := hm }
this : ↑((fun x x_1 => x • x_1) c x - { val := m, property := hm }) ∈ maximalIdeal R • maximalIdeal R
⊢ c * ↑x - m ∈ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R

tactic: rw [LocalRing.jacobson_eq_maximalIdeal]
state_before: R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
⊢ maximalIdeal R ≤ Ideal.jacobson ⊥

tactic: exact bot_ne_top
state_before: case h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
x : { x // x ∈ maximalIdeal R }
hx : Quotient.mk'' x ≠ 0
hx' : ∀ (w : CotangentSpace R), ∃ c, c • Quotient.mk'' x = w
h₁ : Ideal.span {↑x} ⊔ maximalIdeal R ≤ Ideal.span {↑x} ⊔ maximalIdeal R • maximalIdeal R
⊢ ⊥ ≠ ⊤

tactic: exact exists_maximalIdeal_pow_eq_of_principal R h
state_before: case tfae_5_to_7
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
⊢ Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n

tactic: rw [ValuationRing.iff_ideal_total]
state_before: case tfae_7_to_2
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
⊢ (∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n) → ValuationRing R

tactic: intro H
state_before: case tfae_7_to_2
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
⊢ (∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n) → IsTotal (Ideal R) fun x x_1 => x ≤ x_1

tactic: constructor
state_before: case tfae_7_to_2
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
⊢ IsTotal (Ideal R) fun x x_1 => x ≤ x_1

tactic: intro I J
state_before: case tfae_7_to_2.total
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
⊢ ∀ (a b : Ideal R), a ≤ b ∨ b ≤ a

tactic: by_cases hI : I = ⊥
state_before: case tfae_7_to_2.total
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I J : Ideal R
⊢ I ≤ J ∨ J ≤ I

tactic: by_cases hJ : J = ⊥
state_before: case neg
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I J : Ideal R
hI : ¬I = ⊥
⊢ I ≤ J ∨ J ≤ I

tactic: obtain ⟨n, rfl⟩ := H I hI
state_before: case neg
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I J : Ideal R
hI : ¬I = ⊥
hJ : ¬J = ⊥
⊢ I ≤ J ∨ J ≤ I

tactic: obtain ⟨m, rfl⟩ := H J hJ
state_before: case neg.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
J : Ideal R
hJ : ¬J = ⊥
n : ℕ
hI : ¬maximalIdeal R ^ n = ⊥
⊢ maximalIdeal R ^ n ≤ J ∨ J ≤ maximalIdeal R ^ n

tactic: cases' le_total m n with h' h'
state_before: case neg.intro.intro
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
n : ℕ
hI : ¬maximalIdeal R ^ n = ⊥
m : ℕ
hJ : ¬maximalIdeal R ^ m = ⊥
⊢ maximalIdeal R ^ n ≤ maximalIdeal R ^ m ∨ maximalIdeal R ^ m ≤ maximalIdeal R ^ n

tactic: subst hI
state_before: case pos
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I J : Ideal R
hI : I = ⊥
⊢ I ≤ J ∨ J ≤ I

tactic: left
state_before: case pos
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
J : Ideal R
⊢ ⊥ ≤ J ∨ J ≤ ⊥

tactic: exact bot_le
state_before: case pos.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
J : Ideal R
⊢ ⊥ ≤ J

tactic: subst hJ
state_before: case pos
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I J : Ideal R
hI : ¬I = ⊥
hJ : J = ⊥
⊢ I ≤ J ∨ J ≤ I

tactic: right
state_before: case pos
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I : Ideal R
hI : ¬I = ⊥
⊢ I ≤ ⊥ ∨ ⊥ ≤ I

tactic: exact bot_le
state_before: case pos.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
I : Ideal R
hI : ¬I = ⊥
⊢ ⊥ ≤ I

tactic: left
state_before: case neg.intro.intro.inl
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
n : ℕ
hI : ¬maximalIdeal R ^ n = ⊥
m : ℕ
hJ : ¬maximalIdeal R ^ m = ⊥
h' : m ≤ n
⊢ maximalIdeal R ^ n ≤ maximalIdeal R ^ m ∨ maximalIdeal R ^ m ≤ maximalIdeal R ^ n

tactic: exact Ideal.pow_le_pow h'
state_before: case neg.intro.intro.inl.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
n : ℕ
hI : ¬maximalIdeal R ^ n = ⊥
m : ℕ
hJ : ¬maximalIdeal R ^ m = ⊥
h' : m ≤ n
⊢ maximalIdeal R ^ n ≤ maximalIdeal R ^ m

tactic: right
state_before: case neg.intro.intro.inr
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
n : ℕ
hI : ¬maximalIdeal R ^ n = ⊥
m : ℕ
hJ : ¬maximalIdeal R ^ m = ⊥
h' : n ≤ m
⊢ maximalIdeal R ^ n ≤ maximalIdeal R ^ m ∨ maximalIdeal R ^ m ≤ maximalIdeal R ^ n

tactic: exact Ideal.pow_le_pow h'
state_before: case neg.intro.intro.inr.h
R : Type u_1
inst✝⁶ : CommRing R
K : Type ?u.224397
inst✝⁵ : Field K
inst✝⁴ : Algebra R K
inst✝³ : IsFractionRing R K
inst✝² : IsNoetherianRing R
inst✝¹ : LocalRing R
inst✝ : IsDomain R
h : ¬IsField R
ne_bot : maximalIdeal R ≠ ⊥
tfae_1_to_2 : DiscreteValuationRing R → ValuationRing R
tfae_2_to_1 : ValuationRing R → DiscreteValuationRing R
tfae_1_to_4 : DiscreteValuationRing R → IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P
tfae_4_to_3 : (IsIntegrallyClosed R ∧ ∃! P, P ≠ ⊥ ∧ Ideal.IsPrime P) → IsDedekindDomain R
tfae_3_to_5 : IsDedekindDomain R → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_6 : Submodule.IsPrincipal (maximalIdeal R) → ∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w
tfae_6_to_5 : (∃ v _n, ∀ (w : CotangentSpace R), ∃ c, c • v = w) → Submodule.IsPrincipal (maximalIdeal R)
tfae_5_to_7 : Submodule.IsPrincipal (maximalIdeal R) → ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
H : ∀ (I : Ideal R), I ≠ ⊥ → ∃ n, I = maximalIdeal R ^ n
n : ℕ
hI : ¬maximalIdeal R ^ n = ⊥
m : ℕ
hJ : ¬maximalIdeal R ^ m = ⊥
h' : n ≤ m
⊢ maximalIdeal R ^ m ≤ maximalIdeal R ^ n