Theorem: Set.mem_list_prod
File: Mathlib/Data/Set/Pointwise/ListOfFn.lean

tactic: induction' l using List.ofFnRec with n f
state_before: F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n : ℕ
l : List (Set α)
a : α
⊢ a ∈ l.prod ↔ ∃ l', (List.map (fun x => ↑x.snd) l').prod = a ∧ List.map Sigma.fst l' = l
state_after: case h
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ a ∈ (List.ofFn f).prod ↔ ∃ l', (List.map (fun x => ↑x.snd) l').prod = a ∧ List.map Sigma.fst l' = List.ofFn f

tactic: simp only [mem_prod_list_ofFn, List.exists_iff_exists_tuple, List.map_ofFn, Function.comp,
  List.ofFn_inj', Sigma.mk.inj_iff, and_left_comm, exists_and_left, exists_eq_left, heq_eq_eq]
state_before: case h
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ a ∈ (List.ofFn f).prod ↔ ∃ l', (List.map (fun x => ↑x.snd) l').prod = a ∧ List.map Sigma.fst l' = List.ofFn f
state_after: case h
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ (∃ f_1, (List.ofFn fun i => ↑(f_1 i)).prod = a) ↔
    ∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = a ∧ (fun x_1 => (x x_1).fst) = f

tactic: constructor
state_before: case h
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ (∃ f_1, (List.ofFn fun i => ↑(f_1 i)).prod = a) ↔
    ∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = a ∧ (fun x_1 => (x x_1).fst) = f
state_after: case h.mp
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ (∃ f_1, (List.ofFn fun i => ↑(f_1 i)).prod = a) →
    ∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = a ∧ (fun x_1 => (x x_1).fst) = f

case h.mpr
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ (∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = a ∧ (fun x_1 => (x x_1).fst) = f) →
    ∃ f_1, (List.ofFn fun i => ↑(f_1 i)).prod = a

tactic: rintro ⟨fi, rfl⟩
state_before: case h.mp
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ (∃ f_1, (List.ofFn fun i => ↑(f_1 i)).prod = a) →
    ∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = a ∧ (fun x_1 => (x x_1).fst) = f
state_after: case h.mp.intro
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a : α
m n✝ n : ℕ
f : Fin n → Set α
fi : (i : Fin n) → ↑(f i)
⊢ ∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = (List.ofFn fun i => ↑(fi i)).prod ∧ (fun x_1 => (x x_1).fst) = f

tactic: exact ⟨fun i ↦ ⟨_, fi i⟩, rfl, rfl⟩
state_before: case h.mp.intro
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a : α
m n✝ n : ℕ
f : Fin n → Set α
fi : (i : Fin n) → ↑(f i)
⊢ ∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = (List.ofFn fun i => ↑(fi i)).prod ∧ (fun x_1 => (x x_1).fst) = f
state_after: no goals

tactic: rintro ⟨fi, rfl, rfl⟩
state_before: case h.mpr
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a✝ : α
m n✝ : ℕ
a : α
n : ℕ
f : Fin n → Set α
⊢ (∃ x, (List.ofFn fun x_1 => ↑(x x_1).snd).prod = a ∧ (fun x_1 => (x x_1).fst) = f) →
    ∃ f_1, (List.ofFn fun i => ↑(f_1 i)).prod = a
state_after: case h.mpr.intro.intro
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a : α
m n✝ n : ℕ
fi : Fin n → (s : Set α) × ↑s
⊢ ∃ f, (List.ofFn fun i => ↑(f i)).prod = (List.ofFn fun x => ↑(fi x).snd).prod

tactic: exact ⟨fun i ↦ _, rfl⟩
state_before: case h.mpr.intro.intro
F : Type u_1
α : Type u_2
β : Type u_3
γ : Type u_4
inst✝ : Monoid α
s t : Set α
a : α
m n✝ n : ℕ
fi : Fin n → (s : Set α) × ↑s
⊢ ∃ f, (List.ofFn fun i => ↑(f i)).prod = (List.ofFn fun x => ↑(fi x).snd).prod
state_after: no goals