@@ -5,7 +5,7 @@ Authors: Sébastien Gouëzel
55-/
66import Mathlib.Analysis.SpecificLimits.Basic
77import Mathlib.Topology.MetricSpace.HausdorffDistance
8- import Mathlib.Topology.Sets.Compacts
8+ import Mathlib.Topology.UniformSpace.Closeds
99
1010/-!
1111# Closed subsets
@@ -30,15 +30,62 @@ namespace EMetric
3030
3131section
3232
33+ variable {α : Type *} [PseudoEMetricSpace α]
34+
35+ theorem mem_hausdorffEntourage_of_hausdorffEdist_lt {s t : Set α} {δ : ℝ≥0 ∞}
36+ (h : hausdorffEdist s t < δ) : (s, t) ∈ hausdorffEntourage {p | edist p.1 p.2 < δ} := by
37+ rw [hausdorffEdist, max_lt_iff] at h
38+ rw [hausdorffEntourage, Set.mem_setOf]
39+ conv => enter [2 , 2 , 1 , 1 , _]; rw [edist_comm]
40+ have {s t : Set α} (h : ⨆ x ∈ s, infEdist x t < δ) :
41+ s ⊆ SetRel.preimage {p | edist p.1 p.2 < δ} t := by
42+ intro x hx
43+ have := (le_iSup₂ x hx).trans_lt h
44+ simp_rw [infEdist, iInf_lt_iff, exists_prop] at this
45+ exact this
46+ exact ⟨this h.1 , this h.2 ⟩
47+
48+ theorem hausdorffEdist_le_of_mem_hausdorffEntourage {s t : Set α} {δ : ℝ≥0 ∞}
49+ (h : (s, t) ∈ hausdorffEntourage {p | edist p.1 p.2 ≤ δ}) : hausdorffEdist s t ≤ δ := by
50+ rw [hausdorffEdist, max_le_iff]
51+ rw [hausdorffEntourage, Set.mem_setOf] at h
52+ conv at h => enter [2 , 2 , 1 , 1 , _]; rw [edist_comm]
53+ have {s t : Set α} (h : s ⊆ SetRel.preimage {p | edist p.1 p.2 ≤ δ} t) :
54+ ⨆ x ∈ s, infEdist x t ≤ δ := by
55+ rw [iSup₂_le_iff]
56+ intro x hx
57+ obtain ⟨y, hy, hxy⟩ := h hx
58+ refine iInf₂_le_of_le y hy hxy
59+ exact ⟨this h.1 , this h.2 ⟩
60+
61+ /-- The Hausdorff pseudo emetric on the powerset of a pseudo emetric space.
62+ See note [reducible non-instances]. -/
63+ protected abbrev _root_.PseudoEMetricSpace.hausdorff : PseudoEMetricSpace (Set α) where
64+ edist s t := hausdorffEdist s t
65+ edist_self _ := hausdorffEdist_self
66+ edist_comm _ _ := hausdorffEdist_comm
67+ edist_triangle _ _ _ := hausdorffEdist_triangle
68+ toUniformSpace := .hausdorff
69+ uniformity_edist := by
70+ refine le_antisymm
71+ (le_iInf₂ fun ε hε => Filter.le_principal_iff.mpr ?_)
72+ (uniformity_basis_edist.lift' monotone_hausdorffEntourage |>.ge_iff.mpr fun ε hε =>
73+ Filter.mem_iInf_of_mem ε <| Filter.mem_iInf_of_mem hε fun _ =>
74+ mem_hausdorffEntourage_of_hausdorffEdist_lt)
75+ obtain ⟨δ, hδ, hδε⟩ := exists_between hε
76+ filter_upwards [Filter.mem_lift' (uniformity_basis_edist_le.mem_of_mem hδ)]
77+ with _ h using hδε.trans_le' <| hausdorffEdist_le_of_mem_hausdorffEntourage h
78+
79+ end
80+
81+ section
82+
3383variable {α β : Type *} [EMetricSpace α] [EMetricSpace β] {s : Set α}
3484
3585/-- In emetric spaces, the Hausdorff edistance defines an emetric space structure
3686on the type of closed subsets -/
3787instance Closeds.emetricSpace : EMetricSpace (Closeds α) where
38- edist s t := hausdorffEdist (s : Set α) t
39- edist_self _ := hausdorffEdist_self
40- edist_comm _ _ := hausdorffEdist_comm
41- edist_triangle _ _ _ := hausdorffEdist_triangle
88+ __ := PseudoEMetricSpace.hausdorff.induced SetLike.coe
4289 eq_of_edist_eq_zero {s t} h :=
4390 Closeds.ext <| (hausdorffEdist_zero_iff_eq_of_closed s.isClosed t.isClosed).1 h
4491
@@ -59,20 +106,11 @@ theorem continuous_infEdist_hausdorffEdist :
59106 _ = infEdist y t + 2 * edist (x, s) (y, t) := by rw [← mul_two, mul_comm]
60107
61108/-- Subsets of a given closed subset form a closed set -/
62- theorem Closeds.isClosed_subsets_of_isClosed (hs : IsClosed s) :
63- IsClosed { t : Closeds α | (t : Set α) ⊆ s } := by
64- refine isClosed_of_closure_subset fun
65- (t : Closeds α) (ht : t ∈ closure {t : Closeds α | (t : Set α) ⊆ s}) (x : α) (hx : x ∈ t) => ?_
66- have : x ∈ closure s := by
67- refine mem_closure_iff.2 fun ε εpos => ?_
68- obtain ⟨u : Closeds α, hu : u ∈ {t : Closeds α | (t : Set α) ⊆ s}, Dtu : edist t u < ε⟩ :=
69- mem_closure_iff.1 ht ε εpos
70- obtain ⟨y : α, hy : y ∈ u, Dxy : edist x y < ε⟩ := exists_edist_lt_of_hausdorffEdist_lt hx Dtu
71- exact ⟨y, hu hy, Dxy⟩
72- rwa [hs.closure_eq] at this
109+ @ [deprecated (since := "2025-11-05" )]
110+ alias Closeds.isClosed_subsets_of_isClosed := TopologicalSpace.Closeds.isClosed_subsets_of_isClosed
73111
74112@ [deprecated (since := "2025-08-20" )]
75- alias isClosed_subsets_of_isClosed := Closeds.isClosed_subsets_of_isClosed
113+ alias isClosed_subsets_of_isClosed := TopologicalSpace. Closeds.isClosed_subsets_of_isClosed
76114
77115/-- By definition, the edistance on `Closeds α` is given by the Hausdorff edistance -/
78116theorem Closeds.edist_eq {s t : Closeds α} : edist s t = hausdorffEdist (s : Set α) t :=
@@ -231,10 +269,7 @@ namespace NonemptyCompacts
231269/-- In an emetric space, the type of non-empty compact subsets is an emetric space,
232270where the edistance is the Hausdorff edistance -/
233271instance emetricSpace : EMetricSpace (NonemptyCompacts α) where
234- edist s t := hausdorffEdist (s : Set α) t
235- edist_self _ := hausdorffEdist_self
236- edist_comm _ _ := hausdorffEdist_comm
237- edist_triangle _ _ _ := hausdorffEdist_triangle
272+ __ := PseudoEMetricSpace.hausdorff.induced SetLike.coe
238273 eq_of_edist_eq_zero {s t} h := NonemptyCompacts.ext <| by
239274 have : closure (s : Set α) = closure t := hausdorffEdist_zero_iff_closure_eq_closure.1 h
240275 rwa [s.isCompact.isClosed.closure_eq, t.isCompact.isClosed.closure_eq] at this
@@ -244,21 +279,18 @@ theorem isometry_toCloseds : Isometry (@NonemptyCompacts.toCloseds α _ _) :=
244279 fun _ _ => rfl
245280
246281/-- `NonemptyCompacts.toCloseds` is a uniform embedding (as it is an isometry) -/
247- theorem isUniformEmbedding_toCloseds :
248- IsUniformEmbedding (@NonemptyCompacts.toCloseds α _ _) :=
249- isometry_toCloseds.isUniformEmbedding
282+ @ [deprecated (since := "2025-11-05" )]
283+ alias isUniformEmbedding_toCloseds := TopologicalSpace.NonemptyCompacts.isUniformEmbedding_toCloseds
250284
251285@ [deprecated (since := "2025-08-20" )]
252- alias ToCloseds.isUniformEmbedding := isUniformEmbedding_toCloseds
286+ alias ToCloseds.isUniformEmbedding := TopologicalSpace.NonemptyCompacts. isUniformEmbedding_toCloseds
253287
254288/-- `NonemptyCompacts.toCloseds` is continuous (as it is an isometry) -/
255- @[fun_prop]
256- theorem continuous_toCloseds : Continuous (@NonemptyCompacts.toCloseds α _ _) :=
257- isometry_toCloseds.continuous
289+ @ [deprecated (since := "2025-11-05" )]
290+ alias continuous_toCloseds := TopologicalSpace.NonemptyCompacts.continuous_toCloseds
258291
259- lemma isClosed_subsets_of_isClosed (hs : IsClosed s) :
260- IsClosed {A : NonemptyCompacts α | (A : Set α) ⊆ s} :=
261- (Closeds.isClosed_subsets_of_isClosed hs).preimage continuous_toCloseds
292+ @ [deprecated (since := "2025-11-05" )]
293+ alias isClosed_subsets_of_isClosed := TopologicalSpace.NonemptyCompacts.isClosed_subsets_of_isClosed
262294
263295/-- The range of `NonemptyCompacts.toCloseds` is closed in a complete space -/
264296theorem isClosed_in_closeds [CompleteSpace α] :
0 commit comments