Theorem: IsGδ.setOf_continuousAt
File: Mathlib/Topology/GDelta.lean

Proof steps:
state_before: X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
⊢ IsGδ {x | ContinuousAt f x}
state_after: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
⊢ IsGδ {x | ContinuousAt f x}
tactic: obtain ⟨U, _, hU⟩ := (@uniformity_hasBasis_open_symmetric Y _).exists_antitone_subbasis
state_before: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
⊢ IsGδ {x | ContinuousAt f x}
state_after: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
⊢ IsGδ {x | Tendsto (fun x => (f x.1, f x.2)) (𝓝 x ×ˢ 𝓝 x) (𝓤 Y)}
tactic: simp only [Uniform.continuousAt_iff_prod, nhds_prod_eq]
state_before: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
⊢ IsGδ {x | Tendsto (fun x => (f x.1, f x.2)) (𝓝 x ×ˢ 𝓝 x) (𝓤 Y)}
state_after: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
⊢ IsGδ (⋂ i, {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U i})
tactic: simp only [(nhds_basis_opens _).prod_self.tendsto_iff hU.toHasBasis, forall_prop_of_true,
    setOf_forall, id]
state_before: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
⊢ IsGδ (⋂ i, {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U i})
state_after: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
k : ℕ
x : X
⊢ x ∈ {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U k} →
    {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U k} ∈ 𝓝 x
tactic: refine .iInter fun k ↦ IsOpen.isGδ <| isOpen_iff_mem_nhds.2 fun x ↦ ?_
state_before: case intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
k : ℕ
x : X
⊢ x ∈ {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U k} →
    {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U k} ∈ 𝓝 x
state_after: case intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
k : ℕ
x : X
s : Set X
hsU : ∀ x ∈ s ×ˢ s, (f x.1, f x.2) ∈ U k
hsx : x ∈ s
hso : IsOpen s
⊢ {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U k} ∈ 𝓝 x
tactic: rintro ⟨s, ⟨hsx, hso⟩, hsU⟩
state_before: case intro.intro.intro.intro.intro
X : Type u_1
Y : Type u_2
ι : Type u_3
ι' : Sort u_4
inst✝² : TopologicalSpace X
inst✝¹ : UniformSpace Y
inst✝ : (𝓤 Y).IsCountablyGenerated
f : X → Y
U : ℕ → Set (Y × Y)
left✝ : ∀ (i : ℕ), U i ∈ 𝓤 Y ∧ IsOpen (U i) ∧ SymmetricRel (U i)
hU : (𝓤 Y).HasAntitoneBasis fun i => id (U i)
k : ℕ
x : X
s : Set X
hsU : ∀ x ∈ s ×ˢ s, (f x.1, f x.2) ∈ U k
hsx : x ∈ s
hso : IsOpen s
⊢ {x | ∃ ia, (x ∈ ia ∧ IsOpen ia) ∧ ∀ x ∈ ia ×ˢ ia, (f x.1, f x.2) ∈ U k} ∈ 𝓝 x
state_after: no goals
tactic: filter_upwards [IsOpen.mem_nhds hso hsx] with _ hy using ⟨s, ⟨hy, hso⟩, hsU⟩