Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 30f3788

Browse files
committed
feat(topology/discrete_quotient): Discrete quotients of topological spaces (#7425)
This PR defines the type of discrete quotients of a topological space and provides a basic API. In a subsequent PR, this will be used to show that a profinite space is the limit of its finite quotients, which will be needed for the liquid tensor experiment. Co-authored-by: Adam Topaz <adamtopaz@users.noreply.github.com>
1 parent 6d7e756 commit 30f3788

File tree

1 file changed

+233
-0
lines changed

1 file changed

+233
-0
lines changed
Lines changed: 233 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
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

Comments
 (0)