Theorem: Finset.noncommProd_union_of_disjoint
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 β γ
inst✝ : DecidableEq α
s t : Finset α
h : Disjoint s t
f : α → β
comm : {x | x ∈ s ∪ t}.Pairwise fun a b => Commute (f a) (f b)
⊢ (s ∪ t).noncommProd f comm = s.noncommProd f ⋯ * t.noncommProd f ⋯
state_after: case intro.intro
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 β γ
inst✝ : DecidableEq α
t : Finset α
f : α → β
sl : List α
sl' : sl.Nodup
h : Disjoint sl.toFinset t
comm : {x | x ∈ sl.toFinset ∪ t}.Pairwise fun a b => Commute (f a) (f b)
⊢ (sl.toFinset ∪ t).noncommProd f comm = sl.toFinset.noncommProd f ⋯ * t.noncommProd f ⋯
tactic: obtain ⟨sl, sl', rfl⟩ := exists_list_nodup_eq s
state_before: case intro.intro
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 β γ
inst✝ : DecidableEq α
t : Finset α
f : α → β
sl : List α
sl' : sl.Nodup
h : Disjoint sl.toFinset t
comm : {x | x ∈ sl.toFinset ∪ t}.Pairwise fun a b => Commute (f a) (f b)
⊢ (sl.toFinset ∪ t).noncommProd f comm = sl.toFinset.noncommProd f ⋯ * t.noncommProd f ⋯
state_after: case intro.intro.intro.intro
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 β γ
inst✝ : DecidableEq α
f : α → β
sl : List α
sl' : sl.Nodup
tl : List α
tl' : tl.Nodup
h : Disjoint sl.toFinset tl.toFinset
comm : {x | x ∈ sl.toFinset ∪ tl.toFinset}.Pairwise fun a b => Commute (f a) (f b)
⊢ (sl.toFinset ∪ tl.toFinset).noncommProd f comm = sl.toFinset.noncommProd f ⋯ * tl.toFinset.noncommProd f ⋯
tactic: obtain ⟨tl, tl', rfl⟩ := exists_list_nodup_eq t
state_before: case intro.intro.intro.intro
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 β γ
inst✝ : DecidableEq α
f : α → β
sl : List α
sl' : sl.Nodup
tl : List α
tl' : tl.Nodup
h : Disjoint sl.toFinset tl.toFinset
comm : {x | x ∈ sl.toFinset ∪ tl.toFinset}.Pairwise fun a b => Commute (f a) (f b)
⊢ (sl.toFinset ∪ tl.toFinset).noncommProd f comm = sl.toFinset.noncommProd f ⋯ * tl.toFinset.noncommProd f ⋯
state_after: case intro.intro.intro.intro
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 β γ
inst✝ : DecidableEq α
f : α → β
sl : List α
sl' : sl.Nodup
tl : List α
tl' : tl.Nodup
h : sl.Disjoint tl
comm : {x | x ∈ sl.toFinset ∪ tl.toFinset}.Pairwise fun a b => Commute (f a) (f b)
⊢ (sl.toFinset ∪ tl.toFinset).noncommProd f comm = sl.toFinset.noncommProd f ⋯ * tl.toFinset.noncommProd f ⋯
tactic: rw [List.disjoint_toFinset_iff_disjoint] at h
state_before: case intro.intro.intro.intro
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 β γ
inst✝ : DecidableEq α
f : α → β
sl : List α
sl' : sl.Nodup
tl : List α
tl' : tl.Nodup
h : sl.Disjoint tl
comm : {x | x ∈ sl.toFinset ∪ tl.toFinset}.Pairwise fun a b => Commute (f a) (f b)
⊢ (sl.toFinset ∪ tl.toFinset).noncommProd f comm = sl.toFinset.noncommProd f ⋯ * tl.toFinset.noncommProd f ⋯
state_after: no goals
tactic: calc noncommProd (List.toFinset sl ∪ List.toFinset tl) f comm
     = noncommProd ⟨↑(sl ++ tl), Multiset.coe_nodup.2 (sl'.append tl' h)⟩ f
         (by convert comm; simp [Set.ext_iff]) := noncommProd_congr (by ext; simp) (by simp) _
   _ = noncommProd (List.toFinset sl) f (comm.mono <| coe_subset.2 subset_union_left) *
         noncommProd (List.toFinset tl) f (comm.mono <| coe_subset.2 subset_union_right) := by
    simp [noncommProd, List.dedup_eq_self.2 sl', List.dedup_eq_self.2 tl', h]