Theorem: Finset.prod_eq_mul_of_mem
File: Mathlib/Algebra/BigOperators/Basic.lean

tactic: haveI := Classical.decEq α
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
⊢ ∏ x in s, f x = f a * f b

tactic: let s' := ({a, b} : Finset α)
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
⊢ ∏ x in s, f x = f a * f b

tactic: have hu : s' ⊆ s := by
  refine' insert_subset.mpr _
  apply And.intro ha
  apply singleton_subset_iff.mpr hb
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
⊢ ∏ x in s, f x = f a * f b

tactic: have hf : ∀ c ∈ s, c ∉ s' → f c = 1 := by
  intro c hc hcs
  apply h₀ c hc
  apply not_or.mp
  intro hab
  apply hcs
  apply mem_insert.mpr
  rw [mem_singleton]
  exact hab
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
⊢ ∏ x in s, f x = f a * f b

tactic: rw [← prod_subset hu hf]
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
hf : ∀ (c : α), c ∈ s → ¬c ∈ s' → f c = 1
⊢ ∏ x in s, f x = f a * f b

tactic: exact Finset.prod_pair hn
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
hf : ∀ (c : α), c ∈ s → ¬c ∈ s' → f c = 1
⊢ ∏ x in s', f x = f a * f b

tactic: refine' insert_subset.mpr _
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
⊢ s' ⊆ s

tactic: apply And.intro ha
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
⊢ a ∈ s ∧ {b} ⊆ s

tactic: apply singleton_subset_iff.mpr hb
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
⊢ {b} ⊆ s

tactic: intro c hc hcs
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
⊢ ∀ (c : α), c ∈ s → ¬c ∈ s' → f c = 1

tactic: apply h₀ c hc
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
⊢ f c = 1

tactic: apply not_or.mp
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
⊢ c ≠ a ∧ c ≠ b

tactic: intro hab
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
⊢ ¬(c = a ∨ c = b)

tactic: apply hcs
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
hab : c = a ∨ c = b
⊢ False

tactic: apply mem_insert.mpr
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
hab : c = a ∨ c = b
⊢ c ∈ s'

tactic: rw [mem_singleton]
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
hab : c = a ∨ c = b
⊢ c = a ∨ c ∈ {b}

tactic: exact hab
state_before: ι : Type ?u.373499
β : Type u
α : Type v
γ : Type w
s✝ s₁ s₂ : Finset α
a✝ : α
f✝ g : α → β
inst✝ : CommMonoid β
s : Finset α
f : α → β
a b : α
ha : a ∈ s
hb : b ∈ s
hn : a ≠ b
h₀ : ∀ (c : α), c ∈ s → c ≠ a ∧ c ≠ b → f c = 1
this : DecidableEq α
s' : Finset α := {a, b}
hu : s' ⊆ s
c : α
hc : c ∈ s
hcs : ¬c ∈ s'
hab : c = a ∨ c = b
⊢ c = a ∨ c = b