Theorem: finsum_mem_finset_product'
File: Mathlib/Algebra/BigOperators/Finprod.lean

Proof steps:
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∏ᶠ (ab : α × β) (_ : ab ∈ s), f ab =
    ∏ᶠ (a : α) (b : β) (_ : b ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s)), 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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∏ i ∈ s, f i = ∏ᶠ (a : α) (b : β) (_ : b ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s)), f (a, b)
tactic: rw [finprod_mem_finset_eq_prod]
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∏ i ∈ s, f i = ∏ᶠ (a : α) (b : β) (_ : b ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s)), 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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∏ i ∈ s, f i = ∏ᶠ (a : α), (Finset.filter (fun ab => ab.1 = a) s).prod f
tactic: simp_rw [finprod_mem_finset_eq_prod, this]
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∏ i ∈ s, f i = ∏ᶠ (a : α), (Finset.filter (fun ab => ab.1 = a) s).prod f
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∀ i ∈ s, i.1 ∈ Finset.image Prod.fst s
tactic: rw [finprod_eq_prod_of_mulSupport_subset _
      (s.mulSupport_of_fiberwise_prod_subset_image f Prod.fst),
    ← Finset.prod_fiberwise_of_maps_to (t := Finset.image Prod.fst s) _ f]
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∀ i ∈ s, i.1 ∈ Finset.image Prod.fst s
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∀ i ∈ s, ∃ a ∈ s, a.1 = i.1
tactic: simp only [Finset.mem_image]
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 α
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
s : Finset (α × β)
f : α × β → M
this :
  ∀ (a : α),
    ∏ i ∈ Finset.image Prod.snd (Finset.filter (fun ab => ab.1 = a) s), f (a, i) =
      (Finset.filter (fun x => x.1 = a) s).prod f
⊢ ∀ i ∈ s, ∃ a ∈ s, a.1 = i.1
state_after: no goals
tactic: exact fun x hx => ⟨x, hx, rfl⟩