Theorem: Set.mem_finset_prod
File: Mathlib/Data/Set/Pointwise/BigOperators.lean

tactic: induction' t using Finset.induction_on with i is hi ih generalizing a
state_before: ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
t : Finset ι
f : ι → Set α
a : α
⊢ a ∈ ∏ i in t, f i ↔ ∃ g x, ∏ i in t, g i = a

tactic: rw [Finset.prod_insert hi, Set.mem_mul]
state_before: case insert
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
a : α
⊢ a ∈ ∏ i in insert i is, f i ↔ ∃ g x, ∏ i in insert i is, g i = a

tactic: simp_rw [Finset.prod_insert hi]
state_before: case insert
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
a : α
⊢ (∃ x y, x ∈ f i ∧ y ∈ ∏ x in is, f x ∧ x * y = a) ↔ ∃ g x, ∏ i in insert i is, g i = a

tactic: simp_rw [ih]
state_before: case insert
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
a : α
⊢ (∃ x y, x ∈ f i ∧ y ∈ ∏ x in is, f x ∧ x * y = a) ↔ ∃ g h, g i * ∏ i in is, g i = a

tactic: constructor
state_before: case insert
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
a : α
⊢ (∃ x y, x ∈ f i ∧ (∃ g x, ∏ i in is, g i = y) ∧ x * y = a) ↔ ∃ g h, g i * ∏ i in is, g i = a

tactic: simp_rw [Finset.prod_empty, Set.mem_one]
state_before: case empty
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ a : α
⊢ a ∈ ∏ i in ∅, f i ↔ ∃ g x, ∏ i in ∅, g i = a

tactic: exact ⟨fun h ↦ ⟨fun _ ↦ a, fun hi ↦ False.elim (Finset.not_mem_empty _ hi), h.symm⟩,
  fun ⟨_, _, hf⟩ ↦ hf.symm⟩
state_before: case empty
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ a : α
⊢ a = 1 ↔ ∃ g h, 1 = a

tactic: rintro ⟨x, y, hx, ⟨g, hg, rfl⟩, rfl⟩
state_before: case insert.mp
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
a : α
⊢ (∃ x y, x ∈ f i ∧ (∃ g x, ∏ i in is, g i = y) ∧ x * y = a) → ∃ g h, g i * ∏ i in is, g i = a

tactic: refine ⟨Function.update g i x, ?_, ?_⟩
state_before: case insert.mp.intro.intro.intro.intro.intro.intro
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
hx : x ∈ f i
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
⊢ ∃ g_1 h, g_1 i * ∏ i in is, g_1 i = x * ∏ i in is, g i

tactic: intro j hj
state_before: case insert.mp.intro.intro.intro.intro.intro.intro.refine_1
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
hx : x ∈ f i
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
⊢ ∀ {i_1 : ι}, i_1 ∈ insert i is → update g i x i_1 ∈ f i_1

tactic: obtain rfl | hj := Finset.mem_insert.mp hj
state_before: case insert.mp.intro.intro.intro.intro.intro.intro.refine_1
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
hx : x ∈ f i
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
j : ι
hj : j ∈ insert i is
⊢ update g i x j ∈ f j

tactic: rwa [Function.update_same]
state_before: case insert.mp.intro.intro.intro.intro.intro.intro.refine_1.inl
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
is : Finset ι
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
j : ι
hi : ¬j ∈ is
hx : x ∈ f j
hj : j ∈ insert j is
⊢ update g j x j ∈ f j

tactic: rw [update_noteq (ne_of_mem_of_not_mem hj hi)]
state_before: case insert.mp.intro.intro.intro.intro.intro.intro.refine_1.inr
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
hx : x ∈ f i
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
j : ι
hj✝ : j ∈ insert i is
hj : j ∈ is
⊢ update g i x j ∈ f j

tactic: exact hg hj
state_before: case insert.mp.intro.intro.intro.intro.intro.intro.refine_1.inr
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
hx : x ∈ f i
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
j : ι
hj✝ : j ∈ insert i is
hj : j ∈ is
⊢ g j ∈ f j

tactic: rw [Finset.prod_update_of_not_mem hi, Function.update_same]
state_before: case insert.mp.intro.intro.intro.intro.intro.intro.refine_2
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
x : α
hx : x ∈ f i
g : ι → α
hg : ∀ {i : ι}, i ∈ is → g i ∈ f i
⊢ update g i x i * ∏ i_1 in is, update g i x i_1 = x * ∏ i in is, g i

tactic: rintro ⟨g, hg, rfl⟩
state_before: case insert.mpr
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a✝ : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
a : α
⊢ (∃ g h, g i * ∏ i in is, g i = a) → ∃ x y, x ∈ f i ∧ (∃ g x, ∏ i in is, g i = y) ∧ x * y = a

tactic: exact ⟨g i, is.prod g, hg (is.mem_insert_self _),
  ⟨⟨g, fun hi ↦ hg (Finset.mem_insert_of_mem hi), rfl⟩, rfl⟩⟩
state_before: case insert.mpr.intro.intro
ι : Type u_1
α : Type u_2
β : Type ?u.51121
F : Type ?u.51124
inst✝² : CommMonoid α
inst✝¹ : CommMonoid β
inst✝ : MonoidHomClass F α β
f : ι → Set α
a : α
i : ι
is : Finset ι
hi : ¬i ∈ is
ih : ∀ (a : α), a ∈ ∏ i in is, f i ↔ ∃ g x, ∏ i in is, g i = a
g : ι → α
hg : ∀ {i_1 : ι}, i_1 ∈ insert i is → g i_1 ∈ f i_1
⊢ ∃ x y, x ∈ f i ∧ (∃ g x, ∏ i in is, g i = y) ∧ x * y = g i * ∏ i in is, g i