|
| 1 | +/- |
| 2 | +Copyright (c) 2021 Adam Topaz. All rights reserved. |
| 3 | +Released under Apache 2.0 license as described in the file LICENSE. |
| 4 | +Authors: Calle Sönne, Adam Topaz |
| 5 | +-/ |
| 6 | +import topology.separation |
| 7 | +import topology.subset_properties |
| 8 | +import topology.locally_constant.basic |
| 9 | + |
| 10 | +/-! |
| 11 | +
|
| 12 | +# Discrete quotients of a topological space. |
| 13 | +
|
| 14 | +This file defines the type of discrete quotients of a topological space, |
| 15 | +denoted `discrete_quotient X`. To avoid quantifying over types, we model such |
| 16 | +quotients as setoids whose equivalence classes are clopen. |
| 17 | +
|
| 18 | +## Definitions |
| 19 | +1. `discrete_quotient X` is the type of discrete quotients of `X`. |
| 20 | + It is endowed with a coercion to `Type`, which is defined as the |
| 21 | + quotient associated to the setoid in question, and each such quotient |
| 22 | + is endowed with the discrete topology. |
| 23 | +2. Given `S : discrete_quotient X`, the projection `X → S` is denoted |
| 24 | + `S.proj`. |
| 25 | +3. When `X` is compact and `S : discrete_quotient X`, the space `S` is |
| 26 | + endowed with a `fintype` instance. |
| 27 | +
|
| 28 | +## Order structure |
| 29 | +The type `discrete_quotient X` is endowed with an instance of a `semilattice_inf_top`. |
| 30 | +The partial ordering `A ≤ B` mathematically means that `B.proj` factors through `A.proj`. |
| 31 | +The top element `⊤` is the trivial quotient, meaning that every element of `X` is collapsed |
| 32 | +to a point. Given `h : A ≤ B`, the map `A → B` is `discrete_quotient.of_le h`. |
| 33 | +
|
| 34 | +## Theorems |
| 35 | +The two main results proved in this file are: |
| 36 | +1. `discrete_quotient.eq_of_proj_eq` which states that when `X` is compact, t2 and totally |
| 37 | + disconnected, any two elements of `X` agree if their projections in `Q` agree for all |
| 38 | + `Q : discrete_quotient X`. |
| 39 | +2. `discrete_quotient.exists_of_compat` which states that when `X` is compact, then any |
| 40 | + system of elements of `Q` as `Q : discrete_quotient X` varies, which is compatible with |
| 41 | + respect to `discrete_quotient.of_le`, must arise from some element of `X`. |
| 42 | +
|
| 43 | +## Remarks |
| 44 | +The constructions in this file will be used to show that any profinite space is a limit |
| 45 | +of finite discrete spaces. |
| 46 | +-/ |
| 47 | + |
| 48 | +variables (X : Type*) [topological_space X] |
| 49 | + |
| 50 | +/-- The type of discrete quotients of a topological space. -/ |
| 51 | +@[ext] |
| 52 | +structure discrete_quotient := |
| 53 | +(rel : X → X → Prop) |
| 54 | +(equiv : equivalence rel) |
| 55 | +(clopen : ∀ x, is_clopen (set_of (rel x))) |
| 56 | + |
| 57 | +namespace discrete_quotient |
| 58 | + |
| 59 | +variables {X} (S : discrete_quotient X) |
| 60 | + |
| 61 | +/-- Construct a discrete quotient from a clopen set. -/ |
| 62 | +def of_clopen {A : set X} (h : is_clopen A) : discrete_quotient X := |
| 63 | +{ rel := λ x y, x ∈ A ∧ y ∈ A ∨ x ∉ A ∧ y ∉ A, |
| 64 | + equiv := ⟨by tauto!, by tauto!, by tauto!⟩, |
| 65 | + clopen := begin |
| 66 | + intros x, |
| 67 | + by_cases hx : x ∈ A, |
| 68 | + { apply is_clopen_union, |
| 69 | + { convert h, |
| 70 | + ext, |
| 71 | + exact ⟨λ i, i.2, λ i, ⟨hx,i⟩⟩ }, |
| 72 | + { convert is_clopen_empty, |
| 73 | + tidy } }, |
| 74 | + { apply is_clopen_union, |
| 75 | + { convert is_clopen_empty, |
| 76 | + tidy }, |
| 77 | + { convert is_clopen_compl h, |
| 78 | + ext, |
| 79 | + exact ⟨λ i, i.2, λ i, ⟨hx, i⟩⟩ } }, |
| 80 | + end } |
| 81 | + |
| 82 | +lemma refl : ∀ x : X, S.rel x x := S.equiv.1 |
| 83 | +lemma symm : ∀ x y : X, S.rel x y → S.rel y x := S.equiv.2.1 |
| 84 | +lemma trans : ∀ x y z : X, S.rel x y → S.rel y z → S.rel x z := S.equiv.2.2 |
| 85 | + |
| 86 | +/-- The setoid whose quotient yields the discrete quotient. -/ |
| 87 | +def setoid : setoid X := ⟨S.rel, S.equiv⟩ |
| 88 | + |
| 89 | +instance : has_coe_to_sort (discrete_quotient X) := |
| 90 | +⟨Type*, λ S, quotient S.setoid⟩ |
| 91 | + |
| 92 | +instance : topological_space S := ⊥ |
| 93 | + |
| 94 | +/-- The projection from `X` to the given discrete quotient. -/ |
| 95 | +def proj : X → S := quotient.mk' |
| 96 | + |
| 97 | +lemma proj_surjective : function.surjective S.proj := quotient.surjective_quotient_mk' |
| 98 | + |
| 99 | +lemma fiber_eq (x : X) : S.proj ⁻¹' {S.proj x} = set_of (S.rel x) := |
| 100 | +begin |
| 101 | + ext1 y, |
| 102 | + simp only [set.mem_preimage, set.mem_singleton_iff, quotient.eq', |
| 103 | + discrete_quotient.proj.equations._eqn_1, set.mem_set_of_eq], |
| 104 | + exact ⟨λ h, S.symm _ _ h, λ h, S.symm _ _ h⟩, |
| 105 | +end |
| 106 | + |
| 107 | +lemma proj_is_locally_constant : is_locally_constant S.proj := |
| 108 | +begin |
| 109 | + rw (is_locally_constant.tfae S.proj).out 0 3, |
| 110 | + intros x, |
| 111 | + rcases S.proj_surjective x with ⟨x,rfl⟩, |
| 112 | + simp [fiber_eq, (S.clopen x).1], |
| 113 | +end |
| 114 | + |
| 115 | +lemma proj_continuous : continuous S.proj := |
| 116 | +is_locally_constant.continuous $ proj_is_locally_constant _ |
| 117 | + |
| 118 | +lemma fiber_closed (A : set S) : is_closed (S.proj ⁻¹' A) := |
| 119 | +is_closed.preimage S.proj_continuous ⟨trivial⟩ |
| 120 | + |
| 121 | +lemma fiber_open (A : set S) : is_open (S.proj ⁻¹' A) := |
| 122 | +is_open.preimage S.proj_continuous trivial |
| 123 | + |
| 124 | +lemma fiber_clopen (A : set S) : is_clopen (S.proj ⁻¹' A) := ⟨fiber_open _ _, fiber_closed _ _⟩ |
| 125 | + |
| 126 | +/-- Comap a discrete quotient along a continuous map. -/ |
| 127 | +def comap {Y : Type*} [topological_space Y] {f : Y → X} (cont : continuous f) : |
| 128 | + discrete_quotient Y := |
| 129 | +{ rel := λ a b, S.rel (f a) (f b), |
| 130 | + equiv := ⟨λ a, S.refl _, λ a b h, S.symm _ _ h, λ a b c h1 h2, S.trans _ _ _ h1 h2⟩, |
| 131 | + clopen := λ y, ⟨is_open.preimage cont (S.clopen _).1, is_closed.preimage cont (S.clopen _).2⟩ } |
| 132 | + |
| 133 | +instance : semilattice_inf_top (discrete_quotient X) := |
| 134 | +{ top := ⟨λ a b, true, ⟨by tauto, by tauto, by tauto⟩, λ _, is_clopen_univ⟩, |
| 135 | + inf := λ A B, |
| 136 | + { rel := λ x y, A.rel x y ∧ B.rel x y, |
| 137 | + equiv := ⟨λ a, ⟨A.refl _,B.refl _⟩, λ a b h, ⟨A.symm _ _ h.1, B.symm _ _ h.2⟩, |
| 138 | + λ a b c h1 h2, ⟨A.trans _ _ _ h1.1 h2.1, B.trans _ _ _ h1.2 h2.2⟩⟩, |
| 139 | + clopen := λ x, is_clopen_inter (A.clopen _) (B.clopen _) }, |
| 140 | + le := λ A B, ∀ x y : X, A.rel x y → B.rel x y, |
| 141 | + le_refl := λ a, by tauto, |
| 142 | + le_trans := λ a b c h1 h2, by tauto, |
| 143 | + le_antisymm := λ a b h1 h2, by { ext, tauto }, |
| 144 | + inf_le_left := λ a b, by tauto, |
| 145 | + inf_le_right := λ a b, by tauto, |
| 146 | + le_inf := λ a b c h1 h2, by tauto, |
| 147 | + le_top := λ a, by tauto } |
| 148 | + |
| 149 | +instance : inhabited (discrete_quotient X) := ⟨⊤⟩ |
| 150 | + |
| 151 | +/-- The map induced by a refinement of a discrete quotient. -/ |
| 152 | +def of_le {A B : discrete_quotient X} (h : A ≤ B) : A → B := |
| 153 | +λ a, quotient.lift_on' a (λ x, B.proj x) (λ a b i, quotient.sound' (h _ _ i)) |
| 154 | + |
| 155 | +lemma of_le_continuous {A B : discrete_quotient X} (h : A ≤ B) : |
| 156 | + continuous (of_le h) := continuous_of_discrete_topology |
| 157 | + |
| 158 | +@[simp] |
| 159 | +lemma of_le_proj {A B : discrete_quotient X} (h : A ≤ B) : |
| 160 | + of_le h ∘ A.proj = B.proj := by {ext, exact quotient.sound' (B.refl _)} |
| 161 | + |
| 162 | +@[simp] |
| 163 | +lemma of_le_proj_apply {A B : discrete_quotient X} (h : A ≤ B) (x : X) : |
| 164 | + of_le h (A.proj x) = B.proj x := by {change (of_le h ∘ A.proj) x = _, simp} |
| 165 | + |
| 166 | +lemma eq_of_proj_eq [t2_space X] [compact_space X] [disc : totally_disconnected_space X] |
| 167 | + {x y : X} : (∀ Q : discrete_quotient X, Q.proj x = Q.proj y) → x = y := |
| 168 | +begin |
| 169 | + intro h, |
| 170 | + change x ∈ ({y} : set X), |
| 171 | + rw totally_disconnected_space_iff_connected_component_singleton at disc, |
| 172 | + rw [← disc y, connected_component_eq_Inter_clopen], |
| 173 | + rintros U ⟨⟨U, hU1, hU2⟩, rfl⟩, |
| 174 | + replace h : _ ∨ _ := quotient.exact' (h (of_clopen hU1)), |
| 175 | + tauto, |
| 176 | +end |
| 177 | + |
| 178 | +lemma fiber_le_of_le {A B : discrete_quotient X} (h : A ≤ B) (a : A) : |
| 179 | + A.proj ⁻¹' {a} ≤ B.proj ⁻¹' {of_le h a} := |
| 180 | +begin |
| 181 | + induction a, |
| 182 | + erw [fiber_eq, fiber_eq], |
| 183 | + tidy, |
| 184 | +end |
| 185 | + |
| 186 | +lemma exists_of_compat [compact_space X] (Qs : Π (Q : discrete_quotient X), Q) |
| 187 | + (compat : ∀ (A B : discrete_quotient X) (h : A ≤ B), of_le h (Qs _) = Qs _) : |
| 188 | + ∃ x : X, ∀ Q : discrete_quotient X, Q.proj x = Qs _ := |
| 189 | +begin |
| 190 | + obtain ⟨x,hx⟩ := is_compact.nonempty_Inter_of_directed_nonempty_compact_closed |
| 191 | + (λ (Q : discrete_quotient X), Q.proj ⁻¹' {Qs _}) (λ A B, _) (λ i, _) |
| 192 | + (λ i, is_closed.compact (fiber_closed _ _)) (λ i, fiber_closed _ _), |
| 193 | + { refine ⟨x, λ Q, _⟩, |
| 194 | + specialize hx _ ⟨Q,rfl⟩, |
| 195 | + dsimp at hx, |
| 196 | + rcases proj_surjective _ (Qs Q) with ⟨y,hy⟩, |
| 197 | + rw ← hy at *, |
| 198 | + rw fiber_eq at hx, |
| 199 | + exact quotient.sound' (Q.symm y x hx) }, |
| 200 | + { refine ⟨A ⊓ B, λ a ha, _, λ a ha, _⟩, |
| 201 | + { dsimp only, |
| 202 | + erw ← compat (A ⊓ B) A inf_le_left, |
| 203 | + exact fiber_le_of_le _ _ ha }, |
| 204 | + { dsimp only, |
| 205 | + erw ← compat (A ⊓ B) B inf_le_right, |
| 206 | + exact fiber_le_of_le _ _ ha } }, |
| 207 | + { obtain ⟨x,hx⟩ := i.proj_surjective (Qs i), |
| 208 | + refine ⟨x,_⟩, |
| 209 | + dsimp only, |
| 210 | + rw [← hx, fiber_eq], |
| 211 | + apply i.refl }, |
| 212 | +end |
| 213 | + |
| 214 | +noncomputable instance [compact_space X] : fintype S := |
| 215 | +begin |
| 216 | + have cond : is_compact (⊤ : set X) := compact_univ, |
| 217 | + rw compact_iff_finite_subcover at cond, |
| 218 | + have h := @cond S (λ s, S.proj ⁻¹' {s}) (λ s, fiber_open _ _) |
| 219 | + (λ x hx, ⟨S.proj ⁻¹' {S.proj x}, ⟨S.proj x, rfl⟩, rfl⟩), |
| 220 | + let T := classical.some h, |
| 221 | + have hT := classical.some_spec h, |
| 222 | + refine ⟨T,λ s, _⟩, |
| 223 | + rcases S.proj_surjective s with ⟨x,rfl⟩, |
| 224 | + rcases hT (by tauto : x ∈ ⊤) with ⟨j, ⟨j,rfl⟩, h1, ⟨hj, rfl⟩, h2⟩, |
| 225 | + dsimp only at h2, |
| 226 | + suffices : S.proj x = j, by rwa this, |
| 227 | + rcases j with ⟨j⟩, |
| 228 | + apply quotient.sound', |
| 229 | + erw fiber_eq at h2, |
| 230 | + exact S.symm _ _ h2 |
| 231 | +end |
| 232 | + |
| 233 | +end discrete_quotient |
0 commit comments