Theorem: finprod_prod_comm
File: Mathlib/Algebra/BigOperators/Finprod.lean

tactic: have hU :
  (mulSupport fun a => ∏ b ∈ s, f a b) ⊆
    (s.finite_toSet.biUnion fun b hb => h b (Finset.mem_coe.1 hb)).toFinset := by
  rw [Finite.coe_toFinset]
  intro x hx
  simp only [exists_prop, mem_iUnion, Ne, mem_mulSupport, Finset.mem_coe]
  contrapose! hx
  rw [mem_mulSupport, not_not, Finset.prod_congr rfl hx, Finset.prod_const_one]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
⊢ ∏ᶠ (a : α), ∏ b ∈ s, f a b = ∏ b ∈ s, ∏ᶠ (a : α), f a b
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
⊢ ∏ᶠ (a : α), ∏ b ∈ s, f a b = ∏ b ∈ s, ∏ᶠ (a : α), f a b

tactic: rw [finprod_eq_prod_of_mulSupport_subset _ hU, Finset.prod_comm]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
⊢ ∏ᶠ (a : α), ∏ b ∈ s, f a b = ∏ b ∈ s, ∏ᶠ (a : α), f a b
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
⊢ ∏ y ∈ s, ∏ x ∈ ⋯.toFinset, f x y = ∏ b ∈ s, ∏ᶠ (a : α), f a b

tactic: refine Finset.prod_congr rfl fun b hb => (finprod_eq_prod_of_mulSupport_subset _ ?_).symm
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
⊢ ∏ y ∈ s, ∏ x ∈ ⋯.toFinset, f x y = ∏ b ∈ s, ∏ᶠ (a : α), f a b
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b✝ : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
b : β
hb : b ∈ s
⊢ (mulSupport fun x => f x b) ⊆ ↑⋯.toFinset

tactic: intro a ha
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b✝ : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
b : β
hb : b ∈ s
⊢ (mulSupport fun x => f x b) ⊆ ↑⋯.toFinset
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a✝ b✝ : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
b : β
hb : b ∈ s
a : α
ha : a ∈ mulSupport fun x => f x b
⊢ a ∈ ↑⋯.toFinset

tactic: simp only [Finite.coe_toFinset, mem_iUnion]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a✝ b✝ : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
b : β
hb : b ∈ s
a : α
ha : a ∈ mulSupport fun x => f x b
⊢ a ∈ ↑⋯.toFinset
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a✝ b✝ : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
b : β
hb : b ∈ s
a : α
ha : a ∈ mulSupport fun x => f x b
⊢ ∃ i, ∃ (_ : i ∈ ↑s), a ∈ mulSupport fun a => f a i

tactic: exact ⟨b, hb, ha⟩
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a✝ b✝ : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
hU : (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
b : β
hb : b ∈ s
a : α
ha : a ∈ mulSupport fun x => f x b
⊢ ∃ i, ∃ (_ : i ∈ ↑s), a ∈ mulSupport fun a => f a i
state_after: no goals

tactic: rw [Finite.coe_toFinset]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
⊢ (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ↑⋯.toFinset
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
⊢ (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ⋃ i ∈ ↑s, mulSupport fun a => f a i

tactic: intro x hx
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
⊢ (mulSupport fun a => ∏ b ∈ s, f a b) ⊆ ⋃ i ∈ ↑s, mulSupport fun a => f a i
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
x : α
hx : x ∈ mulSupport fun a => ∏ b ∈ s, f a b
⊢ x ∈ ⋃ i ∈ ↑s, mulSupport fun a => f a i

tactic: simp only [exists_prop, mem_iUnion, Ne, mem_mulSupport, Finset.mem_coe]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
x : α
hx : x ∈ mulSupport fun a => ∏ b ∈ s, f a b
⊢ x ∈ ⋃ i ∈ ↑s, mulSupport fun a => f a i
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
x : α
hx : x ∈ mulSupport fun a => ∏ b ∈ s, f a b
⊢ ∃ i ∈ s, ¬f x i = 1

tactic: contrapose! hx
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
x : α
hx : x ∈ mulSupport fun a => ∏ b ∈ s, f a b
⊢ ∃ i ∈ s, ¬f x i = 1
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
x : α
hx : ∀ i ∈ s, f x i = 1
⊢ x ∉ mulSupport fun a => ∏ b ∈ s, f a b

tactic: rw [mem_mulSupport, not_not, Finset.prod_congr rfl hx, Finset.prod_const_one]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f✝ g : α → M
a b : α
s✝ t : Set α
s : Finset β
f : α → β → M
h : ∀ b ∈ s, (mulSupport fun a => f a b).Finite
x : α
hx : ∀ i ∈ s, f x i = 1
⊢ x ∉ mulSupport fun a => ∏ b ∈ s, f a b
state_after: no goals