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

Commit dbcd454

Browse files
committed
feat(topology/category/*): Add alternative explicit limit cones for Top, etc. and shows X : Profinite is a limit of finite sets. (#7448)
This PR redefines `Top.limit_cone`, and defines similar explicit limit cones for `CompHaus` and `Profinite`. Using the definition with the subspace topology makes the proofs that the limit is compact, t2 and/or totally disconnected much easier. This also expresses any `X : Profinite` as a limit of its discrete quotients, which are all finite. Co-authored-by: Adam Topaz <adamtopaz@users.noreply.github.com>
1 parent 515fb2f commit dbcd454

File tree

4 files changed

+161
-11
lines changed

4 files changed

+161
-11
lines changed

src/topology/category/CompHaus.lean

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,39 @@ has_limits_of_has_limits_creates_limits CompHaus_to_Top
159159

160160
instance CompHaus.has_colimits : limits.has_colimits CompHaus :=
161161
has_colimits_of_reflective CompHaus_to_Top
162+
163+
namespace CompHaus
164+
165+
/-- An explicit limit cone for a functor `F : J ⥤ CompHaus`, defined in terms of
166+
`Top.limit_cone`. -/
167+
def limit_cone {J : Type u} [small_category J] (F : J ⥤ CompHaus.{u}) :
168+
limits.cone F :=
169+
{ X :=
170+
{ to_Top := (Top.limit_cone (F ⋙ CompHaus_to_Top)).X,
171+
is_compact := begin
172+
dsimp [Top.limit_cone],
173+
rw ← compact_iff_compact_space,
174+
apply is_closed.compact,
175+
have : {u : Π j, F.obj j | ∀ {i j : J} (f : i ⟶ j), F.map f (u i) = u j} =
176+
⋂ (i j : J) (f : i ⟶ j), {u | F.map f (u i) = u j}, by tidy,
177+
rw this,
178+
apply is_closed_Inter, intros i,
179+
apply is_closed_Inter, intros j,
180+
apply is_closed_Inter, intros f,
181+
apply is_closed_eq;
182+
continuity,
183+
end,
184+
is_hausdorff := by { dsimp [Top.limit_cone], apply_instance } },
185+
π :=
186+
{ app := λ j, (Top.limit_cone (F ⋙ CompHaus_to_Top)).π.app j,
187+
-- tidy needs a little help in the `naturality'` field to avoid deterministic timeouts.
188+
naturality' := by { intros _ _ _, ext, tidy } } }
189+
190+
/-- The limit cone `CompHaus.limit_cone F` is indeed a limit cone. -/
191+
def limit_cone_is_limit {J : Type u} [small_category J] (F : J ⥤ CompHaus.{u}) :
192+
limits.is_limit (limit_cone F) :=
193+
{ lift := λ S,
194+
(Top.limit_cone_is_limit (F ⋙ CompHaus_to_Top)).lift (CompHaus_to_Top.map_cone S),
195+
uniq' := λ S m h, (Top.limit_cone_is_limit _).uniq (CompHaus_to_Top.map_cone S) _ h }
196+
197+
end CompHaus
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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.category.Profinite
7+
import topology.discrete_quotient
8+
9+
/-!
10+
# Profinite sets as limits of finite sets.
11+
12+
We show that any profinite set is isomorphic to the limit of its
13+
discrete (hence finite) quotients.
14+
15+
## Definitions
16+
17+
There are a handful of definitions in this file, given `X : Profinite`:
18+
1. `X.fintype_diagram` is the functor `discret_quotient X ⥤ Fintype` whose limit
19+
is isomorphic to `X` (the limit taking place in `Profinite` via `Fintype_to_Profinite`, see 2).
20+
2. `X.diagram` is an abbreviation for `X.fintype_diagram ⋙ Fintype_to_Profinite`.
21+
3. `X.as_limit_cone` is the cone over `X.diagram` whose cone point is `X`.
22+
4. `X.iso_as_limit_cone_lift` is the isomorphism `X ≅ (Profinite.limit_cone X.diagram).X` induced
23+
by lifting `X.as_limit_cone`.
24+
5. `X.as_limit_cone_iso` is the isomorphism `X.as_limit_cone ≅ (Profinite.limit_cone X.diagram)`
25+
induced by `X.iso_as_limit_cone_lift`.
26+
6. `X.as_limit` is a term of type `is_limit X.as_limit_cone`.
27+
7. `X.lim : category_theory.limits.limit_cone X.as_limit_cone` is a bundled combination of 3 and 6.
28+
29+
-/
30+
31+
noncomputable theory
32+
33+
open category_theory
34+
35+
namespace Profinite
36+
37+
universe u
38+
39+
variables (X : Profinite.{u})
40+
41+
/-- The functor `discrete_quotient X ⥤ Fintype` whose limit is isomorphic to `X`. -/
42+
def fintype_diagram : discrete_quotient X ⥤ Fintype :=
43+
{ obj := λ S, Fintype.of S,
44+
map := λ S T f, discrete_quotient.of_le $ le_of_hom f }
45+
46+
/-- An abbreviation for `X.fintype_diagram ⋙ Fintype_to_Profinite`. -/
47+
abbreviation diagram : discrete_quotient X ⥤ Profinite :=
48+
X.fintype_diagram ⋙ Fintype.to_Profinite
49+
50+
/-- A cone over `X.diagram` whose cone point is `X`. -/
51+
def as_limit_cone : category_theory.limits.cone X.diagram :=
52+
{ X := X,
53+
π := { app := λ S, ⟨S.proj, S.proj_is_locally_constant.continuous⟩ } }
54+
55+
instance is_iso_as_limit_cone_lift :
56+
is_iso ((limit_cone_is_limit X.diagram).lift X.as_limit_cone) :=
57+
is_iso_of_bijective _
58+
begin
59+
refine ⟨λ a b, _, λ a, _⟩,
60+
{ intro h,
61+
refine discrete_quotient.eq_of_proj_eq (λ S, _),
62+
apply_fun (λ f : (limit_cone X.diagram).X, f.val S) at h,
63+
exact h },
64+
{ obtain ⟨b, hb⟩ := discrete_quotient.exists_of_compat
65+
(λ S, a.val S) (λ _ _ h, a.prop (hom_of_le h)),
66+
refine ⟨b, _⟩,
67+
ext S : 3,
68+
apply hb },
69+
end
70+
71+
/--
72+
The isomorphism between `X` and the explicit limit of `X.diagram`,
73+
induced by lifting `X.as_limit_cone`.
74+
-/
75+
def iso_as_limit_cone_lift : X ≅ (limit_cone X.diagram).X :=
76+
as_iso $ (limit_cone_is_limit _).lift X.as_limit_cone
77+
78+
/--
79+
The isomorphism of cones `X.as_limit_cone` and `Profinite.limit_cone X.diagram`.
80+
The underlying isomorphism is defeq to `X.iso_as_limit_cone_lift`.
81+
-/
82+
def as_limit_cone_iso : X.as_limit_cone ≅ limit_cone _ :=
83+
limits.cones.ext (iso_as_limit_cone_lift _) (λ _, rfl)
84+
85+
/-- `X.as_limit_cone` is indeed a limit cone. -/
86+
def as_limit : category_theory.limits.is_limit X.as_limit_cone :=
87+
limits.is_limit.of_iso_limit (limit_cone_is_limit _) X.as_limit_cone_iso.symm
88+
89+
/-- A bundled version of `X.as_limit_cone` and `X.as_limit`. -/
90+
def lim : limits.limit_cone X.diagram := ⟨X.as_limit_cone, X.as_limit⟩
91+
92+
end Profinite

src/topology/category/Profinite.lean renamed to src/topology/category/Profinite/default.lean

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ adjunction.left_adjoint_of_equiv Profinite.to_CompHaus_equivalence (λ _ _ _ _ _
137137
lemma CompHaus.to_Profinite_obj' (X : CompHaus) :
138138
↥(CompHaus.to_Profinite.obj X) = connected_components X.to_Top.α := rfl
139139

140-
/-- Finite types are given the discrete topology. -/
140+
/-- Finite types are given the discrete topology. -/
141141
def Fintype.discrete_topology (A : Fintype) : topological_space A := ⊥
142142

143143
section discrete_topology
@@ -159,6 +159,31 @@ end Profinite
159159

160160
namespace Profinite
161161

162+
universe u
163+
164+
/--
165+
An explicit limit cone for a functor `F : J ⥤ Profinite`, defined in terms of
166+
`Top.limit_cone`.
167+
-/
168+
def limit_cone {J : Type u} [small_category J] (F : J ⥤ Profinite.{u}) :
169+
limits.cone F :=
170+
{ X :=
171+
{ to_Top := CompHaus_to_Top.obj (CompHaus.limit_cone (F ⋙ Profinite.to_CompHaus)).X,
172+
is_compact := by { dsimp [CompHaus_to_Top], apply_instance },
173+
is_t2 := by { dsimp [CompHaus_to_Top], apply_instance },
174+
is_totally_disconnected := by {
175+
dsimp [CompHaus_to_Top, CompHaus.limit_cone, Profinite.to_CompHaus, Top.limit_cone],
176+
apply_instance } },
177+
π := { app := λ j, (CompHaus.limit_cone (F ⋙ Profinite.to_CompHaus)).π.app j } }
178+
179+
/-- The limit cone `Profinite.limit_cone F` is indeed a limit cone. -/
180+
def limit_cone_is_limit {J : Type u} [small_category J] (F : J ⥤ Profinite.{u}) :
181+
limits.is_limit (limit_cone F) :=
182+
{ lift := λ S, (CompHaus.limit_cone_is_limit (F ⋙ Profinite.to_CompHaus)).lift
183+
(Profinite.to_CompHaus.map_cone S),
184+
uniq' := λ S m h,
185+
(CompHaus.limit_cone_is_limit _).uniq (Profinite.to_CompHaus.map_cone S) _ h }
186+
162187
/--
163188
The adjunction between CompHaus.to_Profinite and Profinite.to_CompHaus
164189
-/

src/topology/category/Top/limits.lean

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,21 @@ Generally you should just use `limit.cone F`, unless you need the actual definit
3535
(which is in terms of `types.limit_cone`).
3636
-/
3737
def limit_cone (F : J ⥤ Top.{u}) : cone F :=
38-
{ X := ⟨(types.limit_cone (F ⋙ forget)).X, ⨅j,
39-
(F.obj j).str.induced ((types.limit_cone (F ⋙ forget)).π.app j)⟩,
38+
{ X := Top.of {u : Π j : J, F.obj j | ∀ {i j : J} (f : i ⟶ j), F.map f (u i) = u j},
4039
π :=
41-
{ app := λ j, ⟨(types.limit_cone (F ⋙ forget)).π.app j,
42-
continuous_iff_le_induced.mpr (infi_le _ _)⟩,
43-
naturality' := λ j j' f,
44-
continuous_map.coe_inj ((types.limit_cone (F ⋙ forget)).π.naturality f) } }
40+
{ app := λ j,
41+
{ to_fun := λ u, u.val j,
42+
continuous_to_fun := show continuous ((λ u : Π j : J, F.obj j, u j) ∘ subtype.val),
43+
by continuity } } }
4544

4645
/--
4746
The chosen cone `Top.limit_cone F` for a functor `F : J ⥤ Top` is a limit cone.
4847
Generally you should just use `limit.is_limit F`, unless you need the actual definition
4948
(which is in terms of `types.limit_cone_is_limit`).
5049
-/
5150
def limit_cone_is_limit (F : J ⥤ Top.{u}) : is_limit (limit_cone F) :=
52-
by { refine is_limit.of_faithful forget (types.limit_cone_is_limit _) (λ s, ⟨_, _⟩) (λ s, rfl),
53-
exact continuous_iff_coinduced_le.mpr (le_infi $ λ j,
54-
coinduced_le_iff_le_induced.mp $ (continuous_iff_coinduced_le.mp (s.π.app j).continuous :
55-
_) ) }
51+
{ lift := λ S, { to_fun := λ x, ⟨λ j, S.π.app _ x, λ i j f, by { dsimp, erw ← S.w f, refl }⟩ },
52+
uniq' := λ S m h, by { ext : 3, simpa [← h] } }
5653

5754
instance Top_has_limits : has_limits.{u} Top.{u} :=
5855
{ has_limits_of_shape := λ J 𝒥, by exactI

0 commit comments

Comments
 (0)