@@ -3,10 +3,8 @@ Copyright (c) 2022 Felix Weilacher. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Felix Weilacher
5
5
-/
6
- import Mathlib.Topology.MetricSpace.Polish
7
- import Mathlib.Topology.MetricSpace.CantorScheme
8
6
9
- #align_import topology.perfect from "leanprover-community/mathlib" @ "3905fa80e62c0898131285baab35559fbc4e5cda"
7
+ import Mathlib.Topology.Separation
10
8
11
9
/-!
12
10
# Perfect Sets
@@ -27,8 +25,6 @@ including a version of the Cantor-Bendixson Theorem.
27
25
* `exists_countable_union_perfect_of_isClosed`: One version of the **Cantor-Bendixson Theorem** :
28
26
A closed set in a second countable space can be written as the union of a countable set and a
29
27
perfect set.
30
- * `Perfect.exists_nat_bool_injection`: A perfect nonempty set in a complete metric space
31
- admits an embedding from the Cantor space.
32
28
33
29
## Implementation Notes
34
30
@@ -38,6 +34,11 @@ We define a nonstandard predicate, `Preperfect`, which drops the closed-ness req
38
34
from the definition of perfect. In T1 spaces, this is equivalent to having a perfect closure,
39
35
see `preperfect_iff_perfect_closure`.
40
36
37
+ ## See also
38
+
39
+ `Mathlib.Topology.MetricSpace.Perfect`, for properties of perfect sets in metric spaces,
40
+ namely Polish spaces.
41
+
41
42
## References
42
43
43
44
* [ kechris1995 ] (Chapters 6-7)
@@ -214,112 +215,3 @@ theorem exists_perfect_nonempty_of_isClosed_of_not_countable [SecondCountableTop
214
215
end Kernel
215
216
216
217
end Basic
217
-
218
- section CantorInjMetric
219
-
220
- open Function ENNReal
221
-
222
- variable {α : Type *} [MetricSpace α] {C : Set α} (hC : Perfect C) {ε : ℝ≥0 ∞}
223
-
224
- private theorem Perfect.small_diam_aux (ε_pos : 0 < ε) {x : α} (xC : x ∈ C) :
225
- let D := closure (EMetric.ball x (ε / 2 ) ∩ C)
226
- Perfect D ∧ D.Nonempty ∧ D ⊆ C ∧ EMetric.diam D ≤ ε := by
227
- have : x ∈ EMetric.ball x (ε / 2 ) := by
228
- apply EMetric.mem_ball_self
229
- rw [ENNReal.div_pos_iff]
230
- exact ⟨ne_of_gt ε_pos, by norm_num⟩
231
- have := hC.closure_nhds_inter x xC this EMetric.isOpen_ball
232
- refine' ⟨this.1 , this.2 , _, _⟩
233
- · rw [IsClosed.closure_subset_iff hC.closed]
234
- apply inter_subset_right
235
- rw [EMetric.diam_closure]
236
- apply le_trans (EMetric.diam_mono (inter_subset_left _ _))
237
- convert EMetric.diam_ball (x := x)
238
- rw [mul_comm, ENNReal.div_mul_cancel] <;> norm_num
239
-
240
- variable (hnonempty : C.Nonempty)
241
-
242
- /-- A refinement of `Perfect.splitting` for metric spaces, where we also control
243
- the diameter of the new perfect sets. -/
244
- theorem Perfect.small_diam_splitting (ε_pos : 0 < ε) :
245
- ∃ C₀ C₁ : Set α, (Perfect C₀ ∧ C₀.Nonempty ∧ C₀ ⊆ C ∧ EMetric.diam C₀ ≤ ε) ∧
246
- (Perfect C₁ ∧ C₁.Nonempty ∧ C₁ ⊆ C ∧ EMetric.diam C₁ ≤ ε) ∧ Disjoint C₀ C₁ := by
247
- rcases hC.splitting hnonempty with ⟨D₀, D₁, ⟨perf0, non0, sub0⟩, ⟨perf1, non1, sub1⟩, hdisj⟩
248
- cases' non0 with x₀ hx₀
249
- cases' non1 with x₁ hx₁
250
- rcases perf0.small_diam_aux ε_pos hx₀ with ⟨perf0', non0', sub0', diam0⟩
251
- rcases perf1.small_diam_aux ε_pos hx₁ with ⟨perf1', non1', sub1', diam1⟩
252
- refine'
253
- ⟨closure (EMetric.ball x₀ (ε / 2 ) ∩ D₀), closure (EMetric.ball x₁ (ε / 2 ) ∩ D₁),
254
- ⟨perf0', non0', sub0'.trans sub0, diam0⟩, ⟨perf1', non1', sub1'.trans sub1, diam1⟩, _⟩
255
- apply Disjoint.mono _ _ hdisj <;> assumption
256
- #align perfect.small_diam_splitting Perfect.small_diam_splitting
257
-
258
- open CantorScheme
259
-
260
- /-- Any nonempty perfect set in a complete metric space admits a continuous injection
261
- from the Cantor space, `ℕ → Bool`. -/
262
- theorem Perfect.exists_nat_bool_injection [CompleteSpace α] :
263
- ∃ f : (ℕ → Bool) → α, range f ⊆ C ∧ Continuous f ∧ Injective f := by
264
- obtain ⟨u, -, upos', hu⟩ := exists_seq_strictAnti_tendsto' (zero_lt_one' ℝ≥0 ∞)
265
- have upos := fun n => (upos' n).1
266
- let P := Subtype fun E : Set α => Perfect E ∧ E.Nonempty
267
- choose C0 C1 h0 h1 hdisj using
268
- fun {C : Set α} (hC : Perfect C) (hnonempty : C.Nonempty) {ε : ℝ≥0 ∞} (hε : 0 < ε) =>
269
- hC.small_diam_splitting hnonempty hε
270
- let DP : List Bool → P := fun l => by
271
- induction' l with a l ih; · exact ⟨C, ⟨hC, hnonempty⟩⟩
272
- cases a
273
- · use C0 ih.property.1 ih.property.2 (upos l.length.succ)
274
- exact ⟨(h0 _ _ _).1 , (h0 _ _ _).2 .1 ⟩
275
- use C1 ih.property.1 ih.property.2 (upos l.length.succ)
276
- exact ⟨(h1 _ _ _).1 , (h1 _ _ _).2 .1 ⟩
277
- let D : List Bool → Set α := fun l => (DP l).val
278
- have hanti : ClosureAntitone D := by
279
- refine' Antitone.closureAntitone _ fun l => (DP l).property.1 .closed
280
- intro l a
281
- cases a
282
- · exact (h0 _ _ _).2 .2 .1
283
- exact (h1 _ _ _).2 .2 .1
284
- have hdiam : VanishingDiam D := by
285
- intro x
286
- apply tendsto_of_tendsto_of_tendsto_of_le_of_le' tendsto_const_nhds hu
287
- · simp
288
- rw [eventually_atTop]
289
- refine' ⟨1 , fun m (hm : 1 ≤ m) => _⟩
290
- rw [Nat.one_le_iff_ne_zero] at hm
291
- rcases Nat.exists_eq_succ_of_ne_zero hm with ⟨n, rfl⟩
292
- dsimp
293
- cases x n
294
- · convert (h0 _ _ _).2 .2 .2
295
- rw [PiNat.res_length]
296
- convert (h1 _ _ _).2 .2 .2
297
- rw [PiNat.res_length]
298
- have hdisj' : CantorScheme.Disjoint D := by
299
- rintro l (a | a) (b | b) hab <;> try contradiction
300
- · exact hdisj _ _ _
301
- exact (hdisj _ _ _).symm
302
- have hdom : ∀ {x : ℕ → Bool}, x ∈ (inducedMap D).1 := fun {x} => by
303
- rw [hanti.map_of_vanishingDiam hdiam fun l => (DP l).property.2 ]
304
- apply mem_univ
305
- refine' ⟨fun x => (inducedMap D).2 ⟨x, hdom⟩, _, _, _⟩
306
- · rintro y ⟨x, rfl⟩
307
- exact map_mem ⟨_, hdom⟩ 0
308
- · apply hdiam.map_continuous.comp
309
- continuity
310
- intro x y hxy
311
- simpa only [← Subtype.val_inj] using hdisj'.map_injective hxy
312
- #align perfect.exists_nat_bool_injection Perfect.exists_nat_bool_injection
313
-
314
- end CantorInjMetric
315
-
316
- /-- Any closed uncountable subset of a Polish space admits a continuous injection
317
- from the Cantor space `ℕ → Bool`.-/
318
- theorem IsClosed.exists_nat_bool_injection_of_not_countable {α : Type *} [TopologicalSpace α]
319
- [PolishSpace α] {C : Set α} (hC : IsClosed C) (hunc : ¬C.Countable) :
320
- ∃ f : (ℕ → Bool) → α, range f ⊆ C ∧ Continuous f ∧ Function.Injective f := by
321
- letI := upgradePolishSpace α
322
- obtain ⟨D, hD, Dnonempty, hDC⟩ := exists_perfect_nonempty_of_isClosed_of_not_countable hC hunc
323
- obtain ⟨f, hfD, hf⟩ := hD.exists_nat_bool_injection Dnonempty
324
- exact ⟨f, hfD.trans hDC, hf⟩
325
- #align is_closed.exists_nat_bool_injection_of_not_countable IsClosed.exists_nat_bool_injection_of_not_countable
0 commit comments