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

tactic: intro z w h
state_before: R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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
state_after: R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 z with x hx
state_before: R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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
state_after: case intro
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
⊢ z = 0 ∨ w = 0

tactic: cases' surj M w with y hy
state_before: case intro
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
⊢ z = 0 ∨ w = 0
state_after: case intro.intro
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
⊢ 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_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
⊢ z = 0 ∨ w = 0
state_after: case intro.intro
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : z * w * (algebraMap A S) ↑y.2 * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1 * (algebraMap A S) y.1
⊢ 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_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : z * w * (algebraMap A S) ↑y.2 * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1 * (algebraMap A S) y.1
⊢ z = 0 ∨ w = 0
state_after: case intro.intro
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : 0 = (algebraMap A S) (x.1 * y.1)
⊢ 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_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : 0 = (algebraMap A S) (x.1 * y.1)
⊢ z = 0 ∨ w = 0
state_after: case intro.intro.inl
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : 0 = (algebraMap A S) (x.1 * y.1)
H : x.1 = 0
⊢ z = 0 ∨ w = 0

case intro.intro.inr
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : 0 = (algebraMap A S) (x.1 * y.1)
H : y.1 = 0
⊢ z = 0 ∨ w = 0

tactic: rw [mul_assoc z, hy, ← hx]
state_before: R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
⊢ z * w * (algebraMap A S) ↑y.2 * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1 * (algebraMap A S) y.1
state_after: R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
⊢ z * (algebraMap A S) y.1 * (algebraMap A S) ↑x.2 = z * (algebraMap A S) ↑x.2 * (algebraMap A S) y.1

tactic: ring
state_before: R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
⊢ z * (algebraMap A S) y.1 * (algebraMap A S) ↑x.2 = z * (algebraMap A S) ↑x.2 * (algebraMap A S) y.1
state_after: no goals

tactic: exact Or.inl (eq_zero_of_fst_eq_zero hx H)
state_before: case intro.intro.inl
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : 0 = (algebraMap A S) (x.1 * y.1)
H : x.1 = 0
⊢ z = 0 ∨ w = 0
state_after: no goals

tactic: exact Or.inr (eq_zero_of_fst_eq_zero hy H)
state_before: case intro.intro.inr
R : Type u_1
inst✝¹⁰ : CommRing R
M✝ : Submonoid R
S : Type u_2
inst✝⁹ : CommRing S
inst✝⁸ : Algebra R S
P : Type u_3
inst✝⁷ : CommRing P
K : Type u_4
inst✝⁶ : IsLocalization M✝ S
Q : Type u_5
inst✝⁵ : CommRing Q
g : R →+* P
inst✝⁴ : Algebra P Q
A : Type u_6
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 × ↥M
hx : z * (algebraMap A S) ↑x.2 = (algebraMap A S) x.1
y : A × ↥M
hy : w * (algebraMap A S) ↑y.2 = (algebraMap A S) y.1
this : 0 = (algebraMap A S) (x.1 * y.1)
H : y.1 = 0
⊢ z = 0 ∨ w = 0
state_after: no goals