-- Mathlib/Algebra/BigOperators/Group/Finset/Basic.lean
theorem prod_congr_set {α : Type*} [CommMonoid α] {β : Type*} [Fintype β] (s : Set β)
    [DecidablePred (· ∈ s)] (f : β → α) (g : s → α) (w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩)
    (w' : ∀ x : β, x ∉ s → f x = 1) : Finset.univ.prod f = Finset.univ.prod g

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∀ x ∈ univ, x ∉ s.toFinset → f x = 1

Tactic:
rintro x _ h

Result:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
x : β
a✝ : x ∈ univ
h : x ∉ s.toFinset
⊢ f x = 1

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ s.toFinset ⊆ univ

Tactic:
simp

Result:
no goals

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
x : β
a✝ : x ∈ univ
h : x ∉ s.toFinset
⊢ x ∉ s

Tactic:
simpa using h

Result:
no goals

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∏ x ∈ s.toFinset, f x = univ.prod g

Tactic:
rw [Finset.prod_subtype]

Result:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∏ a : Subtype ?m.79931, f ↑a = univ.prod g

case h
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∀ (x : β), x ∈ s.toFinset ↔ ?m.79931 x

α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ β → Prop

α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ Fintype (Subtype ?m.79931)

Proof state:
case h
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∀ (x : β), x ∈ s.toFinset ↔ x ∈ s

Tactic:
simp

Result:
no goals

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ univ.prod f = univ.prod g

Tactic:
rw [← @Finset.prod_subset _ _ s.toFinset Finset.univ f _ (by simp)]

Result:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∏ x ∈ s.toFinset, f x = univ.prod g

α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∀ x ∈ univ, x ∉ s.toFinset → f x = 1

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∏ a : Subtype ?m.79931, f ↑a = univ.prod g

Tactic:
apply Finset.prod_congr rfl

Result:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∀ x ∈ univ, f ↑x = g x

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
x : β
a✝ : x ∈ univ
h : x ∉ s.toFinset
⊢ f x = 1

Tactic:
exact w' x (by simpa using h)

Result:
no goals

Proof state:
α : Type u_6
inst✝² : CommMonoid α
β : Type u_7
inst✝¹ : Fintype β
s : Set β
inst✝ : DecidablePred fun x => x ∈ s
f : β → α
g : ↑s → α
w : ∀ (x : β) (h : x ∈ s), f x = g ⟨x, h⟩
w' : ∀ x ∉ s, f x = 1
⊢ ∀ x ∈ univ, f ↑x = g x

Tactic:
exact fun ⟨x, h⟩ _ => w x h

Result:
no goals