Theorem: IsLocalization.AtPrime.localRing
File: Mathlib/RingTheory/Localization/AtPrime.lean

tactic: intro x y hx hy hu
state_before: R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this : _root_.Nontrivial S := Nontrivial S I
⊢ ∀ (a b : S), a ∈ nonunits S → b ∈ nonunits S → a + b ∈ nonunits S

tactic: cases' isUnit_iff_exists_inv.1 hu with z hxyz
state_before: R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
⊢ False

tactic: have : ∀ {r : R} {s : I.primeCompl}, mk' S r s ∈ nonunits S → r ∈ I := fun {r s} =>
  not_imp_comm.1 fun nr => isUnit_iff_exists_inv.2 ⟨mk' S ↑s (⟨r, nr⟩ : I.primeCompl),
    mk'_mul_mk'_eq_one' _ _ <| show r ∈ I.primeCompl from nr⟩
state_before: case intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
hxyz : (x + y) * z = 1
⊢ False

tactic: rcases mk'_surjective I.primeCompl x with ⟨rx, sx, hrx⟩
state_before: case intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
hxyz : (x + y) * z = 1
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
⊢ False

tactic: rcases mk'_surjective I.primeCompl y with ⟨ry, sy, hry⟩
state_before: case intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
hxyz : (x + y) * z = 1
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hrx : mk' S rx sx = x
⊢ False

tactic: rcases mk'_surjective I.primeCompl z with ⟨rz, sz, hrz⟩
state_before: case intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
hxyz : (x + y) * z = 1
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hry : mk' S ry sy = y
⊢ False

tactic: rw [← hrx, ← hry, ← hrz, ← mk'_add, ← mk'_mul, ← mk'_self S I.primeCompl.one_mem] at hxyz
state_before: case intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
hxyz : (x + y) * z = 1
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hrz : mk' S rz sz = z
⊢ False

tactic: rw [← hrx] at hx
state_before: case intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hx : x ∈ nonunits S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
⊢ False

tactic: rw [← hry] at hy
state_before: case intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hy : y ∈ nonunits S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
⊢ False

tactic: obtain ⟨t, ht⟩ := IsLocalization.eq.1 hxyz
state_before: case intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
⊢ False

tactic: simp only [mul_one, one_mul, Submonoid.coe_mul, Subtype.coe_mk] at ht
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
t : { x // x ∈ Ideal.primeCompl I }
ht :
  ↑t * (↑{ val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) } * ((rx * ↑sy + ry * ↑sx) * rz)) =
    ↑t * (↑(sx * sy * sz) * 1)
⊢ False

tactic: suffices : (t : R) * (sx * sy * sz) ∈ I
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
t : { x // x ∈ Ideal.primeCompl I }
ht : ↑t * ((rx * ↑sy + ry * ↑sx) * rz) = ↑t * (↑sx * ↑sy * ↑sz)
⊢ False

tactic: exact
  not_or_of_not (mt hp.mem_or_mem <| not_or_of_not sx.2 sy.2) sz.2
    (hp.mem_or_mem <| (hp.mem_or_mem this).resolve_left t.2)
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝¹ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this✝ : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
t : { x // x ∈ Ideal.primeCompl I }
ht : ↑t * ((rx * ↑sy + ry * ↑sx) * rz) = ↑t * (↑sx * ↑sy * ↑sz)
this : ↑t * (↑sx * ↑sy * ↑sz) ∈ I
⊢ False

case this
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
t : { x // x ∈ Ideal.primeCompl I }
ht : ↑t * ((rx * ↑sy + ry * ↑sx) * rz) = ↑t * (↑sx * ↑sy * ↑sz)
⊢ ↑t * (↑sx * ↑sy * ↑sz) ∈ I

tactic: rw [← ht]
state_before: case this
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
t : { x // x ∈ Ideal.primeCompl I }
ht : ↑t * ((rx * ↑sy + ry * ↑sx) * rz) = ↑t * (↑sx * ↑sy * ↑sz)
⊢ ↑t * (↑sx * ↑sy * ↑sz) ∈ I

tactic: exact
  I.mul_mem_left _ <| I.mul_mem_right _ <|
      I.add_mem (I.mul_mem_right _ <| this hx) <| I.mul_mem_right _ <| this hy
state_before: case this
R : Type u_1
inst✝⁴ : CommSemiring R
M : Submonoid R
S : Type u_2
inst✝³ : CommSemiring S
inst✝² : Algebra R S
P : Type ?u.14030
inst✝¹ : CommSemiring P
I : Ideal R
hp : Ideal.IsPrime I
inst✝ : IsLocalization.AtPrime S I
this✝ : _root_.Nontrivial S := Nontrivial S I
x y : S
hu : IsUnit (x + y)
z : S
this : ∀ {r : R} {s : { x // x ∈ Ideal.primeCompl I }}, mk' S r s ∈ nonunits S → r ∈ I
rx : R
sx : { x // x ∈ Ideal.primeCompl I }
hx : mk' S rx sx ∈ nonunits S
hrx : mk' S rx sx = x
ry : R
sy : { x // x ∈ Ideal.primeCompl I }
hy : mk' S ry sy ∈ nonunits S
hry : mk' S ry sy = y
rz : R
sz : { x // x ∈ Ideal.primeCompl I }
hxyz :
  mk' S ((rx * ↑sy + ry * ↑sx) * rz) (sx * sy * sz) = mk' S 1 { val := 1, property := (_ : 1 ∈ Ideal.primeCompl I) }
hrz : mk' S rz sz = z
t : { x // x ∈ Ideal.primeCompl I }
ht : ↑t * ((rx * ↑sy + ry * ↑sx) * rz) = ↑t * (↑sx * ↑sy * ↑sz)
⊢ ↑t * ((rx * ↑sy + ry * ↑sx) * rz) ∈ I