Theorem: isOpen_pi_iff
File: Mathlib/Topology/Constructions.lean

tactic: rw [isOpen_iff_nhds]
state_before: α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
⊢ IsOpen s ↔ ∀ (f : (a : ι) → π a), f ∈ s → ∃ I u, (∀ (a : ι), a ∈ I → IsOpen (u a) ∧ f a ∈ u a) ∧ Set.pi (↑I) u ⊆ s

tactic: simp_rw [le_principal_iff, nhds_pi, Filter.mem_pi', mem_nhds_iff]
state_before: α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
⊢ (∀ (a : (a : ι) → π a), a ∈ s → 𝓝 a ≤ 𝓟 s) ↔
    ∀ (f : (a : ι) → π a), f ∈ s → ∃ I u, (∀ (a : ι), a ∈ I → IsOpen (u a) ∧ f a ∈ u a) ∧ Set.pi (↑I) u ⊆ s

tactic: refine ball_congr fun a _ => ⟨?_, ?_⟩
state_before: α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
⊢ (∀ (a : (a : ι) → π a), a ∈ s → ∃ I t, (∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1) ∧ Set.pi (↑I) t ⊆ s) ↔
    ∀ (f : (a : ι) → π a), f ∈ s → ∃ I u, (∀ (a : ι), a ∈ I → IsOpen (u a) ∧ f a ∈ u a) ∧ Set.pi (↑I) u ⊆ s

tactic: rintro ⟨I, t, ⟨h1, h2⟩⟩
state_before: case refine_1
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
⊢ (∃ I t, (∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1) ∧ Set.pi (↑I) t ⊆ s) →
    ∃ I u, (∀ (a_2 : ι), a_2 ∈ I → IsOpen (u a_2) ∧ a a_2 ∈ u a_2) ∧ Set.pi (↑I) u ⊆ s

tactic: refine ⟨I, fun a => eval a '' (I : Set ι).pi fun a => (h1 a).choose, fun i hi => ?_, ?_⟩
state_before: case refine_1.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (i : ι) → Set (π i)
h1 : ∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1
h2 : Set.pi (↑I) t ⊆ s
⊢ ∃ I u, (∀ (a_1 : ι), a_1 ∈ I → IsOpen (u a_1) ∧ a a_1 ∈ u a_1) ∧ Set.pi (↑I) u ⊆ s

tactic: simp_rw [Set.eval_image_pi (Finset.mem_coe.mpr hi)
    (pi_nonempty_iff.mpr fun i => ⟨_, fun _ => (h1 i).choose_spec.2.2⟩)]
state_before: case refine_1.intro.intro.intro.refine_1
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (i : ι) → Set (π i)
h1 : ∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : i ∈ I
⊢ IsOpen
      ((fun a_1 => eval a_1 '' Set.pi ↑I fun a_2 => Exists.choose (_ : ∃ t_1, t_1 ⊆ t a_2 ∧ IsOpen t_1 ∧ a a_2 ∈ t_1))
        i) ∧
    a i ∈
      (fun a_1 => eval a_1 '' Set.pi ↑I fun a_2 => Exists.choose (_ : ∃ t_1, t_1 ⊆ t a_2 ∧ IsOpen t_1 ∧ a a_2 ∈ t_1)) i

tactic: exact (h1 i).choose_spec.2
state_before: case refine_1.intro.intro.intro.refine_1
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (i : ι) → Set (π i)
h1 : ∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : i ∈ I
⊢ IsOpen (Exists.choose (_ : ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1)) ∧
    a i ∈ Exists.choose (_ : ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1)

tactic: exact Subset.trans
  (Set.pi_mono fun i hi => (Set.eval_image_pi_subset hi).trans (h1 i).choose_spec.1) h2
state_before: case refine_1.intro.intro.intro.refine_2
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (i : ι) → Set (π i)
h1 : ∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1
h2 : Set.pi (↑I) t ⊆ s
⊢ (Set.pi ↑I fun a_1 =>
      eval a_1 '' Set.pi ↑I fun a_2 => Exists.choose (_ : ∃ t_1, t_1 ⊆ t a_2 ∧ IsOpen t_1 ∧ a a_2 ∈ t_1)) ⊆
    s

tactic: rintro ⟨I, t, ⟨h1, h2⟩⟩
state_before: case refine_2
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
⊢ (∃ I u, (∀ (a_1 : ι), a_1 ∈ I → IsOpen (u a_1) ∧ a a_1 ∈ u a_1) ∧ Set.pi (↑I) u ⊆ s) →
    ∃ I t, (∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1) ∧ Set.pi (↑I) t ⊆ s

tactic: refine ⟨I, fun a => ite (a ∈ I) (t a) Set.univ, fun i => ?_, ?_⟩
state_before: case refine_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
⊢ ∃ I t, (∀ (i : ι), ∃ t_1, t_1 ⊆ t i ∧ IsOpen t_1 ∧ a i ∈ t_1) ∧ Set.pi (↑I) t ⊆ s

tactic: by_cases hi : i ∈ I
state_before: case refine_2.intro.intro.intro.refine_1
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
⊢ ∃ t_1, t_1 ⊆ (fun a => if a ∈ I then t a else univ) i ∧ IsOpen t_1 ∧ a i ∈ t_1

tactic: use t i
state_before: case pos
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : i ∈ I
⊢ ∃ t_1, t_1 ⊆ (fun a => if a ∈ I then t a else univ) i ∧ IsOpen t_1 ∧ a i ∈ t_1

tactic: simp_rw [if_pos hi]
state_before: case pos
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : i ∈ I
⊢ t i ⊆ (fun a => if a ∈ I then t a else univ) i ∧ IsOpen (t i) ∧ a i ∈ t i

tactic: exact ⟨Subset.rfl, (h1 i) hi⟩
state_before: case pos
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : i ∈ I
⊢ t i ⊆ t i ∧ IsOpen (t i) ∧ a i ∈ t i

tactic: use Set.univ
state_before: case neg
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : ¬i ∈ I
⊢ ∃ t_1, t_1 ⊆ (fun a => if a ∈ I then t a else univ) i ∧ IsOpen t_1 ∧ a i ∈ t_1

tactic: simp_rw [if_neg hi]
state_before: case neg
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : ¬i ∈ I
⊢ univ ⊆ (fun a => if a ∈ I then t a else univ) i ∧ IsOpen univ ∧ a i ∈ univ

tactic: exact ⟨Subset.rfl, isOpen_univ, mem_univ _⟩
state_before: case neg
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
i : ι
hi : ¬i ∈ I
⊢ univ ⊆ univ ∧ IsOpen univ ∧ a i ∈ univ

tactic: rw [← Set.univ_pi_ite]
state_before: case refine_2.intro.intro.intro.refine_2
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
⊢ (Set.pi ↑I fun a => if a ∈ I then t a else univ) ⊆ s

tactic: simp only [← ite_and, ← Finset.mem_coe, and_self_iff, Set.univ_pi_ite, h2]
state_before: case refine_2.intro.intro.intro.refine_2
α : Type u
β : Type v
γ : Type ?u.248072
δ : Type ?u.248075
ε : Type ?u.248078
ζ : Type ?u.248081
ι : Type u_1
π : ι → Type u_2
κ : Type ?u.248092
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π i)
f : α → (i : ι) → π i
s : Set ((a : ι) → π a)
a : (a : ι) → π a
x✝ : a ∈ s
I : Finset ι
t : (a : ι) → Set (π a)
h1 : ∀ (a_1 : ι), a_1 ∈ I → IsOpen (t a_1) ∧ a a_1 ∈ t a_1
h2 : Set.pi (↑I) t ⊆ s
⊢ (Set.pi univ fun i => if i ∈ ↑I then if i ∈ I then t i else univ else univ) ⊆ s