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
hdec : 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

tactic: simp (config := { singlePass := true }) only [← Finset.insert_erase (Finset.mem_univ i)]
state_before: M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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.noncommProd Finset.univ (fun j => ↑(ϕ j) (Pi.mulSingle i y j))
      (_ :
        ∀ (x : ι),
          x ∈ ↑Finset.univ →
            ∀ (x_2 : ι),
              x_2 ∈ ↑Finset.univ → x ≠ x_2 → Commute (↑(ϕ x) (Pi.mulSingle i y x)) (↑(ϕ x_2) (Pi.mulSingle i y x_2))) =
    ↑(ϕ 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
hdec : 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.noncommProd (insert i (Finset.erase Finset.univ i)) (fun x => ↑(ϕ x) (Pi.mulSingle i y x))
      (_ :
        ∀ (x : ι),
          x ∈ ↑(insert i (Finset.erase Finset.univ i)) →
            ∀ (y_1 : ι),
              y_1 ∈ ↑(insert i (Finset.erase Finset.univ i)) →
                x ≠ y_1 → (fun a b => Commute (↑(ϕ a) (Pi.mulSingle i y a)) (↑(ϕ b) (Pi.mulSingle i y b))) x y_1) =
    ↑(ϕ i) y

tactic: rw [Pi.mulSingle_eq_same]
state_before: M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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.noncommProd (Finset.erase Finset.univ i) (fun x => ↑(ϕ x) (Pi.mulSingle i y x))
        (_ :
          Set.Pairwise ↑(Finset.erase Finset.univ i) fun a b =>
            Commute (↑(ϕ a) (Pi.mulSingle i y a)) (↑(ϕ b) (Pi.mulSingle i y b))) =
    ↑(ϕ i) y

tactic: rw [Finset.noncommProd_eq_pow_card]
state_before: M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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.noncommProd (Finset.erase Finset.univ i) (fun x => ↑(ϕ x) (Pi.mulSingle i y x))
        (_ :
          Set.Pairwise ↑(Finset.erase Finset.univ i) fun a b =>
            Commute (↑(ϕ a) (Pi.mulSingle i y a)) (↑(ϕ b) (Pi.mulSingle i y b))) =
    ↑(ϕ i) y

tactic: rw [one_pow]
state_before: M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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.card (Finset.erase Finset.univ i) = ↑(ϕ i) y

tactic: exact mul_one _
state_before: M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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: intro j hj
state_before: case h
M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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 : ι), x ∈ Finset.erase Finset.univ i → ↑(ϕ x) (Pi.mulSingle i y x) = 1

tactic: simp only [Finset.mem_erase] at hj
state_before: case h
M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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.erase Finset.univ i
⊢ ↑(ϕ j) (Pi.mulSingle i y j) = 1

tactic: simp [hj]
state_before: case h
M : Type u_1
inst✝² : Monoid M
ι : Type u_2
hdec : 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