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

Proof steps:
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 β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
⊢ ∏ x ∈ s, 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 β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
⊢ ∀ x ∈ image Quotient.mk'' s, ∏ y ∈ filter (fun x_1 => ⟦x_1⟧ = x) s, f y = 1
tactic: rw [prod_partition R, ← Finset.prod_eq_one]
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 β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
⊢ ∀ x ∈ image Quotient.mk'' s, ∏ y ∈ filter (fun x_1 => ⟦x_1⟧ = x) s, f y = 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 β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
xbar : Quotient R
xbar_in_s : xbar ∈ image Quotient.mk'' s
⊢ ∏ y ∈ filter (fun x => ⟦x⟧ = xbar) s, f y = 1
tactic: intro xbar xbar_in_s
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 β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
xbar : Quotient R
xbar_in_s : xbar ∈ image Quotient.mk'' s
⊢ ∏ y ∈ filter (fun x => ⟦x⟧ = xbar) s, f y = 1
state_after: case intro.intro
ι : Type u_1
κ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
s s₁ s₂ : Finset α
a : α
f g : α → β
inst✝¹ : CommMonoid β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
x : α
x_in_s : x ∈ s
xbar_in_s : Quotient.mk'' x ∈ image Quotient.mk'' s
⊢ ∏ y ∈ filter (fun x_1 => ⟦x_1⟧ = Quotient.mk'' x) s, f y = 1
tactic: obtain ⟨x, x_in_s, rfl⟩ := mem_image.mp xbar_in_s
state_before: case intro.intro
ι : Type u_1
κ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
s s₁ s₂ : Finset α
a : α
f g : α → β
inst✝¹ : CommMonoid β
R : Setoid α
inst✝ : DecidableRel Setoid.r
h : ∀ x ∈ s, ∏ a ∈ filter (fun y => y ≈ x) s, f a = 1
x : α
x_in_s : x ∈ s
xbar_in_s : Quotient.mk'' x ∈ image Quotient.mk'' s
⊢ ∏ y ∈ filter (fun x_1 => ⟦x_1⟧ = Quotient.mk'' x) s, f y = 1
state_after: case intro.intro
ι : Type u_1
κ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
s s₁ s₂ : Finset α
a : α
f g : α → β
inst✝¹ : CommMonoid β
R : Setoid α
inst✝ : DecidableRel Setoid.r
x : α
x_in_s : x ∈ s
xbar_in_s : Quotient.mk'' x ∈ image Quotient.mk'' s
h : ∀ x ∈ s, ∏ x ∈ filter (fun y => ⟦y⟧ = ⟦x⟧) s, f x = 1
⊢ ∏ y ∈ filter (fun x_1 => ⟦x_1⟧ = Quotient.mk'' x) s, f y = 1
tactic: simp only [← Quotient.eq] at h
state_before: case intro.intro
ι : Type u_1
κ : Type u_2
α : Type u_3
β : Type u_4
γ : Type u_5
s s₁ s₂ : Finset α
a : α
f g : α → β
inst✝¹ : CommMonoid β
R : Setoid α
inst✝ : DecidableRel Setoid.r
x : α
x_in_s : x ∈ s
xbar_in_s : Quotient.mk'' x ∈ image Quotient.mk'' s
h : ∀ x ∈ s, ∏ x ∈ filter (fun y => ⟦y⟧ = ⟦x⟧) s, f x = 1
⊢ ∏ y ∈ filter (fun x_1 => ⟦x_1⟧ = Quotient.mk'' x) s, f y = 1
state_after: no goals
tactic: exact h x x_in_s