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

tactic: cases nonempty_fintype ι
state_before: α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
⊢ Pi.topologicalSpace = generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}

tactic: rw [pi_generateFrom_eq]
state_before: case intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
⊢ Pi.topologicalSpace = generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}

tactic: refine' le_antisymm (generateFrom_anti _) (le_generateFrom _)
state_before: case intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
⊢ generateFrom {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s} =
    generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}

tactic: exact fun s ⟨t, ht, Eq⟩ => ⟨t, Finset.univ, by simp [ht, Eq]⟩
state_before: case intro.refine'_1
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
⊢ {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s} ⊆
    {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s}

tactic: simp [ht, Eq]
state_before: α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
s : Set ((i : ι) → π i)
x✝ : s ∈ {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
t : (a : ι) → Set (π a)
ht : ∀ (a : ι), t a ∈ g a
Eq : s = Set.pi univ t
⊢ (∀ (a : ι), a ∈ Finset.univ → t a ∈ g a) ∧ s = Set.pi (↑Finset.univ) t

tactic: rintro s ⟨t, i, ht, rfl⟩
state_before: case intro.refine'_2
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
⊢ ∀ (s : Set ((i : ι) → π i)), s ∈ {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s} → IsOpen s

tactic: letI := generateFrom { t | ∃ s : ∀ a, Set (π a), (∀ a, s a ∈ g a) ∧ t = pi univ s }
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
⊢ IsOpen (Set.pi (↑i) t)

tactic: refine isOpen_iff_forall_mem_open.2 fun f hf => ?_
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
this : TopologicalSpace ((i : ι) → π i) := generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
⊢ IsOpen (Set.pi (↑i) t)

tactic: choose c hcg hfc using fun a => sUnion_eq_univ_iff.1 (hg a) (f a)
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f✝ : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
this : TopologicalSpace ((i : ι) → π i) := generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
f : (i : ι) → π i
hf : f ∈ Set.pi (↑i) t
⊢ ∃ t_1, t_1 ⊆ Set.pi (↑i) t ∧ IsOpen t_1 ∧ f ∈ t_1

tactic: refine ⟨pi i t ∩ pi (↑iᶜ : Set ι) c, inter_subset_left _ _, ?_, ⟨hf, fun a _ => hfc a⟩⟩
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f✝ : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
this : TopologicalSpace ((i : ι) → π i) := generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
f : (i : ι) → π i
hf : f ∈ Set.pi (↑i) t
c : (a : ι) → Set (π a)
hcg : ∀ (a : ι), c a ∈ g a
hfc : ∀ (a : ι), f a ∈ c a
⊢ ∃ t_1, t_1 ⊆ Set.pi (↑i) t ∧ IsOpen t_1 ∧ f ∈ t_1

tactic: rw [← univ_pi_piecewise]
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f✝ : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
this : TopologicalSpace ((i : ι) → π i) := generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
f : (i : ι) → π i
hf : f ∈ Set.pi (↑i) t
c : (a : ι) → Set (π a)
hcg : ∀ (a : ι), c a ∈ g a
hfc : ∀ (a : ι), f a ∈ c a
⊢ IsOpen (Set.pi (↑i) t ∩ Set.pi (↑iᶜ) c)

tactic: refine GenerateOpen.basic _ ⟨_, fun a => ?_, rfl⟩
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f✝ : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
this : TopologicalSpace ((i : ι) → π i) := generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
f : (i : ι) → π i
hf : f ∈ Set.pi (↑i) t
c : (a : ι) → Set (π a)
hcg : ∀ (a : ι), c a ∈ g a
hfc : ∀ (a : ι), f a ∈ c a
⊢ IsOpen (Set.pi univ (piecewise (↑i) t c))

tactic: by_cases a ∈ i <;> simp [*]
state_before: case intro.refine'_2.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.400266
δ : Type ?u.400269
ε : Type ?u.400272
ζ : Type ?u.400275
ι : Type u_2
π✝ : ι → Type ?u.400283
κ : Type ?u.400286
inst✝² : TopologicalSpace α
inst✝¹ : (i : ι) → TopologicalSpace (π✝ i)
f✝ : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
inst✝ : Finite ι
hg : ∀ (a : ι), ⋃₀ g a = univ
val✝ : Fintype ι
t : (a : ι) → Set (π a)
i : Finset ι
ht : ∀ (a : ι), a ∈ i → t a ∈ g a
this : TopologicalSpace ((i : ι) → π i) := generateFrom {t | ∃ s, (∀ (a : ι), s a ∈ g a) ∧ t = Set.pi univ s}
f : (i : ι) → π i
hf : f ∈ Set.pi (↑i) t
c : (a : ι) → Set (π a)
hcg : ∀ (a : ι), c a ∈ g a
hfc : ∀ (a : ι), f a ∈ c a
a : ι
⊢ piecewise (↑i) t c a ∈ g a