@@ -9,6 +9,8 @@ public import Mathlib.Topology.Order.Lattice
99public import Mathlib.Topology.Sets.Compacts
1010public import Mathlib.Topology.UniformSpace.UniformEmbedding
1111
12+ import Mathlib.Topology.UniformSpace.Compact
13+
1214/-!
1315# Hausdorff uniformity
1416
@@ -20,7 +22,7 @@ induced by the Hausdorff metric to hyperspaces of uniform spaces.
2022@[expose] public section
2123
2224open Topology
23- open scoped Uniformity
25+ open scoped Uniformity Filter
2426
2527variable {α β : Type *}
2628
@@ -432,6 +434,53 @@ theorem _root_.IsUniformEmbedding.compacts_map {f : α → β} (hf : IsUniformEm
432434 __ := hf.isUniformInducing.compacts_map
433435 injective := map_injective hf.uniformContinuous.continuous hf.injective
434436
437+ instance [CompleteSpace α] : CompleteSpace (Compacts α) := by
438+ refine ⟨fun {f} ⟨_, hf⟩ => ?_⟩
439+ grw [← Filter.curry_le_prod, (𝓤 α).basis_sets.uniformity_compacts.ge_iff] at hf
440+ change ∀ {U} (hU : U ∈ 𝓤 α), ∀ᶠ K in f, ∀ᶠ K' in f, (↑K, ↑K') ∈ hausdorffEntourage U at hf
441+ let l : Filter α := f.lift' fun s => ⋃ K ∈ s, K
442+ have hl : l.TotallyBounded := by
443+ intro U hU
444+ obtain ⟨V : SetRel α α, hV, hVU⟩ := comp_mem_uniformity_sets hU
445+ obtain ⟨K, hK⟩ := hf (symm_le_uniformity hV) |>.exists
446+ obtain ⟨t, ht₁, ht₂⟩ := K.isCompact.totallyBounded V hV
447+ rw [← SetRel.preimage_eq_biUnion] at ht₂
448+ refine ⟨t, ht₁, Filter.mem_of_superset (Filter.mem_lift' hK) ?_⟩
449+ rw [Set.iUnion₂_subset_iff]
450+ intro K' ⟨_, (hK' : ↑K' ⊆ V.preimage K)⟩
451+ grw [← hVU, SetRel.preimage_comp, ← ht₂, hK']
452+ let L : Compacts α := ⟨{x | ClusterPt x l}, hl.isCompact_setOf_clusterPt⟩
453+ exists L
454+ simp_rw [nhds_eq_comap_uniformity']
455+ rw [uniformity_hasBasis_closed.uniformity_compacts.comap _ |>.ge_iff]
456+ intro U ⟨hU₁, hU₂⟩
457+ filter_upwards [hf hU₁] with K hK
458+ simp_rw [Set.mem_preimage, Prod.map, id, mem_hausdorffEntourage]
459+ constructor
460+ · intro x hx
461+ let lx := l ⊓ 𝓟 (UniformSpace.ball x U)
462+ have hlx : lx.TotallyBounded := hl.mono inf_le_left
463+ have : lx.NeBot := by
464+ unfold lx l
465+ rw [Filter.lift'_inf_principal_eq, Filter.lift'_neBot_iff fun _ _ h =>
466+ Set.inter_subset_inter_left _ <| Set.biUnion_subset_biUnion_left h]
467+ intro s hs
468+ obtain ⟨K', ⟨h₁, -⟩, h₂⟩ := Filter.nonempty_of_mem <| Filter.inter_mem hK hs
469+ obtain ⟨y, hy, hxy⟩ := h₁ hx
470+ exact ⟨y, Set.mem_iUnion₂_of_mem h₂ hy, hxy⟩
471+ obtain ⟨y, hy⟩ := hlx.exists_clusterPt
472+ have hy₁ : ClusterPt y l := .of_inf_left hy
473+ have hy₂ : ClusterPt y (𝓟 (UniformSpace.ball x U)) := .of_inf_right hy
474+ rw [← mem_closure_iff_clusterPt, (UniformSpace.isClosed_ball x hU₂).closure_eq] at hy₂
475+ exact ⟨y, hy₁, hy₂⟩
476+ · intro x (hx : ClusterPt x l)
477+ rw [← (hU₂.relImage_of_isCompact K.isCompact).closure_eq, mem_closure_iff_clusterPt]
478+ refine hx.mono ?_
479+ rw [Filter.le_principal_iff]
480+ refine Filter.mem_of_superset (Filter.mem_lift' hK) ?_
481+ rw [Set.iUnion₂_subset_iff]
482+ exact fun _ ⟨_, h⟩ => h
483+
435484end TopologicalSpace.Compacts
436485
437486namespace TopologicalSpace.NonemptyCompacts
@@ -486,6 +535,16 @@ theorem isEmbedding_toCompacts : IsEmbedding (toCompacts (α := α)) :=
486535theorem continuous_toCompacts : Continuous (toCompacts (α := α)) :=
487536 uniformContinuous_toCompacts.continuous
488537
538+ @[fun_prop]
539+ theorem isClosedEmbedding_toCompacts : IsClosedEmbedding (toCompacts (α := α)) where
540+ __ := isEmbedding_toCompacts
541+ isClosed_range := by
542+ rw [range_toCompacts, isClosed_compl_iff]
543+ convert (UniformSpace.hausdorff.isClopen_singleton_empty (α := α))
544+ |>.isOpen.preimage Compacts.uniformContinuous_coe.continuous
545+ rw [← Compacts.coe_bot, ← Set.image_singleton (f := SetLike.coe),
546+ SetLike.coe_injective.preimage_image]
547+
489548theorem isOpen_inter_nonempty_of_isOpen {s : Set α} (hs : IsOpen s) :
490549 IsOpen {t : NonemptyCompacts α | ((t : Set α) ∩ s).Nonempty} :=
491550 isOpen_induced (UniformSpace.hausdorff.isOpen_inter_nonempty_of_isOpen hs)
@@ -529,4 +588,27 @@ theorem _root_.IsUniformEmbedding.nonemptyCompacts_map {f : α → β} (hf : IsU
529588 __ := hf.isUniformInducing.nonemptyCompacts_map
530589 injective := map_injective hf.uniformContinuous.continuous hf.injective
531590
591+ instance [CompleteSpace α] : CompleteSpace (NonemptyCompacts α) :=
592+ isUniformEmbedding_toCompacts.completeSpace isClosedEmbedding_toCompacts.isClosed_range.isComplete
593+
594+ @[simp]
595+ theorem completeSpace_iff : CompleteSpace (NonemptyCompacts α) ↔ CompleteSpace α := by
596+ refine ⟨fun _ => ⟨fun {f} hf => ?_⟩, fun _ => inferInstance⟩
597+ obtain ⟨K, hK⟩ := CompleteSpace.complete <| hf.map uniformContinuous_singleton
598+ obtain ⟨x, hx⟩ := K.nonempty
599+ exists x
600+ rw [(nhds_basis_opens x).ge_iff]
601+ intro U ⟨hxU, hU⟩
602+ filter_upwards [hK <| (isOpen_inter_nonempty_of_isOpen hU).mem_nhds ⟨x, hx, hxU⟩]
603+ simp
604+
605+ @[simp]
606+ theorem _root_.TopologicalSpace.Compacts.completeSpace_iff :
607+ CompleteSpace (Compacts α) ↔ CompleteSpace α where
608+ mp _ :=
609+ NonemptyCompacts.completeSpace_iff.mp <|
610+ NonemptyCompacts.isUniformEmbedding_toCompacts.completeSpace
611+ isClosedEmbedding_toCompacts.isClosed_range.isComplete
612+ mpr _ := inferInstance
613+
532614end TopologicalSpace.NonemptyCompacts
0 commit comments