|
| 1 | +/- |
| 2 | +Copyright (c) 2025 Yaël Dillies. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Yaël Dillies |
| 5 | +-/ |
| 6 | +import Mathlib.Data.Rel.Separated |
| 7 | + |
| 8 | +/-! |
| 9 | +# Covers in a uniform space |
| 10 | +
|
| 11 | +This file defines covers, aka nets, which are a quantitative notion of compactness given an |
| 12 | +entourage. |
| 13 | +
|
| 14 | +A `U`-cover of a set `s` is a set `N` such that every element of `s` is `U`-close to some element of |
| 15 | +`N`. |
| 16 | +
|
| 17 | +The concept of uniform covers can be used to define two further notions of covering: |
| 18 | +* Metric covers: `Metric.IsCover`, defined using the distance entourage. |
| 19 | +* Dynamical covers: `Dynamics.IsDynCoverOf`, defined using the dynamical entourage. |
| 20 | +
|
| 21 | +## References |
| 22 | +
|
| 23 | +[R. Vershynin, *High Dimensional Probability*][vershynin2018high], Section 4.2. |
| 24 | +-/ |
| 25 | + |
| 26 | +open Set |
| 27 | + |
| 28 | +namespace SetRel |
| 29 | +variable {X : Type*} {U V : SetRel X X} {s t N N₁ N₂ : Set X} {x : X} |
| 30 | + |
| 31 | +/-- For an entourage `U`, a set `N` is a *`U`-cover* of a set `s` if every point of `s` is `U`-close |
| 32 | +to some point of `N`. |
| 33 | +
|
| 34 | +This is also called a *`U`-net* in the literature. |
| 35 | +
|
| 36 | +[R. Vershynin, *High Dimensional Probability*][vershynin2018high], 4.2.1. -/ |
| 37 | +def IsCover (U : SetRel X X) (s N : Set X) : Prop := ∀ ⦃x⦄, x ∈ s → ∃ y ∈ N, x ~[U] y |
| 38 | + |
| 39 | +@[simp] lemma IsCover.empty : IsCover U ∅ N := by simp [IsCover] |
| 40 | + |
| 41 | +@[simp] lemma isCover_empty_right : IsCover U s ∅ ↔ s = ∅ := by |
| 42 | + simp [IsCover, eq_empty_iff_forall_notMem] |
| 43 | + |
| 44 | +protected nonrec lemma IsCover.nonempty (hsN : IsCover U s N) (hs : s.Nonempty) : N.Nonempty := |
| 45 | + let ⟨_x, hx⟩ := hs; let ⟨y, hy, _⟩ := hsN hx; ⟨y, hy⟩ |
| 46 | + |
| 47 | +@[simp] protected lemma isCover_univ : IsCover univ s N ↔ (s.Nonempty → N.Nonempty) := by |
| 48 | + simp [IsCover, Set.Nonempty] |
| 49 | + |
| 50 | +lemma IsCover.mono (hN : N₁ ⊆ N₂) (h₁ : IsCover U s N₁) : IsCover U s N₂ := |
| 51 | + fun _x hx ↦ let ⟨y, hy, hxy⟩ := h₁ hx; ⟨y, hN hy, hxy⟩ |
| 52 | + |
| 53 | +lemma IsCover.anti (hst : s ⊆ t) (ht : IsCover U t N) : IsCover U s N := fun _x hx ↦ ht <| hst hx |
| 54 | + |
| 55 | +lemma IsCover.mono_entourage (hUV : U ⊆ V) (hU : IsCover U s N) : IsCover V s N := |
| 56 | + fun _x hx ↦ let ⟨y, hy, hxy⟩ := hU hx; ⟨y, hy, hUV hxy⟩ |
| 57 | + |
| 58 | +/-- A maximal `U`-separated subset of a set `s` is a `U`-cover of `s`. |
| 59 | +
|
| 60 | +[R. Vershynin, *High Dimensional Probability*][vershynin2018high], 4.2.6. -/ |
| 61 | +lemma IsCover.of_maximal_isSeparated [U.IsRefl] [U.IsSymm] |
| 62 | + (hN : Maximal (fun N ↦ N ⊆ s ∧ IsSeparated U N) N) : IsCover U s N := by |
| 63 | + rintro x hx |
| 64 | + by_contra! h |
| 65 | + simpa [U.rfl] using h _ <| hN.2 (y := insert x N) ⟨by simp [insert_subset_iff, hx, hN.1.1], |
| 66 | + hN.1.2.insert fun y hy hxy ↦ (h y hy hxy).elim⟩ (subset_insert _ _) (mem_insert _ _) |
| 67 | + |
| 68 | +@[simp] lemma isCover_relId : IsCover .id s N ↔ s ⊆ N := by simp [IsCover, subset_def] |
| 69 | + |
| 70 | +end SetRel |
0 commit comments