@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Dagur Asgeirsson, Thomas Riepe
55-/
66module
7+
78public import Mathlib.CategoryTheory.Functor.KanExtension.Pointwise
89public import Mathlib.Condensed.Functors
910public import Mathlib.Condensed.Limits
@@ -14,7 +15,7 @@ public import Mathlib.Topology.Category.Profinite.AsLimit
1415This file contains the definition of a solid `R`-module: `CondensedMod.isSolid R`. Solid modules
1516groups were introduced in [ scholze2019condensed ] , Definition 5.1.
1617
17- ## Main definition
18+ ## Main definitions
1819
1920* `CondensedMod.IsSolid R`: the predicate on condensed `R`-modules describing the property of
2021 being solid.
@@ -27,12 +28,18 @@ groups were introduced in [scholze2019condensed], Definition 5.1.
2728 isomorphism at every object in the image of `FintypeCat.toProfinite`.
2829* `CondensedMod.profiniteSolid_isSolid_at_fintype`: `((profiniteSolid R).obj S).IsSolid`
2930 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)
32-
31+ * `CondensedMod.isSolid_of_isLimit_gen`: if a condensed `R`-module is the limit of solid
32+ modules, then it is solid (fully proved).
33+ * `CondensedMod.profiniteSolid_obj_isSolid`: `((profiniteSolid R).obj S).IsSolid`
34+ for `S : Profinite`. Architecture complete; two intermediate sorries remain:
35+ (1) `surj_factor` (proved in MathProject/P2_finFree_Solid.lean; colimit argument);
36+ (2) `h_step` in injectivity (requires `finFree_isCompact`, not yet in Mathlib).
3337 -/
38+
3439@[expose] public section
40+
3541universe u
42+
3643variable (R : Type (u + 1 )) [Ring R]
3744
3845open CategoryTheory Limits Profinite Condensed
@@ -49,7 +56,7 @@ abbrev finFree : FintypeCat.{u} ⥤ CondensedMod.{u} R :=
4956abbrev profiniteFree : Profinite.{u} ⥤ CondensedMod.{u} R :=
5057 profiniteToCondensed ⋙ free R
5158
52- /-- The functor sending a profinite space `S` to the condensed `R`-module `R[S]^\ solid`. -/
59+ /-- The functor sending a profinite space `S` to the condensed `R`-module `R[S]^solid`. -/
5360def profiniteSolid : Profinite.{u} ⥤ CondensedMod.{u} R :=
5461 Functor.rightKanExtension FintypeCat.toProfinite (finFree R)
5562
@@ -70,7 +77,7 @@ def profiniteSolidIsPointwiseRightKanExtension :
7077 (Functor.RightExtension.mk _ (profiniteSolidCounit R)).IsPointwiseRightKanExtension :=
7178 Functor.isPointwiseRightKanExtensionOfIsRightKanExtension _ _
7279
73- /-- The natural transformation `R[S] ⟶ R[S]^\ solid`. -/
80+ /-- The natural transformation `R[S] ⟶ R[S]^solid`. -/
7481def profiniteSolidification : profiniteFree R ⟶ profiniteSolid.{u} R :=
7582 (profiniteSolid R).liftOfIsRightKanExtension (profiniteSolidCounit R) _ (𝟙 _)
7683
@@ -123,7 +130,7 @@ lemma profiniteSolidification_isIso_at_fintype (T : FintypeCat.{u}) :
123130 exact isIso_of_comp_hom_eq_id ((profiniteSolidCounit R).app T)
124131 (profiniteSolidification_comp_counit R T)
125132
126- /-! ### Solidness of `profiniteSolid R` -/
133+ /-! ### Solidness of `profiniteSolid R` at finite test objects -/
127134
128135/-- `((profiniteSolid R).obj S).IsSolid` when the test object `X` is in the image of
129136`FintypeCat.toProfinite`. The proof uses that `profiniteSolidification_isIso_at_fintype`
@@ -137,33 +144,216 @@ theorem profiniteSolid_isSolid_at_fintype
137144 profiniteSolidification_isIso_at_fintype R T
138145 infer_instance
139146
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`.
147+ /-! ### Infrastructure for the general solidness proof -/
148+
149+ /-- The isomorphism `(profiniteSolid R).obj LT ≅ (finFree R).obj T`, for `T : FintypeCat`.
150+ This is the counit of the right Kan extension, which is an isomorphism by
151+ `profiniteSolidCounit_isIso`. -/
152+ noncomputable def finFree_iso_solid (T : FintypeCat.{u}) :
153+ (profiniteSolid R).obj (FintypeCat.toProfinite.obj T) ≅ (finFree R).obj T :=
154+ @asIso _ _ _ _ ((profiniteSolidCounit R).app T) (profiniteSolidCounit_isIso R T)
155+
156+ /-- Key commutation: the solidification composed with the solid map and the counit iso
157+ equals the free map. This is the fundamental compatibility between solidification and
158+ the Kan extension structure. -/
159+ lemma sol_map_counit (T : FintypeCat.{u}) (X : Profinite.{u})
160+ (ψ : X ⟶ FintypeCat.toProfinite.obj T) :
161+ (profiniteSolidification R).app X ≫
162+ (profiniteSolid R).map ψ ≫
163+ (finFree_iso_solid R T).hom = (profiniteFree R).map ψ := by
164+ have nat := (profiniteSolidification R).naturality ψ
165+ have hcounit : (finFree_iso_solid R T).hom = (profiniteSolidCounit R).app T := rfl
166+ rw [hcounit, ← Category.assoc, ← nat, Category.assoc, profiniteSolidification_comp_counit]
167+ exact Category.comp_id _
168+
169+ /-- The inverse of `finFree_iso_solid` equals the solidification map. -/
170+ lemma finFree_iso_solid_inv_eq_sol (T : FintypeCat.{u}) :
171+ (finFree_iso_solid R T).inv =
172+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) := by
173+ haveI : IsIso ((profiniteSolidCounit R).app T) := profiniteSolidCounit_isIso R T
174+ haveI : IsIso ((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)) :=
175+ profiniteSolidification_isIso_at_fintype R T
176+ have h_inv : (finFree_iso_solid R T).hom ≫
177+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) = 𝟙 _ := by
178+ simp only [finFree_iso_solid, asIso_hom]
179+ rw [show (profiniteSolidCounit R).app T ≫
180+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) =
181+ 𝟙 ((finFree R).obj T) from by
182+ rw [← profiniteSolidification_comp_counit R T]; simp [Category.assoc]]
183+ exact IsIso.eq_inv_of_hom_inv_id h_inv
184+
185+ /-- The counit iso composed with the solidification equals the identity. -/
186+ lemma iso_counit_sol (T : FintypeCat.{u}) :
187+ (finFree_iso_solid R T).hom ≫
188+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) =
189+ 𝟙 ((profiniteSolid R).obj (FintypeCat.toProfinite.obj T)) := by
190+ rw [← finFree_iso_solid_inv_eq_sol R T]
191+ exact (finFree_iso_solid R T).hom_inv_id
192+
193+ /-- `surj_factor`: any morphism `h : profiniteFree X ⟶ finFree T` factors through a
194+ finite level, i.e., there exist `U₀ : FintypeCat`, `q₀ : X ⟶ LU₀`, and
195+ `h₀ : profiniteFree LU₀ ⟶ finFree T` such that `h = profiniteFree.map q₀ ≫ h₀`.
196+
197+ Proof: The value `(finFree T)(X)` is the colimit of `(finFree T)(LU)` over the
198+ cofiltered diagram of finite discrete quotients of X (by `finFree_isColimit_at`).
199+ The adjunction `freeForgetAdjunction` identifies `h` with an element of `(finFree T)(X)`,
200+ which by the colimit structure comes from some finite stage `U₀`.
201+
202+ This lemma is proved in MathProject/P2_finFree_Solid.lean.
203+ TODO: integrate the proof into Mathlib.
204+ -/
205+ lemma surj_factor (T : FintypeCat.{u}) (X : Profinite.{u})
206+ (h : (profiniteFree R).obj X ⟶ (finFree R).obj T) :
207+ ∃ (U₀ : FintypeCat.{u}) (q₀ : X ⟶ FintypeCat.toProfinite.obj U₀)
208+ (h₀ : (profiniteFree R).obj (FintypeCat.toProfinite.obj U₀) ⟶ (finFree R).obj T),
209+ h = (profiniteFree R).map q₀ ≫ h₀ := by
210+ sorry
211+
212+ /-! ### Solidness of `(profiniteSolid R).obj LT` (finite case) -/
213+
214+ /-- `((profiniteSolid R).obj LT).IsSolid` for any `T : FintypeCat`.
215+
216+ The proof establishes bijectivity of the solidification map for any test object `X`.
217+
218+ **Surjectivity** (proved 2026-06-13, using `surj_factor` and `sol_map_counit`):
219+ Given `h : profiniteFree X ⟶ profiniteSolid LT`, translate via `finFree_iso_solid`,
220+ apply `surj_factor` to factor through a finite level, then use `sol_map_counit`.
221+
222+ **Injectivity** (one sorry): requires `finFree_isCompact`, not yet in Mathlib.
223+ Mathematically: `finFree T ≅ ⊕_{t∈T} R_cond` where `R_cond` is compact (by Yoneda),
224+ and finite direct sums of compact objects are compact in `CondensedMod R`.
225+ -/
226+ theorem profiniteSolid_fintype_isSolid (T : FintypeCat.{u}) :
227+ ((profiniteSolid R).obj (FintypeCat.toProfinite.obj T)).IsSolid := by
228+ constructor; intro X
229+ rw [isIso_iff_bijective]
230+ constructor
231+ · -- INJECTIVITY: sorry (requires finFree_isCompact)
232+ intro g g' hgg'
233+ have hcoinv := iso_counit_sol R T
234+ have h_step : g ≫ (finFree_iso_solid R T).hom = g' ≫ (finFree_iso_solid R T).hom := by
235+ sorry
236+ calc g = g ≫ 𝟙 _ := (Category.comp_id _).symm
237+ _ = g ≫ (finFree_iso_solid R T).hom ≫
238+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) := by rw [hcoinv]
239+ _ = g' ≫ (finFree_iso_solid R T).hom ≫
240+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) := by
241+ simp only [← Category.assoc, h_step]
242+ _ = g' ≫ 𝟙 _ := by rw [← hcoinv]
243+ _ = g' := Category.comp_id _
244+ · -- SURJECTIVITY (proved 2026-06-13, see also SurjProof_FINAL.lean)
245+ intro h
246+ let h' : (profiniteFree R).obj X ⟶ (finFree R).obj T :=
247+ h ≫ (finFree_iso_solid R T).hom
248+ obtain ⟨U₀, q₀, h₀, hfact⟩ := surj_factor R T X h'
249+ refine ⟨(profiniteSolid R).map q₀ ≫ (finFree_iso_solid R U₀).hom ≫
250+ h₀ ≫ (finFree_iso_solid R T).inv, ?_⟩
251+ have hmid := sol_map_counit R U₀ X q₀
252+ have eq1 : (profiniteSolidification R).app X ≫ (profiniteSolid R).map q₀ ≫
253+ (finFree_iso_solid R U₀).hom ≫ h₀ ≫ (finFree_iso_solid R T).inv = h := by
254+ rw [show (profiniteSolidification R).app X ≫ (profiniteSolid R).map q₀ ≫
255+ (finFree_iso_solid R U₀).hom ≫ h₀ ≫ (finFree_iso_solid R T).inv =
256+ ((profiniteSolidification R).app X ≫ (profiniteSolid R).map q₀ ≫
257+ (finFree_iso_solid R U₀).hom) ≫ h₀ ≫ (finFree_iso_solid R T).inv
258+ from by simp [Category.assoc],
259+ hmid, ← Category.assoc, ← hfact]
260+ simp only [h', Category.assoc, Iso.hom_inv_id, Category.comp_id]
261+ rw [show (profiniteSolidification R).app X ≫
262+ ((profiniteSolid R).map q₀ ≫ (finFree_iso_solid R U₀).hom ≫
263+ h₀ ≫ (finFree_iso_solid R T).inv) =
264+ (profiniteSolidification R).app X ≫ (profiniteSolid R).map q₀ ≫
265+ (finFree_iso_solid R U₀).hom ≫ h₀ ≫ (finFree_iso_solid R T).inv
266+ from by simp [Category.assoc]]
267+ exact eq1
268+
269+ /-! ### Limits of solid modules are solid -/
270+
271+ /-- If a condensed `R`-module is the limit of a diagram of solid modules, then it is solid.
272+
273+ **Proof** (fully proved, no sorry): For any test object `X`, we show bijectivity of the
274+ solidification map on Hom-sets by using bijectivity at each component of the diagram
275+ together with the limit property (`IsLimit.hom_ext` for injectivity, `IsLimit.lift`
276+ for surjectivity). -/
277+ lemma isSolid_of_isLimit_gen
278+ {J : Type *} [Category J]
279+ {F : J ⥤ CondensedMod.{u} R}
280+ (c : Cone F) (hc : IsLimit c)
281+ (hj : ∀ j, (F.obj j).IsSolid) :
282+ c.pt.IsSolid := by
283+ refine ⟨fun X => ?_⟩
284+ rw [isIso_iff_bijective]
285+ set sol := (profiniteSolidification R).app X
286+ have bijFun : ∀ j, Function.Bijective ((yoneda.obj (F.obj j)).map sol.op) := by
287+ intro j; have h := (hj j).isIso_solidification_map X
288+ rw [isIso_iff_bijective] at h; exact h
289+ constructor
290+ · intro f g hfg
291+ apply hc.hom_ext; intro j; apply (bijFun j).1
292+ show sol ≫ f ≫ c.π.app j = sol ≫ g ≫ c.π.app j
293+ simp only [← Category.assoc, hfg]
294+ · intro h_map
295+ choose g_j hg_j using fun j => (bijFun j).2 (h_map ≫ c.π.app j)
296+ have hg_j' : ∀ j, sol ≫ g_j j = h_map ≫ c.π.app j := hg_j
297+ have compat : ∀ {j k : J} (φ : j ⟶ k), g_j j ≫ F.map φ = g_j k := by
298+ intro j k φ
299+ have lhs : sol ≫ (g_j j ≫ F.map φ) = h_map ≫ c.π.app k := by
300+ conv_lhs => rw [← Category.assoc, hg_j' j, Category.assoc, c.w φ]
301+ exact (bijFun k).1 (lhs.trans (hg_j' k).symm)
302+ let g_cone : Cone F :=
303+ { pt := (profiniteSolid R).obj X
304+ π := { app := g_j
305+ naturality := fun j k φ => by
306+ change 𝟙 _ ≫ g_j k = g_j j ≫ F.map φ
307+ simp only [Category.id_comp]; exact (compat φ).symm } }
308+ refine ⟨hc.lift g_cone, ?_⟩
309+ show sol ≫ hc.lift g_cone = h_map
310+ apply hc.hom_ext; intro j
311+ have hfac : hc.lift g_cone ≫ c.π.app j = g_j j := hc.fac g_cone j
312+ rw [Category.assoc, hfac]; exact hg_j' j
313+
314+ /-! ### `finFree R T` is solid -/
315+
316+ /-- `(finFree R).obj T` is a solid condensed `R`-module, for any `T : FintypeCat`.
317+
318+ The proof uses the isomorphism `finFree_iso_solid R T : profiniteSolid LT ≅ finFree T`
319+ to transfer solidness from `profiniteSolid_fintype_isSolid`. -/
320+ theorem finFree_isSolid (T : FintypeCat.{u}) : ((finFree R).obj T).IsSolid := by
321+ constructor; intro X
322+ have hS : IsIso ((yoneda.obj ((profiniteSolid R).obj
323+ (FintypeCat.toProfinite.obj T))).map ((profiniteSolidification R).app X).op) :=
324+ (profiniteSolid_fintype_isSolid R T).isIso_solidification_map X
325+ have e := finFree_iso_solid R T
326+ rw [show (yoneda.obj ((finFree R).obj T)).map ((profiniteSolidification R).app X).op =
327+ (yoneda.mapIso e).inv.app (op ((profiniteSolid R).obj X)) ≫
328+ (yoneda.obj ((profiniteSolid R).obj (FintypeCat.toProfinite.obj T))).map
329+ ((profiniteSolidification R).app X).op ≫
330+ (yoneda.mapIso e).hom.app (op ((profiniteFree R).obj X)) from ?_]
331+ · exact IsIso.comp_isIso
332+ · ext g; simp
333+
334+ /-! ### General solidness of `profiniteSolid R` -/
335+
336+ /-- Every `(profiniteSolid R).obj S` is a solid condensed `R`-module, for any `S : Profinite`.
337+
338+ **Proof architecture** (complete, two remaining sorries are in auxiliary lemmas):
339+ 1. `profiniteSolidIsPointwiseRightKanExtension` gives `(profiniteSolid R).obj S` as the
340+ limit of `finFree R` over `StructuredArrow S FintypeCat.toProfinite`.
341+ 2. `isSolid_of_isLimit_gen` (proved) reduces to showing each component is solid.
342+ 3. `finFree_isSolid` (proved modulo `profiniteSolid_fintype_isSolid`) handles each component.
343+
344+ Remaining sorries (in `profiniteSolid_fintype_isSolid`):
345+ - `surj_factor`: proved in MathProject/P2_finFree_Solid.lean; TODO: integrate.
346+ - Injectivity `h_step`: requires `finFree_isCompact` (not yet in Mathlib).
157347 -/
158348theorem 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 }
349+ ((profiniteSolid R).obj S).IsSolid := by
350+ let E := Functor.RightExtension.mk (profiniteSolid R) (profiniteSolidCounit R)
351+ have h_pwise : IsLimit (E.coneAt S) :=
352+ (profiniteSolidIsPointwiseRightKanExtension R) S
353+ change (E.coneAt S).pt.IsSolid
354+ apply isSolid_of_isLimit_gen R (E.coneAt S) h_pwise
355+ intro f
356+ simp only [comp_obj, StructuredArrow.proj_obj]
357+ exact finFree_isSolid R f.right
168358
169359end CondensedMod
0 commit comments