Theorem: Multiset.mul_noncommProd_erase
File: Mathlib/Data/Finset/NoncommProd.lean

Proof steps:
state_before: F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
s : Multiset α
a : α
h : a ∈ s
comm : {x | x ∈ s}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ s.erase a}, ∀ y ∈ {x | x ∈ s.erase a}, x ≠ y → Commute x y) ⋯
⊢ a * (s.erase a).noncommProd comm' = s.noncommProd comm
state_after: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
h : a ∈ ⟦l⟧
comm : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
⊢ a * (erase ⟦l⟧ a).noncommProd comm' = noncommProd ⟦l⟧ comm
tactic: induction' s using Quotient.inductionOn with l
state_before: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
h : a ∈ ⟦l⟧
comm : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
⊢ a * (erase ⟦l⟧ a).noncommProd comm' = noncommProd ⟦l⟧ comm
state_after: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
⊢ a * (l.erase a).prod = l.prod
tactic: simp only [quot_mk_to_coe, mem_coe, coe_erase, noncommProd_coe] at comm h ⊢
state_before: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
⊢ a * (l.erase a).prod = l.prod
state_after: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
⊢ ∀ x ∈ l, ∀ y ∈ l, x * y = y * x
tactic: suffices ∀ x ∈ l, ∀ y ∈ l, x * y = y * x by rw [List.prod_erase_of_comm h this]
state_before: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
⊢ ∀ x ∈ l, ∀ y ∈ l, x * y = y * x
state_after: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
x : α
hx : x ∈ l
y : α
hy : y ∈ l
⊢ x * y = y * x
tactic: intro x hx y hy
state_before: case h
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
x : α
hx : x ∈ l
y : α
hy : y ∈ l
⊢ x * y = y * x
state_after: case h.inl
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
x : α
hx hy : x ∈ l
⊢ x * x = x * x

case h.inr
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
x : α
hx : x ∈ l
y : α
hy : y ∈ l
hxy : x ≠ y
⊢ x * y = y * x
tactic: rcases eq_or_ne x y with rfl | hxy
state_before: case h.inr
F : Type u_1
ι : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
f : α → β → β
op : α → α → α
inst✝³ : Monoid α
inst✝² : Monoid β
inst✝¹ : FunLike F α β
inst✝ : DecidableEq α
a : α
l : List α
comm✝ : {x | x ∈ ⟦l⟧}.Pairwise Commute
comm' : optParam (∀ x ∈ {x | x ∈ erase ⟦l⟧ a}, ∀ y ∈ {x | x ∈ erase ⟦l⟧ a}, x ≠ y → Commute x y) ⋯
comm : {x | x ∈ l}.Pairwise Commute
h : a ∈ l
x : α
hx : x ∈ l
y : α
hy : y ∈ l
hxy : x ≠ y
⊢ x * y = y * x
state_after: no goals
tactic: exact comm hx hy hxy