|
| 1 | +/- |
| 2 | +Copyright (c) 2024 Antoine Chambert-Loir, María Inés de Frutos Fernández. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Johannes Hölzl, Mario Carneiro, Antoine Chambert-Loir, María Inés de Frutos Fernández |
| 5 | +-/ |
| 6 | +import Mathlib.Topology.UniformSpace.Cauchy |
| 7 | +import Mathlib.Topology.Algebra.UniformGroup.Defs |
| 8 | + |
| 9 | +/-! # Discrete uniformity |
| 10 | +
|
| 11 | +The discrete uniformity is the smallest possible uniformity, the one for which |
| 12 | +the diagonal is an entourage of itself. |
| 13 | +
|
| 14 | +It induces the discrete topology. |
| 15 | +
|
| 16 | +It is complete. |
| 17 | +
|
| 18 | +-/ |
| 19 | + |
| 20 | +open Filter UniformSpace |
| 21 | + |
| 22 | +/-- The discrete uniformity -/ |
| 23 | +@[mk_iff discreteUniformity_iff_eq_bot] |
| 24 | +class DiscreteUniformity (X : Type*) [u : UniformSpace X] : Prop where |
| 25 | + eq_bot : u = ⊥ |
| 26 | + |
| 27 | +namespace DiscreteUniformity |
| 28 | + |
| 29 | +/-- The bot uniformity is the discrete uniformity. -/ |
| 30 | +instance (X : Type*) : @DiscreteUniformity X ⊥ := |
| 31 | + @DiscreteUniformity.mk X ⊥ rfl |
| 32 | + |
| 33 | +variable (X : Type*) [u : UniformSpace X] [DiscreteUniformity X] |
| 34 | + |
| 35 | +theorem _root_.discreteUniformity_iff_eq_principal_idRel {X : Type*} [UniformSpace X] : |
| 36 | + DiscreteUniformity X ↔ uniformity X = principal idRel := by |
| 37 | + rw [discreteUniformity_iff_eq_bot, UniformSpace.ext_iff, Filter.ext_iff, bot_uniformity] |
| 38 | + |
| 39 | +theorem eq_principal_idRel : uniformity X = principal idRel := |
| 40 | + discreteUniformity_iff_eq_principal_idRel.mp inferInstance |
| 41 | + |
| 42 | +/-- The discrete uniformity induces the discrete topology. -/ |
| 43 | +instance : DiscreteTopology X where |
| 44 | + eq_bot := by |
| 45 | + rw [DiscreteUniformity.eq_bot (X := X), UniformSpace.toTopologicalSpace_bot] |
| 46 | + |
| 47 | +theorem _root_.discreteUniformity_iff_idRel_mem_uniformity {X : Type*} [UniformSpace X] : |
| 48 | + DiscreteUniformity X ↔ idRel ∈ uniformity X := by |
| 49 | + rw [← uniformSpace_eq_bot, discreteUniformity_iff_eq_bot] |
| 50 | + |
| 51 | +theorem idRel_mem_uniformity : idRel ∈ uniformity X := |
| 52 | + discreteUniformity_iff_idRel_mem_uniformity.mp inferInstance |
| 53 | + |
| 54 | +variable {X} in |
| 55 | +/-- A product of spaces with discrete uniformity has a discrete uniformity. -/ |
| 56 | +instance {Y : Type*} [UniformSpace Y] [DiscreteUniformity Y] : |
| 57 | + DiscreteUniformity (X × Y) := by |
| 58 | + simp [discreteUniformity_iff_eq_principal_idRel, uniformity_prod_eq_comap_prod, |
| 59 | + eq_principal_idRel, idRel, Set.prod_eq, Prod.ext_iff, Set.setOf_and] |
| 60 | + |
| 61 | +variable {x} in |
| 62 | +/-- On a space with a discrete uniformity, any function is uniformly continuous. -/ |
| 63 | +theorem uniformContinuous {Y : Type*} [UniformSpace Y] (f : X → Y) : |
| 64 | + UniformContinuous f := by |
| 65 | + simp only [uniformContinuous_iff, DiscreteUniformity.eq_bot, bot_le] |
| 66 | + |
| 67 | +/-- The discrete uniformity makes a group a `UniformGroup. -/ |
| 68 | +@[to_additive "The discrete uniformity makes an additive group a `UniformAddGroup`."] |
| 69 | +instance [Group X] : UniformGroup X where |
| 70 | + uniformContinuous_div := uniformContinuous (X × X) fun p ↦ p.1 / p.2 |
| 71 | + |
| 72 | +variable {X} in |
| 73 | +/-- A Cauchy filter in a discrete uniform space is contained in the principal filter |
| 74 | +of a point. -/ |
| 75 | +theorem eq_pure_of_cauchy {α : Filter X} (hα : Cauchy α) : ∃ x : X, α = pure x := by |
| 76 | + rcases hα with ⟨α_ne_bot, α_le⟩ |
| 77 | + simp only [DiscreteUniformity.eq_principal_idRel, le_principal_iff, mem_prod_iff] at α_le |
| 78 | + obtain ⟨S, ⟨hS, ⟨T, ⟨hT, H⟩⟩⟩⟩ := α_le |
| 79 | + obtain ⟨x, rfl⟩ := eq_singleton_left_of_prod_subset_idRel (α_ne_bot.nonempty_of_mem hS) |
| 80 | + (Filter.nonempty_of_mem hT) H |
| 81 | + exact ⟨x, α_ne_bot.le_pure_iff.mp <| le_pure_iff.mpr hS⟩ |
| 82 | + |
| 83 | +@[deprecated (since := "2025-03-23")] |
| 84 | +alias _root_.UniformSpace.DiscreteUnif.cauchy_le_pure := eq_pure_of_cauchy |
| 85 | + |
| 86 | +/-- The discrete uniformity makes a space complete. -/ |
| 87 | +instance : CompleteSpace X where |
| 88 | + complete {f} hf := by |
| 89 | + obtain ⟨x, rfl⟩ := eq_pure_of_cauchy hf |
| 90 | + exact ⟨x, pure_le_nhds x⟩ |
| 91 | + |
| 92 | +variable {X} |
| 93 | + |
| 94 | +/-- A constant to which a Cauchy filter in a discrete uniform space converges. -/ |
| 95 | +noncomputable def cauchyConst {α : Filter X} (hα : Cauchy α) : X := |
| 96 | + (eq_pure_of_cauchy hα).choose |
| 97 | + |
| 98 | +@[deprecated (since := "2025-03-23")] |
| 99 | +alias _root_.UniformSpace.DiscreteUnif.cauchyConst := cauchyConst |
| 100 | + |
| 101 | +theorem eq_pure_cauchyConst {α : Filter X} (hα : Cauchy α) : α = pure (cauchyConst hα) := |
| 102 | + (eq_pure_of_cauchy hα).choose_spec |
| 103 | + |
| 104 | +@[deprecated (since := "2025-03-23")] |
| 105 | +alias _root_.UniformSpace.DiscreteUnif.eq_const_of_cauchy := eq_pure_cauchyConst |
| 106 | + |
| 107 | +end DiscreteUniformity |
0 commit comments