Theorem: DiscreteValuationRing.iff_pid_with_one_nonzero_prime
File: Mathlib/RingTheory/DiscreteValuationRing/Basic.lean

tactic: constructor
state_before: R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
⊢ DiscreteValuationRing R ↔ IsPrincipalIdealRing R ∧ ∃! P, P ≠ ⊥ ∧ IsPrime P

tactic: intro RDVR
state_before: case mp
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
⊢ DiscreteValuationRing R → IsPrincipalIdealRing R ∧ ∃! P, P ≠ ⊥ ∧ IsPrime P

tactic: rcases id RDVR with ⟨Rlocal⟩
state_before: case mp
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
⊢ IsPrincipalIdealRing R ∧ ∃! P, P ≠ ⊥ ∧ IsPrime P

tactic: constructor
state_before: case mp.mk
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ IsPrincipalIdealRing R ∧ ∃! P, P ≠ ⊥ ∧ IsPrime P

tactic: assumption
state_before: case mp.mk.left
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ IsPrincipalIdealRing R

case mp.mk.right
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ ∃! P, P ≠ ⊥ ∧ IsPrime P

tactic: use LocalRing.maximalIdeal R
state_before: case mp.mk.right
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ ∃! P, P ≠ ⊥ ∧ IsPrime P

tactic: constructor
state_before: case mp.mk.right
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ (fun P => P ≠ ⊥ ∧ IsPrime P) (maximalIdeal R) ∧ ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = maximalIdeal R

tactic: exact ⟨Rlocal, inferInstance⟩
state_before: case mp.mk.right.left
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ (fun P => P ≠ ⊥ ∧ IsPrime P) (maximalIdeal R)

case mp.mk.right.right
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = maximalIdeal R

tactic: rintro Q ⟨hQ1, hQ2⟩
state_before: case mp.mk.right.right
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
⊢ ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = maximalIdeal R

tactic: obtain ⟨q, rfl⟩ := (IsPrincipalIdealRing.principal Q).1
state_before: case mp.mk.right.right.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
Q : Ideal R
hQ1 : Q ≠ ⊥
hQ2 : IsPrime Q
⊢ Q = maximalIdeal R

tactic: have hq : q ≠ 0 := by
  rintro rfl
  apply hQ1
  simp
state_before: case mp.mk.right.right.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
q : R
hQ1 : Submodule.span R {q} ≠ ⊥
hQ2 : IsPrime (Submodule.span R {q})
⊢ Submodule.span R {q} = maximalIdeal R

tactic: erw [span_singleton_prime hq] at hQ2
state_before: case mp.mk.right.right.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
q : R
hQ1 : Submodule.span R {q} ≠ ⊥
hQ2 : IsPrime (Submodule.span R {q})
hq : q ≠ 0
⊢ Submodule.span R {q} = maximalIdeal R

tactic: replace hQ2 := hQ2.irreducible
state_before: case mp.mk.right.right.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
q : R
hQ1 : Submodule.span R {q} ≠ ⊥
hQ2 : Prime q
hq : q ≠ 0
⊢ Submodule.span R {q} = maximalIdeal R

tactic: rw [irreducible_iff_uniformizer] at hQ2
state_before: case mp.mk.right.right.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
q : R
hQ1 : Submodule.span R {q} ≠ ⊥
hq : q ≠ 0
hQ2 : Irreducible q
⊢ Submodule.span R {q} = maximalIdeal R

tactic: exact hQ2.symm
state_before: case mp.mk.right.right.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
q : R
hQ1 : Submodule.span R {q} ≠ ⊥
hq : q ≠ 0
hQ2✝ : Irreducible q
hQ2 : maximalIdeal R = span {q}
⊢ Submodule.span R {q} = maximalIdeal R

tactic: rintro rfl
state_before: R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
q : R
hQ1 : Submodule.span R {q} ≠ ⊥
hQ2 : IsPrime (Submodule.span R {q})
⊢ q ≠ 0

tactic: apply hQ1
state_before: R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
hQ1 : Submodule.span R {0} ≠ ⊥
hQ2 : IsPrime (Submodule.span R {0})
⊢ False

tactic: simp
state_before: R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RDVR : DiscreteValuationRing R
toIsPrincipalIdealRing✝ : IsPrincipalIdealRing R
toLocalRing✝ : LocalRing R
Rlocal : maximalIdeal R ≠ ⊥
hQ1 : Submodule.span R {0} ≠ ⊥
hQ2 : IsPrime (Submodule.span R {0})
⊢ Submodule.span R {0} = ⊥

tactic: rintro ⟨RPID, Punique⟩
state_before: case mpr
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
⊢ (IsPrincipalIdealRing R ∧ ∃! P, P ≠ ⊥ ∧ IsPrime P) → DiscreteValuationRing R

tactic: haveI : LocalRing R := LocalRing.of_unique_nonzero_prime Punique
state_before: case mpr.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
Punique : ∃! P, P ≠ ⊥ ∧ IsPrime P
⊢ DiscreteValuationRing R

tactic: refine' { not_a_field' := _ }
state_before: case mpr.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
Punique : ∃! P, P ≠ ⊥ ∧ IsPrime P
this : LocalRing R
⊢ DiscreteValuationRing R

tactic: rcases Punique with ⟨P, ⟨hP1, hP2⟩, _⟩
state_before: case mpr.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
Punique : ∃! P, P ≠ ⊥ ∧ IsPrime P
this : LocalRing R
⊢ maximalIdeal R ≠ ⊥

tactic: have hPM : P ≤ maximalIdeal R := le_maximalIdeal hP2.1
state_before: case mpr.intro.intro.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
this : LocalRing R
P : Ideal R
right✝ : ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = P
hP1 : P ≠ ⊥
hP2 : IsPrime P
⊢ maximalIdeal R ≠ ⊥

tactic: intro h
state_before: case mpr.intro.intro.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
this : LocalRing R
P : Ideal R
right✝ : ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = P
hP1 : P ≠ ⊥
hP2 : IsPrime P
hPM : P ≤ maximalIdeal R
⊢ maximalIdeal R ≠ ⊥

tactic: rw [h, le_bot_iff] at hPM
state_before: case mpr.intro.intro.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
this : LocalRing R
P : Ideal R
right✝ : ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = P
hP1 : P ≠ ⊥
hP2 : IsPrime P
hPM : P ≤ maximalIdeal R
h : maximalIdeal R = ⊥
⊢ False

tactic: exact hP1 hPM
state_before: case mpr.intro.intro.intro.intro
R✝ : Type u
inst✝⁴ : CommRing R✝
inst✝³ : IsDomain R✝
inst✝² : DiscreteValuationRing R✝
R : Type u
inst✝¹ : CommRing R
inst✝ : IsDomain R
RPID : IsPrincipalIdealRing R
this : LocalRing R
P : Ideal R
right✝ : ∀ (y : Ideal R), (fun P => P ≠ ⊥ ∧ IsPrime P) y → y = P
hP1 : P ≠ ⊥
hP2 : IsPrime P
hPM : P = ⊥
h : maximalIdeal R = ⊥
⊢ False