Skip to content

Commit 8ad0a85

Browse files
committed
feat(Condensed/Solid): prove profiniteSolidification is iso at finite types
Proves three helper lemmas toward the TODO (hard) in Condensed/Solid.lean: * profiniteSolidCounit_isIso: The counit of the profinite solidification is an isomorphism at every T : FintypeCat. Uses IsPointwiseRightKanExtension.isIso_hom. * profiniteSolidification_comp_counit: The solidification composed with the counit equals the identity at FintypeCat objects. Uses liftOfIsRightKanExtension_fac_app. * profiniteSolidification_isIso_at_fintype: The solidification map is an isomorphism at every object in the image of FintypeCat.toProfinite. Uses isIso_of_comp_hom_eq_id. * profiniteSolid_isSolid_at_fintype: Partial result: IsSolid holds when the test object is in the image of FintypeCat.toProfinite. * profiniteSolid_obj_isSolid: States the full result (with sorry). The remaining step is: limits of solid modules are solid, which follows from the adjunction solidification ⊣ inclusionOfSolidModules (not yet in Mathlib). Imports Mathlib.Topology.Category.Profinite.AsLimit for the limit structure of profinite spaces that will be needed for the general proof.
1 parent 7e2ece3 commit 8ad0a85

1 file changed

Lines changed: 94 additions & 11 deletions

File tree

Mathlib/Condensed/Solid.lean

Lines changed: 94 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
/-
22
Copyright (c) 2023 Dagur Asgeirsson. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
4-
Authors: Dagur Asgeirsson
4+
Authors: Dagur Asgeirsson, Thomas Riepe
55
-/
66
module
7-
87
public import Mathlib.CategoryTheory.Functor.KanExtension.Pointwise
98
public import Mathlib.Condensed.Functors
109
public import Mathlib.Condensed.Limits
11-
10+
public import Mathlib.Topology.Category.Profinite.AsLimit
1211
/-!
13-
1412
# Solid modules
1513
1614
This file contains the definition of a solid `R`-module: `CondensedMod.isSolid R`. Solid modules
@@ -21,14 +19,20 @@ groups were introduced in [scholze2019condensed], Definition 5.1.
2119
* `CondensedMod.IsSolid R`: the predicate on condensed `R`-modules describing the property of
2220
being solid.
2321
24-
TODO (hard): prove that `((profiniteSolid ℤ).obj S).IsSolid` for `S : Profinite`.
25-
TODO (slightly easier): prove that `((profiniteSolid 𝔽ₚ).obj S).IsSolid` for `S : Profinite`.
26-
-/
22+
## Main theorems (new in this PR)
2723
28-
@[expose] public section
24+
* `CondensedMod.profiniteSolidCounit_isIso`: the counit of the profinite solidification is
25+
an isomorphism at every finite type.
26+
* `CondensedMod.profiniteSolidification_isIso_at_fintype`: the solidification map is an
27+
isomorphism at every object in the image of `FintypeCat.toProfinite`.
28+
* `CondensedMod.profiniteSolid_isSolid_at_fintype`: `((profiniteSolid R).obj S).IsSolid`
29+
when tested against objects in the image of `FintypeCat.toProfinite`.
30+
* `CondensedMod.profiniteSolid_obj_isSolid`: `((profiniteSolid ℤ).obj S).IsSolid`
31+
for `S : Profinite`. (TODO: remove sorry)
2932
33+
-/
34+
@[expose] public section
3035
universe u
31-
3236
variable (R : Type (u + 1)) [Ring R]
3337

3438
open CategoryTheory Limits Profinite Condensed
@@ -74,7 +78,6 @@ end Condensed
7478

7579
/--
7680
The predicate on condensed `R`-modules describing the property of being solid.
77-
7881
TODO: This is not the correct definition of solid `R`-modules for a general `R`. The correct one is
7982
as follows: Use this to define solid modules over a finite type `ℤ`-algebra `R`. In particular this
8083
gives a definition of solid modules over `ℤ[X]` (polynomials in one variable). Then a solid
@@ -83,4 +86,84 @@ homomorphism `ℤ[X] → R` such that `X` maps to `r`, the underlying `ℤ[X]`-m
8386
-/
8487
class CondensedMod.IsSolid (A : CondensedMod.{u} R) : Prop where
8588
isIso_solidification_map : ∀ X : Profinite.{u}, IsIso ((yoneda.obj A).map
86-
((profiniteSolidification R).app X).op)
89+
((Condensed.profiniteSolidification R).app X).op)
90+
91+
namespace CondensedMod
92+
93+
open CategoryTheory Limits Profinite Condensed Functor
94+
95+
/-! ### Profiniteness of the solidification -/
96+
97+
/-- The counit of the profinite solidification is an isomorphism at every `T : FintypeCat`.
98+
This uses the fact that `profiniteSolidIsPointwiseRightKanExtension` holds and that
99+
`FintypeCat.toProfinite` is fully faithful. -/
100+
lemma profiniteSolidCounit_isIso (T : FintypeCat.{u}) :
101+
IsIso ((profiniteSolidCounit R).app T) := by
102+
haveI : IsIso (profiniteSolidCounit R) :=
103+
(profiniteSolidIsPointwiseRightKanExtension R).isIso_hom
104+
infer_instance
105+
106+
/-- The solidification map `profiniteSolidification R` composed with the counit equals the
107+
identity, at every `T : FintypeCat`. This is the naturality condition from
108+
`liftOfIsRightKanExtension_fac_app`. -/
109+
lemma profiniteSolidification_comp_counit (T : FintypeCat.{u}) :
110+
(profiniteSolidification R).app (FintypeCat.toProfinite.obj T) ≫
111+
(profiniteSolidCounit R).app T = 𝟙 _ := by
112+
have h := (profiniteSolid R).liftOfIsRightKanExtension_fac_app
113+
(profiniteSolidCounit R) (profiniteFree R) (𝟙 _) T
114+
simp only [profiniteSolidification]
115+
exact h
116+
117+
/-- The solidification map `profiniteSolidification R` is an isomorphism at every object in
118+
the image of `FintypeCat.toProfinite`. This follows from `profiniteSolidCounit_isIso` and
119+
`profiniteSolidification_comp_counit` via `isIso_of_comp_hom_eq_id`. -/
120+
lemma profiniteSolidification_isIso_at_fintype (T : FintypeCat.{u}) :
121+
IsIso ((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)) := by
122+
haveI := profiniteSolidCounit_isIso R T
123+
exact isIso_of_comp_hom_eq_id ((profiniteSolidCounit R).app T)
124+
(profiniteSolidification_comp_counit R T)
125+
126+
/-! ### Solidness of `profiniteSolid R` -/
127+
128+
/-- `((profiniteSolid R).obj S).IsSolid` when the test object `X` is in the image of
129+
`FintypeCat.toProfinite`. The proof uses that `profiniteSolidification_isIso_at_fintype`
130+
makes the solidification map itself an isomorphism at finite objects, and then functoriality
131+
of `yoneda` gives the required isomorphism on hom-sets. -/
132+
theorem profiniteSolid_isSolid_at_fintype
133+
(S : Profinite.{u}) (T : FintypeCat.{u}) :
134+
IsIso ((yoneda.obj ((profiniteSolid R).obj S)).map
135+
((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)).op) := by
136+
haveI : IsIso ((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)) :=
137+
profiniteSolidification_isIso_at_fintype R T
138+
infer_instance
139+
140+
/-- TODO: prove that `((profiniteSolid ℤ).obj S).IsSolid` for `S : Profinite`.
141+
The case when the test object is in the image of `FintypeCat.toProfinite` is already handled
142+
by `profiniteSolid_isSolid_at_fintype`. The general case requires showing that
143+
`X : Profinite` can be expressed as a cofiltered limit of its finite discrete quotients
144+
(which is available via `X.asLimit`) and that the solid module condition is preserved under
145+
such limits. This in turn follows from the adjunction between the solidification functor
146+
and the inclusion of solid modules, which has not yet been formalized in Mathlib.
147+
148+
Proof sketch for the general case (using `X.asLimit`):
149+
- `X ≅ lim_{S : DiscreteQuotient X} (FintypeCat.toProfinite.obj (X.fintypeDiagram.obj S))`
150+
- `(profiniteSolid R).obj S = limit_{T : StructuredArrow S L} (finFree R).obj T`
151+
(from `profiniteSolidIsPointwiseRightKanExtension`)
152+
- For surjectivity: given `h : freeX → A`, for each finite component `T`:
153+
`h ≫ proj_T : freeX → finFree T`, which lifts to `solidX → finFree T`
154+
using `profiniteSolid_isSolid_at_fintype` at the finite T.
155+
These lifts are compatible (by uniqueness) and yield a lift `solidX → A`.
156+
- For injectivity: use `IsLimit.hom_ext` for the limit structure of `A`.
157+
-/
158+
theorem profiniteSolid_obj_isSolid (S : Profinite.{u}) :
159+
((profiniteSolid R).obj S).IsSolid :=
160+
{ isIso_solidification_map := fun X => by
161+
-- The case X = FintypeCat.toProfinite.obj T is handled:
162+
-- haveI := profiniteSolid_isSolid_at_fintype R S T; infer_instance
163+
--
164+
-- For general X, we use X.asLimit (Profinite/AsLimit.lean):
165+
-- X is the limit of its finite discrete quotients X.fintypeDiagram.
166+
-- The proof proceeds by showing bijectivity using this limit structure.
167+
sorry }
168+
169+
end CondensedMod

0 commit comments

Comments
 (0)