Skip to content

Commit 3bcc6e8

Browse files
committed
feat: totally bounded sets have finite covers (#31537)
New result: a totally bounded set has finite `ε`-covers for all `ε > 0`. I then use it to golf and generalize `exists_finite_isCover_of_isCompact_closure` and `exists_finite_isCover_of_isCompact` to extended pseudo-metric spaces. Co-authored-by: Remy Degenne <remydegenne@gmail.com>
1 parent 332bce4 commit 3bcc6e8

File tree

2 files changed

+36
-17
lines changed

2 files changed

+36
-17
lines changed

Mathlib/Data/Rel/Cover.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ def IsCover (U : SetRel X X) (s N : Set X) : Prop := ∀ ⦃x⦄, x ∈ s →
4444
protected nonrec lemma IsCover.nonempty (hsN : IsCover U s N) (hs : s.Nonempty) : N.Nonempty :=
4545
let ⟨_x, hx⟩ := hs; let ⟨y, hy, _⟩ := hsN hx; ⟨y, hy⟩
4646

47+
@[simp] lemma IsCover.refl (U : SetRel X X) [U.IsRefl] (s : Set X) : IsCover U s s :=
48+
fun a ha ↦ ⟨a, ha, U.rfl⟩
49+
50+
lemma IsCover.rfl {U : SetRel X X} [U.IsRefl] {s : Set X} : IsCover U s s := refl U s
51+
4752
@[simp] protected lemma isCover_univ : IsCover univ s N ↔ (s.Nonempty → N.Nonempty) := by
4853
simp [IsCover, Set.Nonempty]
4954

Mathlib/Topology/MetricSpace/Cover.lean

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,25 @@ def IsCover (ε : ℝ≥0) (s N : Set X) : Prop := SetRel.IsCover {(x, y) | edis
4545

4646
@[simp] protected nonrec lemma IsCover.empty : IsCover ε ∅ N := .empty
4747

48+
@[simp] lemma isCover_empty_right : IsCover ε s ∅ ↔ s = ∅ := SetRel.isCover_empty_right
49+
4850
protected nonrec lemma IsCover.nonempty (hsN : IsCover ε s N) (hs : s.Nonempty) : N.Nonempty :=
4951
hsN.nonempty hs
5052

53+
@[simp] lemma IsCover.refl (ε : ℝ≥0) (s : Set X) : IsCover ε s s := .rfl
54+
lemma IsCover.rfl {ε : ℝ≥0} {s : Set X} : IsCover ε s s := refl ε s
55+
5156
nonrec lemma IsCover.mono (hN : N₁ ⊆ N₂) (h₁ : IsCover ε s N₁) : IsCover ε s N₂ := h₁.mono hN
5257

5358
nonrec lemma IsCover.anti (hst : s ⊆ t) (ht : IsCover ε t N) : IsCover ε s N := ht.anti hst
5459

5560
lemma IsCover.mono_radius (hεδ : ε ≤ δ) (hε : IsCover ε s N) : IsCover δ s N :=
5661
hε.mono_entourage fun xy hxy ↦ by dsimp at *; exact le_trans hxy <| mod_cast hεδ
5762

63+
lemma IsCover.singleton_of_ediam_le (hA : EMetric.diam s ≤ ε) (hx : x ∈ s) :
64+
IsCover ε s ({x} : Set X) :=
65+
fun _ h_mem ↦ ⟨x, by simp, (EMetric.edist_le_diam_of_mem h_mem hx).trans hA⟩
66+
5867
lemma isCover_iff_subset_iUnion_emetricClosedBall :
5968
IsCover ε s N ↔ s ⊆ ⋃ y ∈ N, EMetric.closedBall y ε := by
6069
simp [IsCover, SetRel.IsCover, subset_def]
@@ -66,6 +75,28 @@ nonrec lemma IsCover.of_maximal_isSeparated (hN : Maximal (fun N ↦ N ⊆ s ∧
6675
IsCover ε s N :=
6776
.of_maximal_isSeparated <| by simpa [isSeparated_iff_setRelIsSeparated] using hN
6877

78+
/-- A totally bounded set has finite `ε`-covers for all `ε > 0`. -/
79+
lemma exists_finite_isCover_of_totallyBounded (hε : ε ≠ 0) (hs : TotallyBounded s) :
80+
∃ N ⊆ s, N.Finite ∧ IsCover ε s N := by
81+
rw [EMetric.totallyBounded_iff'] at hs
82+
obtain ⟨N, hNA, hN_finite, hN⟩ := hs ε (mod_cast hε.bot_lt)
83+
simp only [isCover_iff_subset_iUnion_emetricClosedBall]
84+
refine ⟨N, by simpa, by simpa, ?_⟩
85+
· refine hN.trans fun x hx ↦ ?_
86+
simp only [Set.mem_iUnion, EMetric.mem_ball, exists_prop, EMetric.mem_closedBall] at hx ⊢
87+
obtain ⟨y, hyN, hy⟩ := hx
88+
exact ⟨y, hyN, hy.le⟩
89+
90+
/-- A relatively compact set admits a finite cover. -/
91+
lemma exists_finite_isCover_of_isCompact_closure (hε : ε ≠ 0) (hs : IsCompact (closure s)) :
92+
∃ N ⊆ s, N.Finite ∧ IsCover ε s N :=
93+
exists_finite_isCover_of_totallyBounded hε (hs.totallyBounded.subset subset_closure)
94+
95+
/-- A compact set admits a finite cover. -/
96+
lemma exists_finite_isCover_of_isCompact (hε : ε ≠ 0) (hs : IsCompact s) :
97+
∃ N ⊆ s, N.Finite ∧ IsCover ε s N :=
98+
exists_finite_isCover_of_totallyBounded hε hs.totallyBounded
99+
69100
end PseudoEMetricSpace
70101

71102
section PseudoMetricSpace
@@ -77,23 +108,6 @@ lemma isCover_iff_subset_iUnion_closedBall : IsCover ε s N ↔ s ⊆ ⋃ y ∈
77108
alias ⟨IsCover.subset_iUnion_closedBall, IsCover.of_subset_iUnion_closedBall⟩ :=
78109
isCover_iff_subset_iUnion_closedBall
79110

80-
/-- A relatively compact set admits a finite cover. -/
81-
lemma exists_finite_isCover_of_isCompact_closure (hε : ε ≠ 0) (hs : IsCompact (closure s)) :
82-
∃ N ⊆ s, N.Finite ∧ IsCover ε s N := by
83-
obtain ⟨N, hNs, hN, hsN⟩ :=
84-
exists_finite_cover_balls_of_isCompact_closure hs (ε := ε) (by positivity)
85-
refine ⟨N, hNs, hN, .of_subset_iUnion_closedBall <| hsN.trans ?_⟩
86-
gcongr
87-
exact ball_subset_closedBall
88-
89-
/-- A compact set admits a finite cover. -/
90-
lemma exists_finite_isCover_of_isCompact (hε : ε ≠ 0) (hs : IsCompact s) :
91-
∃ N ⊆ s, N.Finite ∧ IsCover ε s N := by
92-
obtain ⟨N, hNs, hN, hsN⟩ := hs.finite_cover_balls (e := ε) (by positivity)
93-
refine ⟨N, hNs, hN, .of_subset_iUnion_closedBall <| hsN.trans ?_⟩
94-
gcongr
95-
exact ball_subset_closedBall
96-
97111
lemma IsCover.of_subset_cthickening_of_lt {δ : ℝ≥0} (hsN : s ⊆ cthickening ε N) (hεδ : ε < δ) :
98112
IsCover δ s N :=
99113
.of_subset_iUnion_closedBall <| hsN.trans (cthickening_subset_iUnion_closedBall_of_lt _

0 commit comments

Comments
 (0)