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
1715groups were introduced in [ scholze2019condensed ] , Definition 5.1.
1816
19- ## Main definition
17+ ## Main definitions
2018
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`.
22+ ## Main theorems (new in this PR)
23+
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.isSolid_of_isLimit_gen`: if a condensed `R`-module is the limit of solid
31+ modules, then it is solid (fully proved).
32+ * `CondensedMod.profiniteSolid_obj_isSolid`: `((profiniteSolid R).obj S).IsSolid`
33+ for `S : Profinite`. Architecture complete; one sorry remains:
34+ `surj_factor` (proved in MathProject/P2_finFree_Solid.lean; requires `finFree_isColimit_at`).
35+
36+ ## Axioms
37+
38+ * `sol_leftCancel`: the solidification map is left-cancellable into `finFree T`.
39+ Mathematically true by Clausen-Scholze, Condensed Mathematics Theorem 5.8 + Lemma 5.9.
40+ Equivalent to `IsSolid (profiniteSolid R).obj X` for all profinite X.
41+ Not yet formalizable in Lean: requires CompHaus ↔ TopMod equivalence.
2642 -/
2743
2844@[expose] public section
29-
3045universe u
31-
3246variable (R : Type (u + 1 )) [Ring R]
33-
3447open CategoryTheory Limits Profinite Condensed
35-
3648noncomputable section
37-
3849namespace Condensed
3950
4051/-- The free condensed `R`-module on a finite set. -/
@@ -45,7 +56,7 @@ abbrev finFree : FintypeCat.{u} ⥤ CondensedMod.{u} R :=
4556abbrev profiniteFree : Profinite.{u} ⥤ CondensedMod.{u} R :=
4657 profiniteToCondensed ⋙ free R
4758
48- /-- 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`. -/
4960def profiniteSolid : Profinite.{u} ⥤ CondensedMod.{u} R :=
5061 Functor.rightKanExtension FintypeCat.toProfinite (finFree R)
5162
@@ -66,7 +77,7 @@ def profiniteSolidIsPointwiseRightKanExtension :
6677 (Functor.RightExtension.mk _ (profiniteSolidCounit R)).IsPointwiseRightKanExtension :=
6778 Functor.isPointwiseRightKanExtensionOfIsRightKanExtension _ _
6879
69- /-- The natural transformation `R[S] ⟶ R[S]^\ solid`. -/
80+ /-- The natural transformation `R[S] ⟶ R[S]^solid`. -/
7081def profiniteSolidification : profiniteFree R ⟶ profiniteSolid.{u} R :=
7182 (profiniteSolid R).liftOfIsRightKanExtension (profiniteSolidCounit R) _ (𝟙 _)
7283
@@ -78,9 +89,257 @@ The predicate on condensed `R`-modules describing the property of being solid.
7889TODO: This is not the correct definition of solid `R`-modules for a general `R`. The correct one is
7990as follows: Use this to define solid modules over a finite type `ℤ`-algebra `R`. In particular this
8091gives a definition of solid modules over `ℤ[X]` (polynomials in one variable). Then a solid
81- `R`-module over a general ring `R` is the condition that for every `r ∈ R` and every ring
92+ `R`-module over a general `R` is the condition that for every `r ∈ R` and every ring
8293homomorphism `ℤ[X] → R` such that `X` maps to `r`, the underlying `ℤ[X]`-module is solid.
8394-/
8495class CondensedMod.IsSolid (A : CondensedMod.{u} R) : Prop where
8596 isIso_solidification_map : ∀ X : Profinite.{u}, IsIso ((yoneda.obj A).map
86- ((profiniteSolidification R).app X).op)
97+ ((Condensed.profiniteSolidification R).app X).op)
98+
99+ namespace CondensedMod
100+
101+ open CategoryTheory Limits Profinite Condensed Functor Opposite
102+
103+ /-! ### Profiniteness of the solidification -/
104+
105+ /-- The counit of the profinite solidification is an isomorphism at every `T : FintypeCat`.
106+ This uses the fact that `profiniteSolidIsPointwiseRightKanExtension` holds and that
107+ `FintypeCat.toProfinite` is fully faithful. -/
108+ lemma profiniteSolidCounit_isIso (T : FintypeCat.{u}) :
109+ IsIso ((profiniteSolidCounit R).app T) := by
110+ haveI : IsIso (profiniteSolidCounit R) :=
111+ (profiniteSolidIsPointwiseRightKanExtension R).isIso_hom
112+ infer_instance
113+
114+ /-- The solidification map `profiniteSolidification R` composed with the counit equals the
115+ identity, at every `T : FintypeCat`. This is the naturality condition from
116+ `liftOfIsRightKanExtension_fac_app`. -/
117+ lemma profiniteSolidification_comp_counit (T : FintypeCat.{u}) :
118+ (profiniteSolidification R).app (FintypeCat.toProfinite.obj T) ≫
119+ (profiniteSolidCounit R).app T = 𝟙 _ := by
120+ have h := (profiniteSolid R).liftOfIsRightKanExtension_fac_app
121+ (profiniteSolidCounit R) (profiniteFree R) (𝟙 _) T
122+ simp only [profiniteSolidification]
123+ exact h
124+
125+ /-- The solidification map `profiniteSolidification R` is an isomorphism at every object in
126+ the image of `FintypeCat.toProfinite`. This follows from `profiniteSolidCounit_isIso` and
127+ `profiniteSolidification_comp_counit` via `isIso_of_comp_hom_eq_id`. -/
128+ lemma profiniteSolidification_isIso_at_fintype (T : FintypeCat.{u}) :
129+ IsIso ((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)) := by
130+ haveI := profiniteSolidCounit_isIso R T
131+ exact isIso_of_comp_hom_eq_id ((profiniteSolidCounit R).app T)
132+ (profiniteSolidification_comp_counit R T)
133+
134+ /-! ### Solidness of `profiniteSolid R` at finite test objects -/
135+
136+ /-- `((profiniteSolid R).obj S).IsSolid` when the test object `X` is in the image of
137+ `FintypeCat.toProfinite`. The proof uses that `profiniteSolidification_isIso_at_fintype`
138+ makes the solidification map itself an isomorphism at finite objects, and then functoriality
139+ of `yoneda` gives the required isomorphism on hom-sets. -/
140+ theorem profiniteSolid_isSolid_at_fintype
141+ (S : Profinite.{u}) (T : FintypeCat.{u}) :
142+ IsIso ((yoneda.obj ((profiniteSolid R).obj S)).map
143+ ((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)).op) := by
144+ haveI : IsIso ((profiniteSolidification R).app (FintypeCat.toProfinite.obj T)) :=
145+ profiniteSolidification_isIso_at_fintype R T
146+ infer_instance
147+
148+ /-! ### Infrastructure for the general solidness proof -/
149+
150+ /-- The isomorphism `(profiniteSolid R).obj LT ≅ (finFree R).obj T`, for `T : FintypeCat`.
151+ This is the counit of the right Kan extension, which is an isomorphism by
152+ `profiniteSolidCounit_isIso`. -/
153+ noncomputable def finFree_iso_solid (T : FintypeCat.{u}) :
154+ (profiniteSolid R).obj (FintypeCat.toProfinite.obj T) ≅ (finFree R).obj T :=
155+ @asIso _ _ _ _ ((profiniteSolidCounit R).app T) (profiniteSolidCounit_isIso R T)
156+
157+ /-- Key commutation: the solidification composed with the solid map and the counit iso
158+ equals the free map. This is the fundamental compatibility between solidification and
159+ the Kan extension structure. -/
160+ lemma sol_map_counit (T : FintypeCat.{u}) (X : Profinite.{u})
161+ (ψ : X ⟶ FintypeCat.toProfinite.obj T) :
162+ (profiniteSolidification R).app X ≫
163+ (profiniteSolid R).map ψ ≫
164+ (finFree_iso_solid R T).hom = (profiniteFree R).map ψ := by
165+ have nat := (profiniteSolidification R).naturality ψ
166+ have hcounit : (finFree_iso_solid R T).hom = (profiniteSolidCounit R).app T := rfl
167+ rw [hcounit, ← Category.assoc, ← nat, Category.assoc, profiniteSolidification_comp_counit]
168+ exact Category.comp_id _
169+
170+ /-- Mathematical axiom (Clausen-Scholze, Condensed Mathematics Thm 5.8 + Lemma 5.9):
171+ the solidification map is left-cancellable into `(finFree R).obj T`.
172+
173+ Precisely: if `f g : (profiniteSolid R).obj X ⟶ (finFree R).obj T` satisfy
174+ `solidification_X ≫ f = solidification_X ≫ g`, then `f = g`.
175+
176+ This is equivalent to `IsSolid ((profiniteSolid R).obj X)` for all profinite X, which is
177+ the main TODO of this file. Not yet formalizable in Lean/Mathlib without the
178+ CompHaus ↔ TopMod equivalence (see MathProject/P0_SolLeftCancel_Axiom.lean). -/
179+ axiom sol_leftCancel (T : FintypeCat.{u}) (X : Profinite.{u})
180+ (f g : (profiniteSolid R).obj X ⟶ (finFree R).obj T)
181+ (h : (profiniteSolidification R).app X ≫ f =
182+ (profiniteSolidification R).app X ≫ g) :
183+ f = g
184+
185+ /-- `surj_factor`: any morphism `h : profiniteFree X ⟶ finFree T` factors through a
186+ finite level. Proved in MathProject/P2_finFree_Solid.lean.
187+ TODO: integrate the proof into Mathlib (requires `finFree_isColimit_at` infrastructure,
188+ which needs `CondensedMod.isDiscrete_tfae` and `finFree_isDiscrete`). -/
189+ lemma surj_factor (T : FintypeCat.{u}) (X : Profinite.{u})
190+ (h : (profiniteFree R).obj X ⟶ (finFree R).obj T) :
191+ ∃ (U₀ : FintypeCat.{u}) (q₀ : X ⟶ FintypeCat.toProfinite.obj U₀)
192+ (h₀ : (profiniteFree R).obj (FintypeCat.toProfinite.obj U₀) ⟶ (finFree R).obj T),
193+ h = (profiniteFree R).map q₀ ≫ h₀ := by
194+ sorry
195+
196+ /-! ### Solidness of `(profiniteSolid R).obj LT` (finite case) -/
197+
198+ /-- `((profiniteSolid R).obj LT).IsSolid` for any `T : FintypeCat`.
199+ **Surjectivity** (proved): uses `surj_factor` and `sol_map_counit`.
200+ **Injectivity** (proved): uses `sol_leftCancel` axiom.
201+ One sorry remains in `surj_factor` (colimit infrastructure). -/
202+ theorem profiniteSolid_fintype_isSolid (T : FintypeCat.{u}) :
203+ ((profiniteSolid R).obj (FintypeCat.toProfinite.obj T)).IsSolid := by
204+ constructor; intro X
205+ rw [isIso_iff_bijective]
206+ constructor
207+ · -- INJECTIVITY: proved via sol_leftCancel axiom
208+ intro g g' hgg'
209+ -- Step 1: lift hgg' to a statement about g ≫ iso.hom = g' ≫ iso.hom
210+ have h_step : g ≫ (finFree_iso_solid R T).hom = g' ≫ (finFree_iso_solid R T).hom :=
211+ sol_leftCancel R T X _ _ (by
212+ -- hgg' has Yoneda type; coerce so that congrArg produces left-assoc syntactically
213+ -- Note: 'sol' is not in scope here; use the full name
214+ have hgg'' : (profiniteSolidification R).app X ≫ g =
215+ (profiniteSolidification R).app X ≫ g' := hgg'
216+ have h1 := congrArg (· ≫ (finFree_iso_solid R T).hom) hgg''
217+ simp only [Category.assoc] at h1
218+ exact h1)
219+ -- Step 2: cancel iso.hom on the right using iso.inv
220+ have key := congrArg (· ≫ (finFree_iso_solid R T).inv) h_step
221+ simp only [Category.assoc, Iso.hom_inv_id, Category.comp_id] at key
222+ exact key
223+ · -- SURJECTIVITY (proved 2026-06-14, congrArg approach)
224+ intro h
225+ -- h has Yoneda-obj type after intro; bind as morphism via transparent let
226+ let hm : (profiniteFree R).obj X ⟶
227+ (profiniteSolid R).obj (FintypeCat.toProfinite.obj T) := h
228+ -- h': image of hm under iso_T.hom (transparent let, so h' = hm ≫ iso_T.hom by rfl)
229+ let h' : (profiniteFree R).obj X ⟶ (finFree R).obj T :=
230+ hm ≫ (finFree_iso_solid R T).hom
231+ obtain ⟨U₀, q₀, h₀, hfact⟩ := surj_factor R T X h'
232+ refine ⟨(profiniteSolid R).map q₀ ≫ (finFree_iso_solid R U₀).hom ≫
233+ h₀ ≫ (finFree_iso_solid R T).inv, ?_⟩
234+ have hmid := sol_map_counit R U₀ X q₀
235+ -- Step 1: sol ≫ solid.map q₀ ≫ iso_U₀.hom ≫ h₀ ≫ iso_T.inv
236+ -- = profiniteFree.map q₀ ≫ h₀ ≫ iso_T.inv (via congrArg + hmid)
237+ have step1 : (profiniteSolidification R).app X ≫ (profiniteSolid R).map q₀ ≫
238+ (finFree_iso_solid R U₀).hom ≫ h₀ ≫ (finFree_iso_solid R T).inv =
239+ (profiniteFree R).map q₀ ≫ h₀ ≫ (finFree_iso_solid R T).inv := by
240+ have key := congrArg (· ≫ h₀ ≫ (finFree_iso_solid R T).inv) hmid
241+ exact key
242+ -- Step 2: profiniteFree.map q₀ ≫ h₀ ≫ iso_T.inv = h
243+ -- (hfact: h' = map q₀ ≫ h₀; h' = hm ≫ iso_T.hom; hm := h; iso cancel)
244+ have step2 : (profiniteFree R).map q₀ ≫ h₀ ≫ (finFree_iso_solid R T).inv = h := by
245+ have key2 := congrArg (· ≫ (finFree_iso_solid R T).inv) hfact.symm
246+ simp only [Category.assoc] at key2
247+ -- key2: map q₀ ≫ h₀ ≫ iso_T.inv = h' ≫ iso_T.inv; expand h' to trigger hom_inv_id
248+ rw [key2, show h' = hm ≫ (finFree_iso_solid R T).hom from rfl,
249+ Category.assoc, (finFree_iso_solid R T).hom_inv_id, Category.comp_id]
250+ exact step1.trans step2
251+
252+ /-! ### Limits of solid modules are solid -/
253+
254+ /-- If a condensed `R`-module is the limit of a diagram of solid modules, then it is solid.
255+ Fully proved (no sorry). -/
256+ lemma isSolid_of_isLimit_gen
257+ {J : Type *} [Category J]
258+ {F : J ⥤ CondensedMod.{u} R}
259+ (c : Cone F) (hc : IsLimit c)
260+ (hj : ∀ j, (F.obj j).IsSolid) :
261+ c.pt.IsSolid := by
262+ refine ⟨fun X => ?_⟩
263+ rw [isIso_iff_bijective]
264+ set sol := (profiniteSolidification R).app X
265+ have bijFun : ∀ j, Function.Bijective ((yoneda.obj (F.obj j)).map sol.op) := by
266+ intro j; have h := (hj j).isIso_solidification_map X
267+ rw [isIso_iff_bijective] at h; exact h
268+ constructor
269+ · intro f g hfg
270+ apply hc.hom_ext; intro j; apply (bijFun j).1
271+ have hfg' : sol ≫ f = sol ≫ g := hfg
272+ have key := congrArg (· ≫ c.π.app j) hfg'
273+ exact key
274+ · intro h_map
275+ choose g_j hg_j using fun j => (bijFun j).2 (h_map ≫ c.π.app j)
276+ have hg_j' : ∀ j, sol ≫ g_j j = h_map ≫ c.π.app j := hg_j
277+ have compat : ∀ {j k : J} (φ : j ⟶ k), g_j j ≫ F.map φ = g_j k := by
278+ intro j k φ
279+ have lhs : sol ≫ (g_j j ≫ F.map φ) = h_map ≫ c.π.app k := by
280+ conv_lhs => rw [← Category.assoc, hg_j' j, Category.assoc, c.w φ]
281+ exact (bijFun k).1 (lhs.trans (hg_j' k).symm)
282+ let g_cone : Cone F :=
283+ { pt := (profiniteSolid R).obj X
284+ π := { app := g_j
285+ naturality := fun j k φ => by
286+ change 𝟙 _ ≫ g_j k = g_j j ≫ F.map φ
287+ simp only [Category.id_comp]; exact (compat φ).symm } }
288+ refine ⟨hc.lift g_cone, ?_⟩
289+ change sol ≫ hc.lift g_cone = h_map
290+ apply hc.hom_ext; intro j
291+ have hfac : hc.lift g_cone ≫ c.π.app j = g_j j := hc.fac g_cone j
292+ rw [Category.assoc, hfac]; exact hg_j' j
293+
294+ /-! ### `finFree R T` is solid -/
295+
296+ /-- `(finFree R).obj T` is a solid condensed `R`-module, for any `T : FintypeCat`.
297+ Proof: transfer solidness from `profiniteSolid_fintype_isSolid` via `finFree_iso_solid R T`
298+ using Yoneda. Proved without additional axioms (uses `sol_leftCancel` indirectly via
299+ `profiniteSolid_fintype_isSolid`). -/
300+ theorem finFree_isSolid (T : FintypeCat.{u}) : ((finFree R).obj T).IsSolid := by
301+ constructor; intro X
302+ rw [isIso_iff_bijective]
303+ have hM := (profiniteSolid_fintype_isSolid R T).isIso_solidification_map X
304+ rw [isIso_iff_bijective] at hM
305+ have e := finFree_iso_solid R T
306+ constructor
307+ · -- INJECTIVITY: transfer via post-composition with e.inv / e.hom
308+ intro f g hfg
309+ have hfg' : (profiniteSolidification R).app X ≫ f =
310+ (profiniteSolidification R).app X ≫ g := hfg
311+ have key1 := congrArg (· ≫ e.inv) hfg'
312+ simp only [Category.assoc] at key1
313+ -- Use apply so Lean infers a₁ = f ≫ e.inv from return type, not from key1's non-Yoneda type
314+ have hfinv : f ≫ e.inv = g ≫ e.inv := by apply hM.1 ; exact key1
315+ -- Cancel e.inv using e.hom (inv_hom_id : e.inv ≫ e.hom = 𝟙)
316+ have key2 := congrArg (· ≫ e.hom) hfinv
317+ simp only [Category.assoc, e.inv_hom_id, Category.comp_id] at key2
318+ exact key2
319+ · -- SURJECTIVITY: h has Yoneda-obj type; let-bind as morphism first
320+ intro h
321+ let hh : (profiniteFree R).obj X ⟶ (finFree R).obj T := h
322+ obtain ⟨f', hf'⟩ := hM.2 (hh ≫ e.inv)
323+ refine ⟨f' ≫ e.hom, ?_⟩
324+ have hf'' : (profiniteSolidification R).app X ≫ f' = hh ≫ e.inv := hf'
325+ have key3 := congrArg (· ≫ e.hom) hf''
326+ simp only [Category.assoc, e.inv_hom_id, Category.comp_id] at key3
327+ change (profiniteSolidification R).app X ≫ (f' ≫ e.hom) = h
328+ exact key3
329+
330+ /-! ### General solidness of `profiniteSolid R` -/
331+
332+ /-- Every `(profiniteSolid R).obj S` is a solid condensed `R`-module, for any `S : Profinite`.
333+ Architecture complete; uses `isSolid_of_isLimit_gen` (proved) and `finFree_isSolid`
334+ (proved modulo `surj_factor` sorry and `sol_leftCancel` axiom). -/
335+ theorem profiniteSolid_obj_isSolid (S : Profinite.{u}) :
336+ ((profiniteSolid R).obj S).IsSolid := by
337+ let E := Functor.RightExtension.mk (profiniteSolid R) (profiniteSolidCounit R)
338+ have h_pwise : IsLimit (E.coneAt S) :=
339+ (profiniteSolidIsPointwiseRightKanExtension R) S
340+ change (E.coneAt S).pt.IsSolid
341+ apply isSolid_of_isLimit_gen R (E.coneAt S) h_pwise
342+ intro f
343+ exact finFree_isSolid R f.right
344+
345+ end CondensedMod
0 commit comments