Theorem: MonoidHom.noncommPiCoprod_mulSingle
File: Mathlib/GroupTheory/NoncommPiCoprod.lean

tactic: change Finset.univ.noncommProd (fun j => ϕ j (Pi.mulSingle i y j)) (fun _ _ _ _ h => hcomm h _ _)
  = ϕ i y
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (noncommPiCoprod ϕ hcomm) (Pi.mulSingle i y) = (ϕ i) y
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ Finset.univ.noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y

tactic: rw [← Finset.insert_erase (Finset.mem_univ i)]
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ Finset.univ.noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (insert i (Finset.univ.erase i)).noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y

tactic: rw [Finset.noncommProd_insert_of_not_mem _ _ _ _ (Finset.not_mem_erase i _)]
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (insert i (Finset.univ.erase i)).noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) (Pi.mulSingle i y i) * (Finset.univ.erase i).noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y

tactic: rw [Pi.mulSingle_eq_same]
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) (Pi.mulSingle i y i) * (Finset.univ.erase i).noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) y * (Finset.univ.erase i).noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y

tactic: rw [Finset.noncommProd_eq_pow_card]
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) y * (Finset.univ.erase i).noncommProd (fun j => (ϕ j) (Pi.mulSingle i y j)) ⋯ = (ϕ i) y
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) y * ?m ^ (Finset.univ.erase i).card = (ϕ i) y

case m
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ M

case h
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ ∀ x ∈ Finset.univ.erase i, (ϕ x) (Pi.mulSingle i y x) = ?m

tactic: rw [one_pow]
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) y * ?m ^ (Finset.univ.erase i).card = (ϕ i) y
state_after: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) y * 1 = (ϕ i) y

tactic: exact mul_one _
state_before: M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ (ϕ i) y * 1 = (ϕ i) y
state_after: no goals

tactic: intro j hj
state_before: case h
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
⊢ ∀ x ∈ Finset.univ.erase i, (ϕ x) (Pi.mulSingle i y x) = 1
state_after: case h
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
j : ι
hj : j ∈ Finset.univ.erase i
⊢ (ϕ j) (Pi.mulSingle i y j) = 1

tactic: simp only [Finset.mem_erase] at hj
state_before: case h
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
j : ι
hj : j ∈ Finset.univ.erase i
⊢ (ϕ j) (Pi.mulSingle i y j) = 1
state_after: case h
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
j : ι
hj : j ≠ i ∧ j ∈ Finset.univ
⊢ (ϕ j) (Pi.mulSingle i y j) = 1

tactic: simp [hj]
state_before: case h
M : Type u_1
inst✝³ : Monoid M
ι : Type u_2
inst✝² : DecidableEq ι
inst✝¹ : Fintype ι
N : ι → Type u_3
inst✝ : (i : ι) → Monoid (N i)
ϕ : (i : ι) → N i →* M
hcomm : Pairwise fun i j => ∀ (x : N i) (y : N j), Commute ((ϕ i) x) ((ϕ j) y)
f g : (i : ι) → N i
i : ι
y : N i
j : ι
hj : j ≠ i ∧ j ∈ Finset.univ
⊢ (ϕ j) (Pi.mulSingle i y j) = 1
state_after: no goals