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

tactic: obtain ⟨sl, sl', rfl⟩ := exists_list_nodup_eq s
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 ⟨tl, tl', rfl⟩ := exists_list_nodup_eq t
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: 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 : 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: 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]
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: convert 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 β γ
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)
⊢ (↑{ val := ↑(sl ++ tl), nodup := ⋯ }).Pairwise fun a b => Commute (f a) (f b)
state_after: case h.e'_2
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)
⊢ ↑{ val := ↑(sl ++ tl), nodup := ⋯ } = {x | x ∈ sl.toFinset ∪ tl.toFinset}

tactic: simp [Set.ext_iff]
state_before: case h.e'_2
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)
⊢ ↑{ val := ↑(sl ++ tl), nodup := ⋯ } = {x | x ∈ sl.toFinset ∪ tl.toFinset}
state_after: no goals

tactic: ext
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 α
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 = { val := ↑(sl ++ tl), nodup := ⋯ }
state_after: case a
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)
a✝ : α
⊢ a✝ ∈ sl.toFinset ∪ tl.toFinset ↔ a✝ ∈ { val := ↑(sl ++ tl), nodup := ⋯ }

tactic: simp
state_before: case a
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)
a✝ : α
⊢ a✝ ∈ sl.toFinset ∪ tl.toFinset ↔ a✝ ∈ { val := ↑(sl ++ tl), nodup := ⋯ }
state_after: no goals

tactic: simp
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 α
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)
⊢ ∀ x ∈ { val := ↑(sl ++ tl), nodup := ⋯ }, f x = f x
state_after: no goals

tactic: simp [noncommProd, List.dedup_eq_self.2 sl', List.dedup_eq_self.2 tl', h]
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 α
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)
⊢ { val := ↑(sl ++ tl), nodup := ⋯ }.noncommProd f ⋯ = sl.toFinset.noncommProd f ⋯ * tl.toFinset.noncommProd f ⋯
state_after: no goals