Theorem: prod_zero_iff_exists_zero
File: Mathlib/RingTheory/NonZeroDivisors.lean

tactic: constructor
state_before: M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
s : Multiset M₁
⊢ Multiset.prod s = 0 ↔ ∃ r x, r = 0

tactic: swap
state_before: case mp
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
s : Multiset M₁
⊢ Multiset.prod s = 0 → ∃ r x, r = 0

case mpr
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
s : Multiset M₁
⊢ (∃ r x, r = 0) → Multiset.prod s = 0

tactic: induction' s using Multiset.induction_on with a s ih
state_before: case mp
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
s : Multiset M₁
⊢ Multiset.prod s = 0 → ∃ r x, r = 0

tactic: rintro ⟨r, hrs, rfl⟩
state_before: case mpr
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
s : Multiset M₁
⊢ (∃ r x, r = 0) → Multiset.prod s = 0

tactic: exact Multiset.prod_eq_zero hrs
state_before: case mpr.intro.intro
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
s : Multiset M₁
hrs : 0 ∈ s
⊢ Multiset.prod s = 0

tactic: intro habs
state_before: case mp.empty
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
⊢ Multiset.prod 0 = 0 → ∃ r x, r = 0

tactic: simp at habs
state_before: case mp.empty
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
habs : Multiset.prod 0 = 0
⊢ ∃ r x, r = 0

tactic: rw [Multiset.prod_cons]
state_before: case mp.cons
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
⊢ Multiset.prod (a ::ₘ s) = 0 → ∃ r x, r = 0

tactic: intro hprod
state_before: case mp.cons
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
⊢ a * Multiset.prod s = 0 → ∃ r x, r = 0

tactic: replace hprod := eq_zero_or_eq_zero_of_mul_eq_zero hprod
state_before: case mp.cons
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
hprod : a * Multiset.prod s = 0
⊢ ∃ r x, r = 0

tactic: cases' hprod with ha hb
state_before: case mp.cons
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
hprod : a = 0 ∨ Multiset.prod s = 0
⊢ ∃ r x, r = 0

tactic: exact ⟨a, Multiset.mem_cons_self a s, ha⟩
state_before: case mp.cons.inl
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
ha : a = 0
⊢ ∃ r x, r = 0

tactic: apply (ih hb).imp _
state_before: case mp.cons.inr
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
hb : Multiset.prod s = 0
⊢ ∃ r x, r = 0

tactic: rintro b ⟨hb₁, hb₂⟩
state_before: M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
hb : Multiset.prod s = 0
⊢ ∀ (a_1 : M₁), (∃ x, a_1 = 0) → ∃ x, a_1 = 0

tactic: exact ⟨Multiset.mem_cons_of_mem hb₁, hb₂⟩
state_before: case intro
M : Type ?u.75307
M' : Type ?u.75310
M₁ : Type u_1
R : Type ?u.75316
R' : Type ?u.75319
F : Type ?u.75322
inst✝⁶ : MonoidWithZero M
inst✝⁵ : MonoidWithZero M'
inst✝⁴ : CommMonoidWithZero M₁
inst✝³ : Ring R
inst✝² : CommRing R'
inst✝¹ : NoZeroDivisors M₁
inst✝ : Nontrivial M₁
a : M₁
s : Multiset M₁
ih : Multiset.prod s = 0 → ∃ r x, r = 0
hb : Multiset.prod s = 0
b : M₁
hb₁ : b ∈ s
hb₂ : b = 0
⊢ ∃ x, b = 0