Theorem: Finset.noncommProd_mul_distrib
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 β γ
s : Finset α
f g : α → β
comm_ff : (↑s).Pairwise fun x y => Commute (f x) (f y)
comm_gg : (↑s).Pairwise fun x y => Commute (g x) (g y)
comm_gf : (↑s).Pairwise fun x y => Commute (g x) (f y)
⊢ s.noncommProd (f * g) ⋯ = s.noncommProd f comm_ff * s.noncommProd g comm_gg
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 β γ
f g : α → β
comm_ff : (↑∅).Pairwise fun x y => Commute (f x) (f y)
comm_gg : (↑∅).Pairwise fun x y => Commute (g x) (g y)
comm_gf : (↑∅).Pairwise fun x y => Commute (g x) (f y)
⊢ ∅.noncommProd (f * g) ⋯ = ∅.noncommProd f comm_ff * ∅.noncommProd g comm_gg

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 β γ
f g : α → β
x : α
s : Finset α
hnmem : x ∉ s
ih :
  ∀ (comm_ff : (↑s).Pairwise fun x y => Commute (f x) (f y)) (comm_gg : (↑s).Pairwise fun x y => Commute (g x) (g y))
    (comm_gf : (↑s).Pairwise fun x y => Commute (g x) (f y)),
    s.noncommProd (f * g) ⋯ = s.noncommProd f comm_ff * s.noncommProd g comm_gg
comm_ff : (↑(cons x s hnmem)).Pairwise fun x y => Commute (f x) (f y)
comm_gg : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (g y)
comm_gf : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (f y)
⊢ (cons x s hnmem).noncommProd (f * g) ⋯ =
    (cons x s hnmem).noncommProd f comm_ff * (cons x s hnmem).noncommProd g comm_gg
tactic: induction' s using Finset.cons_induction_on with x s hnmem ih
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 β γ
f g : α → β
x : α
s : Finset α
hnmem : x ∉ s
ih :
  ∀ (comm_ff : (↑s).Pairwise fun x y => Commute (f x) (f y)) (comm_gg : (↑s).Pairwise fun x y => Commute (g x) (g y))
    (comm_gf : (↑s).Pairwise fun x y => Commute (g x) (f y)),
    s.noncommProd (f * g) ⋯ = s.noncommProd f comm_ff * s.noncommProd g comm_gg
comm_ff : (↑(cons x s hnmem)).Pairwise fun x y => Commute (f x) (f y)
comm_gg : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (g y)
comm_gf : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (f y)
⊢ (cons x s hnmem).noncommProd (f * g) ⋯ =
    (cons x s hnmem).noncommProd f comm_ff * (cons x s hnmem).noncommProd g comm_gg
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 β γ
f g : α → β
x : α
s : Finset α
hnmem : x ∉ s
ih :
  ∀ (comm_ff : (↑s).Pairwise fun x y => Commute (f x) (f y)) (comm_gg : (↑s).Pairwise fun x y => Commute (g x) (g y))
    (comm_gf : (↑s).Pairwise fun x y => Commute (g x) (f y)),
    s.noncommProd (f * g) ⋯ = s.noncommProd f comm_ff * s.noncommProd g comm_gg
comm_ff : (↑(cons x s hnmem)).Pairwise fun x y => Commute (f x) (f y)
comm_gg : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (g y)
comm_gf : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (f y)
y : α
hy : y ∈ s
⊢ Commute (g x) (f y)
tactic: rw [Finset.noncommProd_cons, Finset.noncommProd_cons, Finset.noncommProd_cons, Pi.mul_apply,
    ih (comm_ff.mono fun _ => mem_cons_of_mem) (comm_gg.mono fun _ => mem_cons_of_mem)
      (comm_gf.mono fun _ => mem_cons_of_mem),
    (noncommProd_commute _ _ _ _ fun y hy => ?_).mul_mul_mul_comm]
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 β γ
f g : α → β
x : α
s : Finset α
hnmem : x ∉ s
ih :
  ∀ (comm_ff : (↑s).Pairwise fun x y => Commute (f x) (f y)) (comm_gg : (↑s).Pairwise fun x y => Commute (g x) (g y))
    (comm_gf : (↑s).Pairwise fun x y => Commute (g x) (f y)),
    s.noncommProd (f * g) ⋯ = s.noncommProd f comm_ff * s.noncommProd g comm_gg
comm_ff : (↑(cons x s hnmem)).Pairwise fun x y => Commute (f x) (f y)
comm_gg : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (g y)
comm_gf : (↑(cons x s hnmem)).Pairwise fun x y => Commute (g x) (f y)
y : α
hy : y ∈ s
⊢ Commute (g x) (f y)
state_after: no goals
tactic: exact comm_gf (mem_cons_self x s) (mem_cons_of_mem hy) (ne_of_mem_of_not_mem hy hnmem).symm