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

tactic: refine le_antisymm ?_ ?_
state_before: X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ Pi.topologicalSpace = generateFrom {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s}
state_after: case refine_1
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ Pi.topologicalSpace ≤ generateFrom {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s}

case refine_2
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ generateFrom {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s} ≤ Pi.topologicalSpace

tactic: apply le_generateFrom
state_before: case refine_1
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ Pi.topologicalSpace ≤ generateFrom {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s}
state_after: case refine_1.h
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ ∀ s ∈ {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s}, IsOpen s

tactic: rintro _ ⟨s, i, hi, rfl⟩
state_before: case refine_1.h
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ ∀ s ∈ {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s}, IsOpen s
state_after: case refine_1.h.intro.intro.intro
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
s : (a : ι) → Set (π a)
i : Finset ι
hi : ∀ a ∈ i, s a ∈ g a
⊢ IsOpen ((↑i).pi s)

tactic: letI := fun a => generateFrom (g a)
state_before: case refine_1.h.intro.intro.intro
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
s : (a : ι) → Set (π a)
i : Finset ι
hi : ∀ a ∈ i, s a ∈ g a
⊢ IsOpen ((↑i).pi s)
state_after: case refine_1.h.intro.intro.intro
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
s : (a : ι) → Set (π a)
i : Finset ι
hi : ∀ a ∈ i, s a ∈ g a
this : (a : ι) → TopologicalSpace (π a) := fun a => generateFrom (g a)
⊢ IsOpen ((↑i).pi 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
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
s : (a : ι) → Set (π a)
i : Finset ι
hi : ∀ a ∈ i, s a ∈ g a
this : (a : ι) → TopologicalSpace (π a) := fun a => generateFrom (g a)
⊢ IsOpen ((↑i).pi s)
state_after: no goals

tactic: refine le_iInf fun i => coinduced_le_iff_le_induced.1 <| le_generateFrom fun s hs => ?_
state_before: case refine_2
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
⊢ generateFrom {t | ∃ s i, (∀ a ∈ i, s a ∈ g a) ∧ t = (↑i).pi s} ≤ Pi.topologicalSpace
state_after: case refine_2
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
i : ι
s : Set (π i)
hs : s ∈ g i
⊢ IsOpen s

tactic: refine GenerateOpen.basic _ ⟨update (fun i => univ) i s, {i}, ?_⟩
state_before: case refine_2
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
i : ι
s : Set (π i)
hs : s ∈ g i
⊢ IsOpen s
state_after: case refine_2
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
i : ι
s : Set (π i)
hs : s ∈ g i
⊢ (∀ a ∈ {i}, update (fun i => univ) i s a ∈ g a) ∧ (fun f => f i) ⁻¹' s = (↑{i}).pi (update (fun i => univ) i s)

tactic: simp [hs]
state_before: case refine_2
X : Type u
Y : Type v
Z : Type u_1
W : Type u_2
ε : Type u_3
ζ : Type u_4
ι : Type u_5
π✝ : ι → Type u_6
κ : Type u_7
inst✝ : TopologicalSpace X
T : (i : ι) → TopologicalSpace (π✝ i)
f : X → (i : ι) → π✝ i
π : ι → Type u_8
g : (a : ι) → Set (Set (π a))
i : ι
s : Set (π i)
hs : s ∈ g i
⊢ (∀ a ∈ {i}, update (fun i => univ) i s a ∈ g a) ∧ (fun f => f i) ⁻¹' s = (↑{i}).pi (update (fun i => univ) i s)
state_after: no goals