Skip to content

Commit 2f5898b

Browse files
thothrdeThomas Riepe
andcommitted
feat(Condensed/Solid): complete proof architecture for profiniteSolid_obj_isSolid
New theorems and lemmas: - finFree_iso_solid: iso between profiniteSolid LT and finFree T - sol_map_counit: solidification commutes with finite-level maps - finFree_iso_solid_inv_eq_sol, iso_counit_sol: supporting lemmas - isSolid_of_isLimit_gen: limits of solid modules are solid (fully proved) - surj_factor: factorization lemma (sorry; proved in development branch) - profiniteSolid_fintype_isSolid: IsSolid for finite types (surjectivity proved, injectivity sorry pending finFree_isCompact) - finFree_isSolid: finFree T is solid (proved given profiniteSolid_fintype_isSolid) - profiniteSolid_obj_isSolid: complete proof architecture (2 specific sorries remain) Co-authored-by: Thomas Riepe <thomas.riepe@gmail.com>
1 parent 8ad0a85 commit 2f5898b

1 file changed

Lines changed: 223 additions & 33 deletions

File tree

Mathlib/Condensed/Solid.lean

Lines changed: 223 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Dagur Asgeirsson, Thomas Riepe
55
-/
66
module
7+
78
public import Mathlib.CategoryTheory.Functor.KanExtension.Pointwise
89
public import Mathlib.Condensed.Functors
910
public import Mathlib.Condensed.Limits
@@ -14,7 +15,7 @@ public import Mathlib.Topology.Category.Profinite.AsLimit
1415
This file contains the definition of a solid `R`-module: `CondensedMod.isSolid R`. Solid modules
1516
groups 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+
3541
universe u
42+
3643
variable (R : Type (u + 1)) [Ring R]
3744

3845
open CategoryTheory Limits Profinite Condensed
@@ -49,7 +56,7 @@ abbrev finFree : FintypeCat.{u} ⥤ CondensedMod.{u} R :=
4956
abbrev 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`. -/
5360
def 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`. -/
7481
def 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
-/
158348
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 }
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

169359
end CondensedMod

0 commit comments

Comments
 (0)