|
1 | 1 | /- |
2 | 2 | Copyright (c) 2017 Johannes Hölzl. All rights reserved. |
3 | 3 | Released under Apache 2.0 license as described in the file LICENSE. |
4 | | -Authors: Johannes Hölzl, Mario Carneiro, Yongxi Lin |
| 4 | +Authors: Johannes Hölzl, Mario Carneiro |
5 | 5 | -/ |
6 | 6 | module |
7 | 7 |
|
8 | | -public import Mathlib.Topology.UrysohnsLemma |
| 8 | +public import Mathlib.Topology.Compactness.Lindelof |
| 9 | +public import Mathlib.Topology.Compactness.SigmaCompact |
| 10 | +public import Mathlib.Topology.Inseparable |
| 11 | +public import Mathlib.Topology.Separation.Regular |
| 12 | +public import Mathlib.Topology.GDelta.Basic |
9 | 13 |
|
10 | 14 | /-! |
11 | 15 | # Separation properties of topological spaces. |
@@ -65,111 +69,6 @@ closed sets are Gδ. -/ |
65 | 69 | class PerfectlyNormalSpace (X : Type u) [TopologicalSpace X] : Prop extends NormalSpace X where |
66 | 70 | closed_gdelta : ∀ ⦃h : Set X⦄, IsClosed h → IsGδ h |
67 | 71 |
|
68 | | -/-- In a perfectly normal space, all closed sets are Gδ. -/ |
69 | | -theorem IsClosed.isGδ [PerfectlyNormalSpace X] {s : Set X} (hs : IsClosed s) : IsGδ s := |
70 | | - PerfectlyNormalSpace.closed_gdelta hs |
71 | | - |
72 | | -/-- A topological space is perfectly normal iff every closed set is the zero set of a continuous |
73 | | -function taking values in the unit interval. -/ |
74 | | -theorem perfectlyNormalSpace_iff_forall_isClosed_preimage_zero : |
75 | | - PerfectlyNormalSpace X ↔ ∀ s, IsClosed s → ∃ f : C(X, ℝ), s = f ⁻¹' {0} ∧ |
76 | | - range f ⊆ Icc 0 1 where |
77 | | - mp h s hs := by |
78 | | - -- write `s` as the intersection of a sequence of open sets `U n` |
79 | | - obtain ⟨U, ho, hu⟩ := isGδ_iff_eq_iInter_nat.1 hs.isGδ |
80 | | - have (n : ℕ) : Disjoint s (U n)ᶜ := by |
81 | | - apply HasSubset.Subset.disjoint_compl_right |
82 | | - grw [hu, iInter_subset] |
83 | | - -- for each `n`, construct a continuous function `f n` that separates `s` from `(U n)ᶜ` |
84 | | - choose f hfs hfu hfr using fun n => |
85 | | - exists_continuous_zero_one_of_isClosed hs (ho n).isClosed_compl (this n) |
86 | | - have hsb (x : X) (n : ℕ) : ‖(f n) x * (1 / 2 / 2 ^ n)‖ ≤ 1 / 2 / 2 ^ n := by |
87 | | - simp [abs_of_nonneg (hfr n x).1, (hfr n x).2] |
88 | | - have hsx (x : X) : Summable fun n => f n x * (1 / 2 / 2 ^ n) := |
89 | | - (summable_geometric_two' 1).of_norm_bounded fun n => hsb x n |
90 | | - -- consider the infinite sum of `f n x * (1 / 2 / 2 ^ n)`, which is uniformly convergent and |
91 | | - -- thus continuous because it is dominated by a geometric series |
92 | | - let h : C(X, ℝ) := { |
93 | | - toFun x := ∑' n, f n x * (1 / 2 / 2 ^ n) |
94 | | - continuous_toFun := |
95 | | - continuous_tsum (fun n => by fun_prop) (summable_geometric_two' 1) fun n x => hsb x n |
96 | | - } |
97 | | - refine ⟨h, ?_, fun r ⟨x, hx⟩ => ⟨?_, ?_⟩⟩ |
98 | | - · ext x |
99 | | - refine ⟨fun hp => ?_, fun hp => ?_⟩ |
100 | | - · suffices ∀ n, f n x = 0 from by simp [h, this] |
101 | | - exact fun n => hfs n hp |
102 | | - · contrapose h |
103 | | - simp only [preimage, notMem_setOf_iff, ContinuousMap.coe_mk, mem_singleton_iff] |
104 | | - apply ne_of_gt |
105 | | - obtain ⟨i, hi⟩ := mem_iUnion.1 <| compl_iInter _ ▸ mem_compl (hu ▸ h) |
106 | | - calc |
107 | | - _ < 1 / 2 / 2 ^ i := by positivity |
108 | | - _ = f i x * (1 / 2 / 2 ^ i) := by simp [hfu i hi] |
109 | | - _ ≤ _ := (hsx x).le_tsum i fun j hj => by positivity [(hfr j x).1] |
110 | | - · exact hx ▸ tsum_nonneg fun n => by simp [(hfr n x).1] |
111 | | - · calc |
112 | | - _ = ∑' n, f n x * (1 / 2 / 2 ^ n) := by simp [← hx, h] |
113 | | - _ ≤ ∑' n, 1 / 2 / 2 ^ n := |
114 | | - (hsx x).tsum_le_tsum (fun n => by simp [(hfr n x).2]) (summable_geometric_two' 1) |
115 | | - _ = _ := tsum_geometric_two' 1 |
116 | | - mpr h := { |
117 | | - normal s t hs ht hst := by |
118 | | - -- pick `f, g` such that `s = f ⁻¹' {0}` and `t = g ⁻¹' {0}`, and then the function |
119 | | - -- `f / (f + g)` separates `s` and `t`. |
120 | | - obtain ⟨f, hf, hfr⟩ := h s hs |
121 | | - obtain ⟨g, hg, hgr⟩ := h t ht |
122 | | - have hsn : SeparatedNhds {(0 : ℝ)} {1} := |
123 | | - SeparatedNhds.of_finite (finite_singleton _) (finite_singleton _) |
124 | | - (disjoint_singleton.2 zero_ne_one) |
125 | | - have hfg (x : X) : f x + g x ≠ 0 := by |
126 | | - simp_all only [preimage, mem_singleton_iff] |
127 | | - by_cases! hfx : f x = 0 |
128 | | - · simpa [hfx] using hst.notMem_of_mem_left hfx |
129 | | - · simp only [range, Icc, setOf_subset_setOf, forall_exists_index, |
130 | | - forall_apply_eq_imp_iff] at hfr hgr |
131 | | - positivity [(hgr x).1, (hfr x).1] |
132 | | - have hp : s = (fun a => f a / (f a + g a)) ⁻¹' {0} := by simp_all [preimage] |
133 | | - have : t = (fun a => f a / (f a + g a)) ⁻¹' {1} := by simp_all [preimage, div_eq_one_iff_eq] |
134 | | - rw [hp, this] |
135 | | - exact hsn.preimage (f.continuous.div₀ (f.continuous.add g.continuous) hfg) |
136 | | - closed_gdelta s hs := by |
137 | | - by_cases! hse : s = ∅ |
138 | | - · simp_all |
139 | | - -- pick `f` such that `s = f ⁻¹' {0} = ⋂ n, f ⁻¹' {(-1, 1 / (n + 1))}` |
140 | | - obtain ⟨f, hf, hfr⟩ := h s hs |
141 | | - refine isGδ_iff_eq_iInter_nat.2 ⟨fun n => f ⁻¹' (Ioo (-1 : ℝ) (1 / (n + 1))), fun n => ?_, ?_⟩ |
142 | | - · exact f.continuous.isOpen_preimage _ isOpen_Ioo |
143 | | - · simp only [hf, ← preimage_iInter, |
144 | | - ← preimage_range_inter (s := ⋂ (n : ℕ), Ioo (-1 : ℝ) (1 / (n + 1))), inter_iInter] |
145 | | - congr |
146 | | - ext x |
147 | | - refine ⟨fun h => mem_iInter_of_mem fun n => ?_, fun h => ?_⟩ |
148 | | - · refine ⟨?_, ?_, by simp_all; grind⟩ <;> aesop |
149 | | - · apply le_antisymm |
150 | | - · simp only [mem_iInter, mem_inter_iff, mem_Ioo] at h |
151 | | - exact ge_of_tendsto' tendsto_one_div_add_atTop_nhds_zero_nat (fun n => (h n).2.2.le) |
152 | | - · exact (hfr (mem_iInter.1 h 0).1).1 |
153 | | - } |
154 | | - |
155 | | -theorem Topology.IsEmbedding.perfectlyNormalSpace {e : X → Y} (he : IsEmbedding e) |
156 | | - [PerfectlyNormalSpace Y] : PerfectlyNormalSpace X := by |
157 | | - rw [perfectlyNormalSpace_iff_forall_isClosed_preimage_zero] |
158 | | - intro t ht |
159 | | - obtain ⟨c, hc⟩ : ∃ c, IsClosed c ∧ e '' t = c ∩ range e := he.image_eq_isClosed_inter_range ht |
160 | | - obtain ⟨f, rfl, hf⟩ := |
161 | | - perfectlyNormalSpace_iff_forall_isClosed_preimage_zero.1 inferInstance c hc.1 |
162 | | - refine ⟨⟨f ∘ e, f.continuous.comp he.continuous⟩, ?_, (range_comp_subset_range e f).trans hf⟩ |
163 | | - ext x |
164 | | - refine ⟨fun hx => ?_, fun hx => ?_⟩ |
165 | | - · have hx' : e x ∈ e '' t := by grind |
166 | | - simp_all |
167 | | - · have hx' : e x ∈ e '' t := by simp_all |
168 | | - exact he.injective.mem_set_image.1 hx' |
169 | | - |
170 | | -instance {s : Set X} [PerfectlyNormalSpace X] : PerfectlyNormalSpace s := |
171 | | - IsEmbedding.subtypeVal.perfectlyNormalSpace |
172 | | - |
173 | 72 | /-- Lemma that allows the easy conclusion that perfectly normal spaces are completely normal. -/ |
174 | 73 | theorem Disjoint.hasSeparatingCover_closed_gdelta_right {s t : Set X} [NormalSpace X] |
175 | 74 | (st_dis : Disjoint s t) (t_cl : IsClosed t) (t_gd : IsGδ t) : HasSeparatingCover s t := by |
@@ -208,6 +107,10 @@ instance (priority := 100) PerfectlyNormalSpace.toCompletelyNormalSpace |
208 | 107 | ((Disjoint.symm hd₁).hasSeparatingCover_closed_gdelta_right isClosed_closure <| |
209 | 108 | closed_gdelta isClosed_closure).mono (fun ⦃_⦄ a ↦ a) subset_closure⟩ |
210 | 109 |
|
| 110 | +/-- In a perfectly normal space, all closed sets are Gδ. -/ |
| 111 | +theorem IsClosed.isGδ [PerfectlyNormalSpace X] {s : Set X} (hs : IsClosed s) : IsGδ s := |
| 112 | + PerfectlyNormalSpace.closed_gdelta hs |
| 113 | + |
211 | 114 | instance (priority := 100) [PerfectlyNormalSpace X] : R0Space X where |
212 | 115 | specializes_symm.symm x y hxy := by |
213 | 116 | rw [specializes_iff_forall_closed] |
|
0 commit comments