11/-
22Copyright (c) 2023 Dagur Asgeirsson. All rights reserved.
33Released under Apache 2.0 license as described in the file LICENSE.
4- Authors: Dagur Asgeirsson
4+ Authors: Dagur Asgeirsson, Thomas Riepe
55-/
66module
7-
87public import Mathlib.CategoryTheory.Functor.KanExtension.Pointwise
98public import Mathlib.Condensed.Functors
109public import Mathlib.Condensed.Limits
11-
10+ public import Mathlib.Topology.Category.Profinite.AsLimit
1211/-!
13-
1412# Solid modules
1513
1614This 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
3035universe u
31-
3236variable (R : Type (u + 1 )) [Ring R]
3337
3438open CategoryTheory Limits Profinite Condensed
@@ -74,7 +78,6 @@ end Condensed
7478
7579/--
7680The predicate on condensed `R`-modules describing the property of being solid.
77-
7881TODO: This is not the correct definition of solid `R`-modules for a general `R`. The correct one is
7982as follows: Use this to define solid modules over a finite type `ℤ`-algebra `R`. In particular this
8083gives 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-/
8487class 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