Theorem: IsLocalization.noZeroDivisors_of_le_nonZeroDivisors
File: Mathlib/RingTheory/Localization/Basic.lean

tactic: intro z w h
state_before: R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
⊢ ∀ {a b : S}, a * b = 0 → a = 0 ∨ b = 0

tactic: cases' surj M z with x hx
state_before: R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
⊢ z = 0 ∨ w = 0

tactic: cases' surj M w with y hy
state_before: case intro
R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
⊢ z = 0 ∨ w = 0

tactic: have :
  z * w * algebraMap A S y.2 * algebraMap A S x.2 = algebraMap A S x.1 * algebraMap A S y.1 :=
  by rw [mul_assoc z, hy, ← hx]; ring
state_before: case intro.intro
R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
⊢ z = 0 ∨ w = 0

tactic: rw [h, zero_mul, zero_mul, ← (algebraMap A S).map_mul] at this
state_before: case intro.intro
R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
this : z * w * ↑(algebraMap A S) ↑y.snd * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst * ↑(algebraMap A S) y.fst
⊢ z = 0 ∨ w = 0

tactic: cases' eq_zero_or_eq_zero_of_mul_eq_zero ((to_map_eq_zero_iff S hM).mp this.symm) with H H
state_before: case intro.intro
R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
this : 0 = ↑(algebraMap A S) (x.fst * y.fst)
⊢ z = 0 ∨ w = 0

tactic: rw [mul_assoc z, hy, ← hx]
state_before: R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
⊢ z * w * ↑(algebraMap A S) ↑y.snd * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst * ↑(algebraMap A S) y.fst

tactic: ring
state_before: R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
⊢ z * ↑(algebraMap A S) y.fst * ↑(algebraMap A S) ↑x.snd = z * ↑(algebraMap A S) ↑x.snd * ↑(algebraMap A S) y.fst

tactic: exact Or.inl (eq_zero_of_fst_eq_zero hx H)
state_before: case intro.intro.inl
R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
this : 0 = ↑(algebraMap A S) (x.fst * y.fst)
H : x.fst = 0
⊢ z = 0 ∨ w = 0

tactic: exact Or.inr (eq_zero_of_fst_eq_zero hy H)
state_before: case intro.intro.inr
R : Type ?u.3107598
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type ?u.3108027
inst✝⁷ : CommRing P
K : Type ?u.3108033
inst✝⁶ : IsLocalization M✝ S
Q : Type ?u.3108214
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_1
inst✝³ : CommRing A
inst✝² : IsDomain A
inst✝¹ : Algebra A S
M : Submonoid A
inst✝ : IsLocalization M S
hM : M ≤ nonZeroDivisors A
z w : S
h : z * w = 0
x : A × { x // x ∈ M }
hx : z * ↑(algebraMap A S) ↑x.snd = ↑(algebraMap A S) x.fst
y : A × { x // x ∈ M }
hy : w * ↑(algebraMap A S) ↑y.snd = ↑(algebraMap A S) y.fst
this : 0 = ↑(algebraMap A S) (x.fst * y.fst)
H : y.fst = 0
⊢ z = 0 ∨ w = 0