@@ -5,129 +5,176 @@ Authors: Yury Kudryashov
55-/
66module
77
8- public import Mathlib.Topology.MetricSpace.Basic
8+ public import Mathlib.Topology.UniformSpace.Pi
99
1010/-!
11- # Metrizability of a T₃ topological space with second countable topology
11+ # Metrizable Spaces
1212
1313In this file we define metrizable topological spaces, i.e., topological spaces for which there
1414exists a metric space structure that generates the same topology.
15+ We define it without any reference to metric spaces in order to avoid importing the real numbers.
16+ For the proof that metrizable spaces admit a compatible metric,
17+ see `Mathlib/Topology/Metrizable/Uniformity`.
1518-/
1619
20+ -- don't import the real numbers
21+ assert_not_exists AddMonoidWithOne
22+
1723@[expose] public section
1824
19- open Filter Set Metric Topology
25+ open Filter Set Topology Uniformity
2026
2127namespace TopologicalSpace
2228
2329variable {ι X Y : Type *} {A : ι → Type *} [TopologicalSpace X] [TopologicalSpace Y] [Finite ι]
2430 [∀ i, TopologicalSpace (A i)]
2531
2632/-- A topological space is *pseudo metrizable* if there exists a pseudo metric space structure
27- compatible with the topology. To endow such a space with a compatible distance, use
33+ compatible with the topology. To minimize imports, we implement this class in terms of the
34+ existence of a countably generated unifomity inducing the topology, which is mathematically
35+ equivalent.
36+ To endow such a space with a compatible uniformity, use
37+ `letI : UniformSpace X := TopologicalSpace.pseudoMetrizableSpaceUniformity X`.
38+ To endow such a space with a compatible distance, use
2839`letI : PseudoMetricSpace X := TopologicalSpace.pseudoMetrizableSpacePseudoMetric X`. -/
2940class PseudoMetrizableSpace (X : Type *) [t : TopologicalSpace X] : Prop where
30- exists_pseudo_metric : ∃ m : PseudoMetricSpace X, m.toUniformSpace.toTopologicalSpace = t
31-
32- instance (priority := 100 ) _root_.PseudoMetricSpace.toPseudoMetrizableSpace {X : Type *}
33- [m : PseudoMetricSpace X] : PseudoMetrizableSpace X :=
34- ⟨⟨m, rfl⟩⟩
35-
36- /-- Construct on a metrizable space a metric compatible with the topology. -/
37- noncomputable def pseudoMetrizableSpacePseudoMetric (X : Type *) [TopologicalSpace X]
38- [h : PseudoMetrizableSpace X] : PseudoMetricSpace X :=
39- h.exists_pseudo_metric.choose.replaceTopology h.exists_pseudo_metric.choose_spec.symm
41+ exists_countably_generated :
42+ ∃ u : UniformSpace X, u.toTopologicalSpace = t ∧ (uniformity X).IsCountablyGenerated
43+
44+ /-- A uniform space with countably generated `𝓤 X` is pseudo metrizable. -/
45+ instance (priority := 100 ) _root_.UniformSpace.pseudoMetrizableSpace {X : Type *}
46+ [u : UniformSpace X] [hu : IsCountablyGenerated (uniformity X)] : PseudoMetrizableSpace X :=
47+ ⟨⟨u, rfl, hu⟩⟩
48+
49+ /-- Construct on a pseudometrizable space a countably generated uniformity
50+ compatible with the topology. Use `pseudoMetrizableSpaceUniformity_countably_generated` for a proof
51+ that this uniformity is countably generated. -/
52+ -- see note [reducible non-instances]
53+ noncomputable abbrev pseudoMetrizableSpaceUniformity (X : Type *) [TopologicalSpace X]
54+ [h : PseudoMetrizableSpace X] : UniformSpace X :=
55+ h.exists_countably_generated.choose.replaceTopology
56+ h.exists_countably_generated.choose_spec.1 .symm
57+
58+ example {X : Type *} [t : TopologicalSpace X] [PseudoMetrizableSpace X] :
59+ (pseudoMetrizableSpaceUniformity X).toTopologicalSpace = t := by
60+ with_reducible_and_instances rfl
61+
62+ /-- The uniformity coming from `pseudoMetrizableSpaceUniformity` is countably generated.. -/
63+ theorem pseudoMetrizableSpaceUniformity_countably_generated
64+ (X : Type *) [TopologicalSpace X] [h : PseudoMetrizableSpace X] :
65+ 𝓤[pseudoMetrizableSpaceUniformity X].IsCountablyGenerated :=
66+ h.exists_countably_generated.choose_spec.2
4067
4168instance pseudoMetrizableSpace_prod [PseudoMetrizableSpace X] [PseudoMetrizableSpace Y] :
4269 PseudoMetrizableSpace (X × Y) :=
43- letI : PseudoMetricSpace X := pseudoMetrizableSpacePseudoMetric X
44- letI : PseudoMetricSpace Y := pseudoMetrizableSpacePseudoMetric Y
70+ let : UniformSpace X := pseudoMetrizableSpaceUniformity X
71+ have : (uniformity X).IsCountablyGenerated :=
72+ pseudoMetrizableSpaceUniformity_countably_generated X
73+ let : UniformSpace Y := pseudoMetrizableSpaceUniformity Y
74+ have : (uniformity Y).IsCountablyGenerated :=
75+ pseudoMetrizableSpaceUniformity_countably_generated Y
4576 inferInstance
4677
4778/-- Given an inducing map of a topological space into a pseudo metrizable space, the source space
4879is also pseudo metrizable. -/
4980theorem _root_.Topology.IsInducing.pseudoMetrizableSpace [PseudoMetrizableSpace Y] {f : X → Y}
5081 (hf : IsInducing f) : PseudoMetrizableSpace X :=
51- letI : PseudoMetricSpace Y := pseudoMetrizableSpacePseudoMetric Y
52- ⟨⟨hf.comapPseudoMetricSpace, rfl⟩⟩
82+ let u : UniformSpace Y := pseudoMetrizableSpaceUniformity Y
83+ have : (uniformity Y).IsCountablyGenerated :=
84+ pseudoMetrizableSpaceUniformity_countably_generated Y
85+ ⟨⟨u.comap f, u.toTopologicalSpace_comap.trans hf.eq_induced.symm,
86+ Filter.comap.isCountablyGenerated (uniformity Y) (Prod.map f f)⟩⟩
5387
5488/-- Every pseudo-metrizable space is first countable. -/
5589instance (priority := 100 ) PseudoMetrizableSpace.firstCountableTopology
56- [h : PseudoMetrizableSpace X] : FirstCountableTopology X := by
57- rcases h with ⟨_, hm⟩
58- rw [← hm]
59- exact @UniformSpace.firstCountableTopology X PseudoMetricSpace.toUniformSpace
60- EMetric.instIsCountablyGeneratedUniformity
90+ [h : PseudoMetrizableSpace X] : FirstCountableTopology X :=
91+ let : UniformSpace X := pseudoMetrizableSpaceUniformity X
92+ have : (uniformity X).IsCountablyGenerated :=
93+ pseudoMetrizableSpaceUniformity_countably_generated X
94+ inferInstance
6195
6296instance PseudoMetrizableSpace.subtype [PseudoMetrizableSpace X] (s : Set X) :
6397 PseudoMetrizableSpace s :=
6498 IsInducing.subtypeVal.pseudoMetrizableSpace
6599
66100instance pseudoMetrizableSpace_pi [∀ i, PseudoMetrizableSpace (A i)] :
67- PseudoMetrizableSpace (∀ i, A i) := by
68- cases nonempty_fintype ι
69- letI := fun i => pseudoMetrizableSpacePseudoMetric (A i)
70- infer_instance
101+ PseudoMetrizableSpace (∀ i, A i) :=
102+ let := fun i => pseudoMetrizableSpaceUniformity (A i)
103+ have := fun i => pseudoMetrizableSpaceUniformity_countably_generated (A i)
104+ inferInstance
105+
106+ instance PseudoMetrizableSpace.regularSpace [PseudoMetrizableSpace X] : RegularSpace X :=
107+ let := pseudoMetrizableSpaceUniformity X
108+ inferInstance
71109
72110/-- A topological space is metrizable if there exists a metric space structure compatible with the
73- topology. To endow such a space with a compatible distance, use
111+ topology. To minimize imports, we implement this class in terms of the existence of a
112+ countably generated unifomity inducing the topology, which is mathematically
113+ equivalent.
114+ To endow such a space with a compatible uniformity, use
115+ `letI : UniformSpace X := TopologicalSpace.pseudoMetrizableSpaceUniformity X`.
116+ To endow such a space with a compatible distance, use
74117`letI : MetricSpace X := TopologicalSpace.metrizableSpaceMetric X`. -/
75- class MetrizableSpace (X : Type *) [t : TopologicalSpace X] : Prop where
76- exists_metric : ∃ m : MetricSpace X, m.toUniformSpace.toTopologicalSpace = t
77-
78- instance (priority := 100 ) _root_.MetricSpace.toMetrizableSpace {X : Type *} [m : MetricSpace X] :
79- MetrizableSpace X :=
80- ⟨⟨m, rfl⟩⟩
118+ class MetrizableSpace (X : Type *) [t : TopologicalSpace X] : Prop extends
119+ PseudoMetrizableSpace X, T0Space X
81120
82- instance (priority := 100 ) MetrizableSpace.toPseudoMetrizableSpace [h : MetrizableSpace X] :
83- PseudoMetrizableSpace X :=
84- let ⟨m, hm⟩ := h.1
85- ⟨⟨m.toPseudoMetricSpace, hm⟩⟩
121+ -- See note [lower instance priority]
122+ attribute [instance 100] MetrizableSpace.toT0Space
123+ attribute [instance 100] MetrizableSpace.toPseudoMetrizableSpace
86124
87125instance (priority := 100 ) PseudoMetrizableSpace.toMetrizableSpace
88- [T0Space X] [h : PseudoMetrizableSpace X] : MetrizableSpace X :=
89- letI := pseudoMetrizableSpacePseudoMetric X
90- ⟨.ofT0PseudoMetricSpace X, rfl⟩
91-
92- /-- Construct on a metrizable space a metric compatible with the topology. -/
93- noncomputable def metrizableSpaceMetric (X : Type *) [TopologicalSpace X] [h : MetrizableSpace X] :
94- MetricSpace X :=
95- h.exists_metric.choose.replaceTopology h.exists_metric.choose_spec.symm
126+ [T0Space X] [h : PseudoMetrizableSpace X] : MetrizableSpace X where
96127
97128instance (priority := 100 ) t2Space_of_metrizableSpace [MetrizableSpace X] : T2Space X :=
98- letI : MetricSpace X := metrizableSpaceMetric X
129+ letI : UniformSpace X := pseudoMetrizableSpaceUniformity X
99130 inferInstance
100131
101- instance metrizableSpace_prod [MetrizableSpace X] [MetrizableSpace Y] : MetrizableSpace (X × Y) :=
102- letI : MetricSpace X := metrizableSpaceMetric X
103- letI : MetricSpace Y := metrizableSpaceMetric Y
104- inferInstance
132+ instance metrizableSpace_prod [MetrizableSpace X] [MetrizableSpace Y] :
133+ MetrizableSpace (X × Y) where
105134
106135/-- Given an embedding of a topological space into a metrizable space, the source space is also
107136metrizable. -/
108137theorem _root_.Topology.IsEmbedding.metrizableSpace [MetrizableSpace Y] {f : X → Y}
109- (hf : IsEmbedding f) : MetrizableSpace X :=
110- letI : MetricSpace Y := metrizableSpaceMetric Y
111- ⟨⟨hf.comapMetricSpace f, rfl⟩⟩
138+ (hf : IsEmbedding f) : MetrizableSpace X where
139+ toPseudoMetrizableSpace := hf.toIsInducing.pseudoMetrizableSpace
140+ toT0Space := hf.t0Space
112141
113142instance MetrizableSpace.subtype [MetrizableSpace X] (s : Set X) : MetrizableSpace s :=
114143 IsEmbedding.subtypeVal.metrizableSpace
115144
116- instance metrizableSpace_pi [∀ i, MetrizableSpace (A i)] : MetrizableSpace (∀ i, A i) := by
117- cases nonempty_fintype ι
118- letI := fun i => metrizableSpaceMetric (A i)
119- infer_instance
145+ instance metrizableSpace_pi [∀ i, MetrizableSpace (A i)] : MetrizableSpace (∀ i, A i) where
120146
121147theorem IsSeparable.secondCountableTopology [PseudoMetrizableSpace X] {s : Set X}
122- (hs : IsSeparable s) : SecondCountableTopology s := by
123- letI := pseudoMetrizableSpacePseudoMetric X
124- have := hs.separableSpace
125- exact UniformSpace.secondCountable_of_separable s
126-
127- instance (X : Type *) [TopologicalSpace X] [c : CompactSpace X] [MetrizableSpace X] :
148+ (hs : IsSeparable s) : SecondCountableTopology s :=
149+ let ⟨u, hu, hs⟩ := hs
150+ have := hu.to_subtype
151+ have : SeparableSpace (closure u) :=
152+ ⟨Set.range (u.inclusion subset_closure), Set.countable_range (u.inclusion subset_closure),
153+ Subtype.dense_iff.2 <| by rw [← Set.range_comp, Set.val_comp_inclusion, Subtype.range_coe]⟩
154+ let := pseudoMetrizableSpaceUniformity (closure u)
155+ have := pseudoMetrizableSpaceUniformity_countably_generated (closure u)
156+ have := UniformSpace.secondCountable_of_separable (closure u)
157+ (Topology.IsEmbedding.inclusion hs).secondCountableTopology
158+
159+ instance (X : Type *) [TopologicalSpace X] [LindelofSpace X] [PseudoMetrizableSpace X] :
128160 SecondCountableTopology X := by
129- obtain ⟨_, h⟩ := MetrizableSpace.exists_metric (X := X)
130- rw [← h] at c ⊢
131- infer_instance
161+ let := pseudoMetrizableSpaceUniformity X
162+ have := pseudoMetrizableSpaceUniformity_countably_generated X
163+ suffices _ : SeparableSpace X from UniformSpace.secondCountable_of_separable X
164+ obtain ⟨V, hVb, hVs⟩ := UniformSpace.has_seq_basis X
165+ choose U hUc hUu using fun n =>
166+ LindelofSpace.elim_nhds_subcover (fun x => UniformSpace.ball x (V n))
167+ (fun x => UniformSpace.ball_mem_nhds x (hVb.mem n))
168+ refine ⟨Set.iUnion U, Set.countable_iUnion hUc, fun x => ?_⟩
169+ rw [mem_closure_iff_frequently, nhds_eq_comap_uniformity, frequently_comap, hVb.frequently_iff]
170+ intro n _
171+ obtain ⟨i, hi, hx⟩ := Set.mem_iUnion₂.1 (Set.eq_univ_iff_forall.1 (hUu n) x)
172+ rw [UniformSpace.ball_eq_of_symmetry] at hx
173+ exact ⟨(x, i), hx, i, rfl, Set.mem_iUnion_of_mem n hi⟩
174+
175+ instance (priority := 100 ) DiscreteTopology.metrizableSpace [DiscreteTopology X] :
176+ MetrizableSpace X where
177+ exists_countably_generated :=
178+ ⟨⊥, DiscreteTopology.eq_bot.symm, Filter.isCountablyGenerated_principal SetRel.id⟩
132179
133180end TopologicalSpace
0 commit comments