Theorem: Finset.noncommProd_mul_single
File: Mathlib/Data/Finset/NoncommProd.lean

tactic: ext i
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
⊢ univ.noncommProd (fun i => Pi.mulSingle i (x i)) ⋯ = 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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ univ.noncommProd (fun i => Pi.mulSingle i (x i)) ⋯ i = x i

tactic: apply (univ.noncommProd_map (fun i ↦ MonoidHom.mulSingle M i (x i)) ?a
  (Pi.evalMonoidHom M i)).trans
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ univ.noncommProd (fun i => Pi.mulSingle i (x i)) ⋯ i = x i
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ univ.noncommProd (fun i_1 => (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M i_1) (x i_1))) ⋯ = x i

case a
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ (↑univ).Pairwise fun a b =>
    Commute ((fun i => (MonoidHom.mulSingle M i) (x i)) a) ((fun i => (MonoidHom.mulSingle M i) (x i)) b)

tactic: case a =>
  intro i _ j _ _
  exact Pi.mulSingle_apply_commute x i j
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ univ.noncommProd (fun i_1 => (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M i_1) (x i_1))) ⋯ = x i

case a
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ (↑univ).Pairwise fun a b =>
    Commute ((fun i => (MonoidHom.mulSingle M i) (x i)) a) ((fun i => (MonoidHom.mulSingle M i) (x i)) b)
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ univ.noncommProd (fun i_1 => (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M i_1) (x i_1))) ⋯ = x i

tactic: convert (noncommProd_congr (insert_erase (mem_univ i)).symm _ _).trans _
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ univ.noncommProd (fun i_1 => (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M i_1) (x i_1))) ⋯ = x i
state_after: case h.convert_3
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ι → M i

case h.convert_4
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ x_1 ∈ insert i (univ.erase i), (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M x_1) (x x_1)) = ?h.convert_3 x_1

case h.convert_8
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ (insert i (univ.erase i)).noncommProd ?h.convert_3 ⋯ = x i

tactic: intro i _ j _ _
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ (↑univ).Pairwise fun a b =>
    Commute ((fun i => (MonoidHom.mulSingle M i) (x i)) a) ((fun i => (MonoidHom.mulSingle M i) (x i)) b)
state_after: 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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i✝ i : ι
a✝² : i ∈ ↑univ
j : ι
a✝¹ : j ∈ ↑univ
a✝ : i ≠ j
⊢ Commute ((fun i => (MonoidHom.mulSingle M i) (x i)) i) ((fun i => (MonoidHom.mulSingle M i) (x i)) j)

tactic: exact Pi.mulSingle_apply_commute x i j
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i✝ i : ι
a✝² : i ∈ ↑univ
j : ι
a✝¹ : j ∈ ↑univ
a✝ : i ≠ j
⊢ Commute ((fun i => (MonoidHom.mulSingle M i) (x i)) i) ((fun i => (MonoidHom.mulSingle M i) (x i)) j)
state_after: no goals

tactic: intro j
state_before: case h.convert_3
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ι → M i
state_after: case h.convert_3
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
⊢ M i

tactic: exact Pi.mulSingle j (x j) i
state_before: case h.convert_3
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
⊢ M i
state_after: no goals

tactic: intro j _
state_before: case h.convert_4
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ x_1 ∈ insert i (univ.erase i),
    (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M x_1) (x x_1)) = Pi.mulSingle x_1 (x x_1) i
state_after: case h.convert_4
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
a✝ : j ∈ insert i (univ.erase i)
⊢ (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M j) (x j)) = Pi.mulSingle j (x j) i

tactic: dsimp
state_before: case h.convert_4
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
a✝ : j ∈ insert i (univ.erase i)
⊢ (Pi.evalMonoidHom M i) ((MonoidHom.mulSingle M j) (x j)) = Pi.mulSingle j (x j) i
state_after: no goals

tactic: rw [noncommProd_insert_of_not_mem _ _ _ _ (not_mem_erase _ _),
  noncommProd_eq_pow_card (univ.erase i), one_pow, mul_one]
state_before: case h.convert_8
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ (insert i (univ.erase i)).noncommProd (fun j => Pi.mulSingle j (x j) i) ⋯ = x i
state_after: case h.convert_8
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Pi.mulSingle i (x i) i = x i

case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ x_1 ∈ univ.erase i, Pi.mulSingle x_1 (x x_1) i = 1

tactic: simp only [MonoidHom.mulSingle_apply, ne_eq, Pi.mulSingle_eq_same]
state_before: case h.convert_8
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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Pi.mulSingle i (x i) i = x i
state_after: no goals

tactic: intro j hj
state_before: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ x_1 ∈ univ.erase i, Pi.mulSingle x_1 (x x_1) i = 1
state_after: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : j ∈ univ.erase i
⊢ Pi.mulSingle j (x j) i = 1

tactic: simp? at hj says simp only [mem_erase, ne_eq, mem_univ, and_true] at hj
state_before: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : j ∈ univ.erase i
⊢ Pi.mulSingle j (x j) i = 1
state_after: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
⊢ Pi.mulSingle j (x j) i = 1

tactic: simp only [MonoidHom.mulSingle_apply, Pi.mulSingle, Function.update, Eq.ndrec, Pi.one_apply,
  ne_eq, dite_eq_right_iff]
state_before: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
⊢ Pi.mulSingle j (x j) i = 1
state_after: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
⊢ ∀ (h : i = j), ⋯ ▸ x j = 1

tactic: intro h
state_before: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
⊢ ∀ (h : i = j), ⋯ ▸ x j = 1
state_after: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
h : i = j
⊢ ⋯ ▸ x j = 1

tactic: simp [*] at *
state_before: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
h : i = j
⊢ ⋯ ▸ x j = 1
state_after: no goals

tactic: simp only [mem_erase, ne_eq, mem_univ, and_true] at hj
state_before: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : j ∈ univ.erase i
⊢ Pi.mulSingle j (x j) i = 1
state_after: case h.convert_8.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 β γ
M : ι → Type u_6
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
⊢ Pi.mulSingle j (x j) i = 1