Theorem: Finset.prod_congr_set
File: Mathlib/Algebra/BigOperators/Group/Finset.lean

tactic: rw [← @Finset.prod_subset _ _ s.toFinset Finset.univ f _ (by simp)]
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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: simp
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: no goals

tactic: rw [Finset.prod_subtype]
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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.179130, f ↑a = univ.prod g

case h
ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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.179130 x

ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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.179130)

tactic: apply Finset.prod_congr rfl
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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.179130, f ↑a = univ.prod g
state_after: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: no goals

tactic: simp
state_before: case h
ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: no goals

tactic: rintro x _ h
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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)
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: no goals

tactic: simpa using h
state_before: ι : Type u_1
κ : Type u_2
α✝ : Type u_3
β✝ : Type u_4
γ : Type u_5
s✝ s₁ s₂ : Finset α✝
a : α✝
f✝ g✝ : α✝ → β✝
inst✝³ : CommMonoid β✝
α : 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
state_after: no goals