Theorem: finprod_mul_distrib
File: Mathlib/Algebra/BigOperators/Finprod.lean

tactic: classical
  rw [finprod_eq_prod_of_mulSupport_toFinset_subset _ hf (Finset.subset_union_left _ _),
    finprod_eq_prod_of_mulSupport_toFinset_subset _ hg (Finset.subset_union_right _ _), ←
    Finset.prod_mul_distrib]
  refine' finprod_eq_prod_of_mulSupport_subset _ _
  simp only [Finset.coe_union, Finite.coe_toFinset, mulSupport_subset_iff,
    mem_union, mem_mulSupport]
  intro x
  contrapose!
  rintro ⟨hf,hg⟩
  simp [hf, hg]
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
⊢ (∏ᶠ (i : α), f i * g i) = (∏ᶠ (i : α), f i) * ∏ᶠ (i : α), g i

tactic: rw [finprod_eq_prod_of_mulSupport_toFinset_subset _ hf (Finset.subset_union_left _ _),
  finprod_eq_prod_of_mulSupport_toFinset_subset _ hg (Finset.subset_union_right _ _), ←
  Finset.prod_mul_distrib]
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
⊢ (∏ᶠ (i : α), f i * g i) = (∏ᶠ (i : α), f i) * ∏ᶠ (i : α), g i

tactic: refine' finprod_eq_prod_of_mulSupport_subset _ _
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
⊢ (∏ᶠ (i : α), f i * g i) = ∏ x in Finite.toFinset hf ∪ Finite.toFinset hg, f x * g x

tactic: simp only [Finset.coe_union, Finite.coe_toFinset, mulSupport_subset_iff,
  mem_union, mem_mulSupport]
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
⊢ (mulSupport fun i => f i * g i) ⊆ ↑(Finite.toFinset hf ∪ Finite.toFinset hg)

tactic: intro x
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
⊢ ∀ (x : α), f x * g x ≠ 1 → f x ≠ 1 ∨ g x ≠ 1

tactic: contrapose!
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
x : α
⊢ f x * g x ≠ 1 → f x ≠ 1 ∨ g x ≠ 1

tactic: rintro ⟨hf,hg⟩
state_before: α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : Set.Finite (mulSupport f)
hg : Set.Finite (mulSupport g)
x : α
⊢ f x = 1 ∧ g x = 1 → f x * g x = 1

tactic: simp [hf, hg]
state_before: case intro
α : Type u_1
β : Type ?u.211564
ι : Type ?u.211567
G : Type ?u.211570
M : Type u_2
N : Type ?u.211576
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf✝ : Set.Finite (mulSupport f)
hg✝ : Set.Finite (mulSupport g)
x : α
hf : f x = 1
hg : g x = 1
⊢ f x * g x = 1