Theorem: Finset.prod_boole
File: Mathlib/Algebra/BigOperators/GroupWithZero/Finset.lean

tactic: split_ifs with h
state_before: ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
⊢ (∏ i ∈ s, if p i then 1 else 0) = if ∀ i ∈ s, p i then 1 else 0
state_after: case pos
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ∀ i ∈ s, p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 1

case neg
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ¬∀ i ∈ s, p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 0

tactic: apply prod_eq_one
state_before: case pos
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ∀ i ∈ s, p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 1
state_after: case pos.h
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ∀ i ∈ s, p i
⊢ ∀ x ∈ s, (if p x then 1 else 0) = 1

tactic: intro i hi
state_before: case pos.h
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ∀ i ∈ s, p i
⊢ ∀ x ∈ s, (if p x then 1 else 0) = 1
state_after: case pos.h
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i✝ : ι
h : ∀ i ∈ s, p i
i : ι
hi : i ∈ s
⊢ (if p i then 1 else 0) = 1

tactic: rw [if_pos (h i hi)]
state_before: case pos.h
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i✝ : ι
h : ∀ i ∈ s, p i
i : ι
hi : i ∈ s
⊢ (if p i then 1 else 0) = 1
state_after: no goals

tactic: push_neg at h
state_before: case neg
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ¬∀ i ∈ s, p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 0
state_after: case neg
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ∃ i ∈ s, ¬p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 0

tactic: rcases h with ⟨i, hi, hq⟩
state_before: case neg
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i : ι
h : ∃ i ∈ s, ¬p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 0
state_after: case neg.intro.intro
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i✝ i : ι
hi : i ∈ s
hq : ¬p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 0

tactic: apply prod_eq_zero hi
state_before: case neg.intro.intro
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i✝ i : ι
hi : i ∈ s
hq : ¬p i
⊢ (∏ i ∈ s, if p i then 1 else 0) = 0
state_after: case neg.intro.intro
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i✝ i : ι
hi : i ∈ s
hq : ¬p i
⊢ (if p i then 1 else 0) = 0

tactic: rw [if_neg hq]
state_before: case neg.intro.intro
ι : Type u_1
κ : Type u_2
G₀ : Type u_3
M₀ : Type u_4
inst✝¹ : CommMonoidWithZero M₀
p : ι → Prop
inst✝ : DecidablePred p
f : ι → M₀
s : Finset ι
i✝ i : ι
hi : i ∈ s
hq : ¬p i
⊢ (if p i then 1 else 0) = 0
state_after: no goals