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

tactic: ext i
state_before: F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
⊢ noncommProd univ (fun i => Pi.mulSingle i (x i))
      (_ :
        ∀ (i : ι), i ∈ ↑univ → ∀ (j : ι), j ∈ ↑univ → i ≠ j → Commute (Pi.mulSingle i (x i)) (Pi.mulSingle j (x j))) =
    x

tactic: apply (univ.noncommProd_map (fun i => MonoidHom.single M i (x i)) _ (Pi.evalMonoidHom M i)).trans
state_before: case h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd univ (fun i => Pi.mulSingle i (x i))
      (_ : ∀ (i : ι), i ∈ ↑univ → ∀ (j : ι), j ∈ ↑univ → i ≠ j → Commute (Pi.mulSingle i (x i)) (Pi.mulSingle j (x j)))
      i =
    x i

tactic: refine' (noncommProd_congr (insert_erase (mem_univ i)).symm _ _).trans _
state_before: case h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd univ (fun i_1 => ↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M i_1) (x i_1)))
      (_ :
        ∀ (x_1 : ι),
          x_1 ∈ ↑univ →
            ∀ (y : ι),
              y ∈ ↑univ →
                x_1 ≠ y →
                  Commute (↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M x_1) (x x_1)))
                    (↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M y) (x y)))) =
    x i

F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Set.Pairwise ↑univ fun a b =>
    Commute ((fun i => ↑(MonoidHom.single M i) (x i)) a) ((fun i => ↑(MonoidHom.single M i) (x i)) b)

tactic: . intro i _ j _ _
  exact Pi.mulSingle_apply_commute x i j
state_before: case h.refine'_1
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Set.Pairwise ↑univ fun a b =>
    Commute ((fun i => ↑(MonoidHom.single M i) (x i)) a) ((fun i => ↑(MonoidHom.single M i) (x i)) b)

case h.refine'_2
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ι → (fun x => M i) (noncommProd univ (fun i => ↑(MonoidHom.single M i) (x i)) ?h.refine'_1)

case h.refine'_3
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι),
    x_1 ∈ insert i (erase univ i) → ↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M x_1) (x x_1)) = ?h.refine'_2 x_1

case h.refine'_4
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd (insert i (erase univ i)) ?h.refine'_2
      (_ :
        ∀ (x_1 : ι),
          x_1 ∈ ↑(insert i (erase univ i)) →
            ∀ (y : ι),
              y ∈ ↑(insert i (erase univ i)) → x_1 ≠ y → (fun a b => Commute (?h.refine'_2 a) (?h.refine'_2 b)) x_1 y) =
    x i

case h.refine'_1
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Set.Pairwise ↑univ fun a b =>
    Commute ((fun i => ↑(MonoidHom.single M i) (x i)) a) ((fun i => ↑(MonoidHom.single M i) (x i)) b)

tactic: . intro j
  exact Pi.mulSingle j (x j) i
state_before: case h.refine'_2
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ι →
    (fun x => M i)
      (noncommProd univ (fun i => ↑(MonoidHom.single M i) (x i))
        (_ :
          ∀ ⦃i : ι⦄, i ∈ ↑univ → ∀ ⦃j : ι⦄, j ∈ ↑univ → i ≠ j → Commute (Pi.mulSingle i (x i)) (Pi.mulSingle j (x j))))

case h.refine'_3
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι),
    x_1 ∈ insert i (erase univ i) → ↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M x_1) (x x_1)) = ?h.refine'_2 x_1

case h.refine'_4
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd (insert i (erase univ i)) ?h.refine'_2
      (_ :
        ∀ (x_1 : ι),
          x_1 ∈ ↑(insert i (erase univ i)) →
            ∀ (y : ι),
              y ∈ ↑(insert i (erase univ i)) → x_1 ≠ y → (fun a b => Commute (?h.refine'_2 a) (?h.refine'_2 b)) x_1 y) =
    x i

tactic: . intro j _; dsimp
state_before: case h.refine'_3
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι),
    x_1 ∈ insert i (erase univ i) →
      ↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M x_1) (x x_1)) = Pi.mulSingle x_1 (x x_1) i

case h.refine'_4
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd (insert i (erase univ i)) (fun j => Pi.mulSingle j (x j) i)
      (_ :
        ∀ (x_1 : ι),
          x_1 ∈ ↑(insert i (erase univ i)) →
            ∀ (y : ι),
              y ∈ ↑(insert i (erase univ i)) →
                x_1 ≠ y → (fun a b => Commute (Pi.mulSingle a (x a) i) (Pi.mulSingle b (x b) i)) x_1 y) =
    x i

tactic: . rw [noncommProd_insert_of_not_mem _ _ _ _ (not_mem_erase _ _),
    noncommProd_eq_pow_card (univ.erase i), one_pow, mul_one]
  simp
  . intro j hj
    simp at hj
    simp [Pi.mulSingle, Function.update]
    intro h
    simp [*] at *
state_before: case h.refine'_4
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd (insert i (erase univ i)) (fun j => Pi.mulSingle j (x j) i)
      (_ :
        ∀ (x_1 : ι),
          x_1 ∈ ↑(insert i (erase univ i)) →
            ∀ (y : ι),
              y ∈ ↑(insert i (erase univ i)) →
                x_1 ≠ y → (fun a b => Commute (Pi.mulSingle a (x a) i) (Pi.mulSingle b (x b) i)) x_1 y) =
    x i

tactic: intro i _ j _ _
state_before: case h.refine'_1
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Set.Pairwise ↑univ fun a b =>
    Commute ((fun i => ↑(MonoidHom.single M i) (x i)) a) ((fun i => ↑(MonoidHom.single M i) (x i)) b)

tactic: exact Pi.mulSingle_apply_commute x i j
state_before: case h.refine'_1
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
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.single M i) (x i)) i) ((fun i => ↑(MonoidHom.single M i) (x i)) j)

tactic: intro j
state_before: case h.refine'_2
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ι →
    (fun x => M i)
      (noncommProd univ (fun i => ↑(MonoidHom.single M i) (x i))
        (_ :
          ∀ ⦃i : ι⦄, i ∈ ↑univ → ∀ ⦃j : ι⦄, j ∈ ↑univ → i ≠ j → Commute (Pi.mulSingle i (x i)) (Pi.mulSingle j (x j))))

tactic: exact Pi.mulSingle j (x j) i
state_before: case h.refine'_2
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
⊢ (fun x => M i)
    (noncommProd univ (fun i => ↑(MonoidHom.single M i) (x i))
      (_ : ∀ ⦃i : ι⦄, i ∈ ↑univ → ∀ ⦃j : ι⦄, j ∈ ↑univ → i ≠ j → Commute (Pi.mulSingle i (x i)) (Pi.mulSingle j (x j))))

tactic: intro j _
state_before: case h.refine'_3
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι),
    x_1 ∈ insert i (erase univ i) →
      ↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M x_1) (x x_1)) = Pi.mulSingle x_1 (x x_1) i

tactic: dsimp
state_before: case h.refine'_3
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
a✝ : j ∈ insert i (erase univ i)
⊢ ↑(Pi.evalMonoidHom M i) (↑(MonoidHom.single M j) (x j)) = Pi.mulSingle j (x j) i

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.refine'_4
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ noncommProd (insert i (erase univ i)) (fun j => Pi.mulSingle j (x j) i)
      (_ :
        ∀ (x_1 : ι),
          x_1 ∈ ↑(insert i (erase univ i)) →
            ∀ (y : ι),
              y ∈ ↑(insert i (erase univ i)) →
                x_1 ≠ y → (fun a b => Commute (Pi.mulSingle a (x a) i) (Pi.mulSingle b (x b) i)) x_1 y) =
    x i

tactic: simp
state_before: case h.refine'_4
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ Pi.mulSingle i (x i) i = x i

case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι), x_1 ∈ erase univ i → Pi.mulSingle x_1 (x x_1) i = 1

tactic: . intro j hj
  simp at hj
  simp [Pi.mulSingle, Function.update]
  intro h
  simp [*] at *
state_before: case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι), x_1 ∈ erase univ i → Pi.mulSingle x_1 (x x_1) i = 1

tactic: intro j hj
state_before: case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i : ι
⊢ ∀ (x_1 : ι), x_1 ∈ erase univ i → Pi.mulSingle x_1 (x x_1) i = 1

tactic: simp at hj
state_before: case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : j ∈ erase univ i
⊢ Pi.mulSingle j (x j) i = 1

tactic: simp [Pi.mulSingle, Function.update]
state_before: case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
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: intro h
state_before: case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
⊢ ∀ (h : i = j), (_ : j = i) ▸ x j = 1

tactic: simp [*] at *
state_before: case h.refine'_4.h
F : Type ?u.225850
ι : Type u_1
α : Type ?u.225856
β : Type ?u.225859
γ : Type ?u.225862
f : α → β → β
op : α → α → α
inst✝⁴ : Monoid β
inst✝³ : Monoid γ
M : ι → Type u_2
inst✝² : (i : ι) → Monoid (M i)
inst✝¹ : Fintype ι
inst✝ : DecidableEq ι
x : (i : ι) → M i
i j : ι
hj : ¬j = i
h : i = j
⊢ (_ : j = i) ▸ x j = 1