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

tactic: classical
  rw [finprod_eq_prod_of_mulSupport_toFinset_subset f hf Finset.subset_union_left,
    finprod_eq_prod_of_mulSupport_toFinset_subset g 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_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ ∏ᶠ (i : α), f i * g i = (∏ᶠ (i : α), f i) * ∏ᶠ (i : α), g i
state_after: no goals

tactic: rw [finprod_eq_prod_of_mulSupport_toFinset_subset f hf Finset.subset_union_left,
  finprod_eq_prod_of_mulSupport_toFinset_subset g hg Finset.subset_union_right, ←
  Finset.prod_mul_distrib]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ ∏ᶠ (i : α), f i * g i = (∏ᶠ (i : α), f i) * ∏ᶠ (i : α), g i
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ ∏ᶠ (i : α), f i * g i = ∏ x ∈ hf.toFinset ∪ hg.toFinset, f x * g x

tactic: refine finprod_eq_prod_of_mulSupport_subset _ ?_
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ ∏ᶠ (i : α), f i * g i = ∏ x ∈ hf.toFinset ∪ hg.toFinset, f x * g x
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ (mulSupport fun i => f i * g i) ⊆ ↑(hf.toFinset ∪ hg.toFinset)

tactic: simp only [Finset.coe_union, Finite.coe_toFinset, mulSupport_subset_iff,
  mem_union, mem_mulSupport]
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ (mulSupport fun i => f i * g i) ⊆ ↑(hf.toFinset ∪ hg.toFinset)
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ ∀ (x : α), f x * g x ≠ 1 → f x ≠ 1 ∨ g x ≠ 1

tactic: intro x
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
⊢ ∀ (x : α), f x * g x ≠ 1 → f x ≠ 1 ∨ g x ≠ 1
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
x : α
⊢ f x * g x ≠ 1 → f x ≠ 1 ∨ g x ≠ 1

tactic: contrapose!
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
x : α
⊢ f x * g x ≠ 1 → f x ≠ 1 ∨ g x ≠ 1
state_after: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
x : α
⊢ f x = 1 ∧ g x = 1 → f x * g x = 1

tactic: rintro ⟨hf, hg⟩
state_before: α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf : (mulSupport f).Finite
hg : (mulSupport g).Finite
x : α
⊢ f x = 1 ∧ g x = 1 → f x * g x = 1
state_after: case intro
α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf✝ : (mulSupport f).Finite
hg✝ : (mulSupport g).Finite
x : α
hf : f x = 1
hg : g x = 1
⊢ f x * g x = 1

tactic: simp [hf, hg]
state_before: case intro
α : Type u_1
β : Type u_2
ι : Type u_3
G : Type u_4
M : Type u_5
N : Type u_6
inst✝¹ : CommMonoid M
inst✝ : CommMonoid N
f g : α → M
a b : α
s t : Set α
hf✝ : (mulSupport f).Finite
hg✝ : (mulSupport g).Finite
x : α
hf : f x = 1
hg : g x = 1
⊢ f x * g x = 1
state_after: no goals