Theorem: Multiset.prod_induction_nonempty
File: Mathlib/Algebra/BigOperators/Group/Multiset.lean

Proof steps:
state_before: F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s t : Multiset α
a : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
hs : s ≠ ∅
p_s : ∀ a ∈ s, p a
⊢ p s.prod
state_after: case empty
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s t : Multiset α
a : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
hs : 0 ≠ ∅
p_s : ∀ a ∈ 0, p a
⊢ p (prod 0)

case cons
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
⊢ p (a ::ₘ s).prod
tactic: induction' s using Multiset.induction_on with a s hsa
state_before: case cons
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
⊢ p (a ::ₘ s).prod
state_after: case cons
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
⊢ p (a * s.prod)
tactic: rw [prod_cons]
state_before: case cons
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
⊢ p (a * s.prod)
state_after: case pos
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
hs_empty : s = ∅
⊢ p (a * s.prod)

case neg
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
hs_empty : ¬s = ∅
⊢ p (a * s.prod)
tactic: by_cases hs_empty : s = ∅
state_before: case neg
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
hs_empty : ¬s = ∅
⊢ p (a * s.prod)
state_after: case neg
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
hs_empty : ¬s = ∅
hps : ∀ x ∈ s, p x
⊢ p (a * s.prod)
tactic: have hps : ∀ x, x ∈ s → p x := fun x hxs => p_s x (mem_cons_of_mem hxs)
state_before: case neg
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
inst✝¹ : CommMonoid α
inst✝ : CommMonoid β
s✝ t : Multiset α
a✝ : α
m : Multiset ι
f g : ι → α
p : α → Prop
p_mul : ∀ (a b : α), p a → p b → p (a * b)
a : α
s : Multiset α
hsa : s ≠ ∅ → (∀ a ∈ s, p a) → p s.prod
hs : a ::ₘ s ≠ ∅
p_s : ∀ a_1 ∈ a ::ₘ s, p a_1
hs_empty : ¬s = ∅
hps : ∀ x ∈ s, p x
⊢ p (a * s.prod)
state_after: no goals
tactic: exact p_mul a s.prod (p_s a (mem_cons_self a s)) (hsa hs_empty hps)