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

tactic: refine le_antisymm ?_ ?_
state_before: α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
⊢ Pi.topologicalSpace = generateFrom {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s}

tactic: apply le_generateFrom
state_before: case refine_1
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
⊢ Pi.topologicalSpace ≤ generateFrom {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s}

tactic: rintro _ ⟨s, i, hi, rfl⟩
state_before: case refine_1.h
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
⊢ ∀ (s : Set ((a : ι) → π a)), s ∈ {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s} → IsOpen s

tactic: letI := fun a => generateFrom (g a)
state_before: case refine_1.h.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
s : (a : ι) → Set (π a)
i : Finset ι
hi : ∀ (a : ι), a ∈ i → s a ∈ g a
⊢ IsOpen (Set.pi (↑i) s)

tactic: exact isOpen_set_pi i.finite_toSet (fun a ha => GenerateOpen.basic _ (hi a ha))
state_before: case refine_1.h.intro.intro.intro
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
s : (a : ι) → Set (π a)
i : Finset ι
hi : ∀ (a : ι), a ∈ i → s a ∈ g a
this : (a : ι) → TopologicalSpace (π a) := fun a => generateFrom (g a)
⊢ IsOpen (Set.pi (↑i) s)

tactic: refine le_iInf fun a => coinduced_le_iff_le_induced.1 <| le_generateFrom fun s hs => ?_
state_before: case refine_2
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
⊢ generateFrom {t | ∃ s i, (∀ (a : ι), a ∈ i → s a ∈ g a) ∧ t = Set.pi (↑i) s} ≤ Pi.topologicalSpace

tactic: refine GenerateOpen.basic _ ⟨update (fun a => univ) a s, {a}, ?_⟩
state_before: case refine_2
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
a : ι
s : Set (π a)
hs : s ∈ g a
⊢ IsOpen s

tactic: simp [hs]
state_before: case refine_2
α : Type u
β : Type v
γ : Type ?u.341773
δ : Type ?u.341776
ε : Type ?u.341779
ζ : Type ?u.341782
ι : Type u_2
π✝ : ι → Type ?u.341790
κ : Type ?u.341793
inst✝¹ : TopologicalSpace α
inst✝ : (i : ι) → TopologicalSpace (π✝ i)
f : α → (i : ι) → π✝ i
π : ι → Type u_1
g : (a : ι) → Set (Set (π a))
a : ι
s : Set (π a)
hs : s ∈ g a
⊢ (∀ (a_1 : ι), a_1 ∈ {a} → update (fun a => univ) a s a_1 ∈ g a_1) ∧
    (fun f => f a) ⁻¹' s = Set.pi (↑{a}) (update (fun a => univ) a s)