Skip to content

Commit d765d78

Browse files
committed
feat(Topology/UniformSpace/Closeds): completeness of (Nonempty)Compacts
This PR generalizes the completeness result of `NonemptyCompacts` from metric spaces to uniform spaces.
1 parent e2a36ed commit d765d78

File tree

3 files changed

+91
-8
lines changed

3 files changed

+91
-8
lines changed

Mathlib/Topology/MetricSpace/Closeds.lean

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -272,13 +272,6 @@ theorem isClosed_in_closeds [CompleteSpace α] :
272272
_ = ε := ENNReal.add_halves _
273273
exact mem_biUnion hy this
274274

275-
/-- In a complete space, the type of nonempty compact subsets is complete. This follows
276-
from the same statement for closed subsets -/
277-
instance instCompleteSpace [CompleteSpace α] : CompleteSpace (NonemptyCompacts α) :=
278-
(completeSpace_iff_isComplete_range
279-
isometry_toCloseds.isUniformInducing).2 <|
280-
isClosed_in_closeds.isComplete
281-
282275
/-- In a compact space, the type of nonempty compact subsets is compact. This follows from
283276
the same statement for closed subsets -/
284277
instance instCompactSpace [CompactSpace α] : CompactSpace (NonemptyCompacts α) :=

Mathlib/Topology/Sets/Compacts.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,14 @@ theorem mem_toCompacts {x : α} {s : NonemptyCompacts α} :
332332
theorem toCompacts_injective : Function.Injective (toCompacts (α := α)) :=
333333
.of_comp (f := SetLike.coe) SetLike.coe_injective
334334

335+
theorem range_toCompacts : range (toCompacts (α := α)) = {⊥}ᶜ := by
336+
ext K
337+
simp_rw [mem_compl_singleton_iff, ← SetLike.coe_set_eq.ne, Compacts.coe_bot,
338+
← nonempty_iff_ne_empty]
339+
refine ⟨?_, fun h => ⟨⟨K, h⟩, rfl⟩⟩
340+
rintro ⟨K, _, rfl⟩
341+
exact K.nonempty
342+
335343
instance : Max (NonemptyCompacts α) :=
336344
fun s t => ⟨s.toCompacts ⊔ t.toCompacts, s.nonempty.mono subset_union_left⟩⟩
337345

Mathlib/Topology/UniformSpace/Closeds.lean

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ public import Mathlib.Topology.Order.Lattice
99
public import Mathlib.Topology.Sets.Compacts
1010
public 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

2224
open Topology
23-
open scoped Uniformity
25+
open scoped Uniformity Filter
2426

2527
variable {α β : 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+
435484
end TopologicalSpace.Compacts
436485

437486
namespace TopologicalSpace.NonemptyCompacts
@@ -486,6 +535,16 @@ theorem isEmbedding_toCompacts : IsEmbedding (toCompacts (α := α)) :=
486535
theorem 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+
489548
theorem 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+
532614
end TopologicalSpace.NonemptyCompacts

0 commit comments

Comments
 (0)