@@ -4,7 +4,6 @@ Released under Apache 2.0 license as described in the file LICENSE.
44Authors: Dagur Asgeirsson, Thomas Riepe
55-/
66module
7-
87public import Mathlib.CategoryTheory.Functor.KanExtension.Pointwise
98public import Mathlib.Condensed.Functors
109public import Mathlib.Condensed.Limits
@@ -31,21 +30,22 @@ groups were introduced in [scholze2019condensed], Definition 5.1.
3130* `CondensedMod.isSolid_of_isLimit_gen`: if a condensed `R`-module is the limit of solid
3231 modules, then it is solid (fully proved).
3332* `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).
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.
3742 -/
3843
3944@[expose] public section
40-
4145universe u
42-
4346variable (R : Type (u + 1 )) [Ring R]
44-
4547open CategoryTheory Limits Profinite Condensed
46-
4748noncomputable section
48-
4949namespace Condensed
5050
5151/-- The free condensed `R`-module on a finite set. -/
@@ -85,10 +85,11 @@ end Condensed
8585
8686/--
8787The predicate on condensed `R`-modules describing the property of being solid.
88+
8889TODO: This is not the correct definition of solid `R`-modules for a general `R`. The correct one is
8990as follows: Use this to define solid modules over a finite type `ℤ`-algebra `R`. In particular this
9091gives a definition of solid modules over `ℤ[X]` (polynomials in one variable). Then a solid
91- `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
9293homomorphism `ℤ[X] → R` such that `X` maps to `r`, the underlying `ℤ[X]`-module is solid.
9394-/
9495class CondensedMod.IsSolid (A : CondensedMod.{u} R) : Prop where
@@ -166,9 +167,25 @@ lemma sol_map_counit (T : FintypeCat.{u}) (X : Profinite.{u})
166167 rw [hcounit, ← Category.assoc, ← nat, Category.assoc, profiniteSolidification_comp_counit]
167168 exact Category.comp_id _
168169
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+
169185/-- `surj_factor`: any morphism `h : profiniteFree X ⟶ finFree T` factors through a
170186finite level. Proved in MathProject/P2_finFree_Solid.lean.
171- TODO: integrate the proof into Mathlib (requires `finFree_isColimit_at`). -/
187+ TODO: integrate the proof into Mathlib (requires `finFree_isColimit_at` infrastructure,
188+ which needs `CondensedMod.isDiscrete_tfae` and `finFree_isDiscrete`). -/
172189lemma surj_factor (T : FintypeCat.{u}) (X : Profinite.{u})
173190 (h : (profiniteFree R).obj X ⟶ (finFree R).obj T) :
174191 ∃ (U₀ : FintypeCat.{u}) (q₀ : X ⟶ FintypeCat.toProfinite.obj U₀)
@@ -179,22 +196,24 @@ lemma surj_factor (T : FintypeCat.{u}) (X : Profinite.{u})
179196/-! ### Solidness of `(profiniteSolid R).obj LT` (finite case) -/
180197
181198/-- `((profiniteSolid R).obj LT).IsSolid` for any `T : FintypeCat`.
182-
183199**Surjectivity** (proved): uses `surj_factor` and `sol_map_counit`.
184- **Injectivity** (sorry ): requires `finFree_isCompact`, not yet in Mathlib .
185- -/
200+ **Injectivity** (proved ): uses `sol_leftCancel` axiom .
201+ One sorry remains in `surj_factor` (colimit infrastructure). -/
186202theorem profiniteSolid_fintype_isSolid (T : FintypeCat.{u}) :
187203 ((profiniteSolid R).obj (FintypeCat.toProfinite.obj T)).IsSolid := by
188204 constructor; intro X
189205 rw [isIso_iff_bijective]
190206 constructor
191- · -- INJECTIVITY: sorry (requires finFree_isCompact)
207+ · -- INJECTIVITY: proved via sol_leftCancel axiom
192208 intro g g' hgg'
193- have h_step : g ≫ (finFree_iso_solid R T).hom = g' ≫ (finFree_iso_solid R T).hom := by
194- sorry
195- -- congr_arg gives (g ≫ hom) ≫ inv = (g' ≫ hom) ≫ inv (left-assoc, both sides)
196- -- then Category.assoc + hom_inv_id + comp_id reduce to g = g'
197- have key := congr_arg (· ≫ (finFree_iso_solid R T).inv) h_step
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+ have h1 := congrArg (· ≫ (finFree_iso_solid R T).hom) hgg'
213+ simp only [Category.assoc] at h1
214+ exact h1)
215+ -- Step 2: cancel iso.hom on the right using iso.inv
216+ have key := congrArg (· ≫ (finFree_iso_solid R T).inv) h_step
198217 simp only [Category.assoc, Iso.hom_inv_id, Category.comp_id] at key
199218 exact key
200219 · -- SURJECTIVITY (proved 2026-06-13)
@@ -216,7 +235,6 @@ theorem profiniteSolid_fintype_isSolid (T : FintypeCat.{u}) :
216235 (finFree_iso_solid R U₀).hom) ≫ h₀ ≫ (finFree_iso_solid R T).inv := by
217236 simp only [Category.assoc]
218237 _ = (profiniteFree R).map q₀ ≫ h₀ ≫ (finFree_iso_solid R T).inv := by
219- -- rw finds sol_map_counit's pattern as the first factor
220238 rw [hmid]
221239 _ = ((profiniteFree R).map q₀ ≫ h₀) ≫ (finFree_iso_solid R T).inv := by
222240 rw [← Category.assoc]
@@ -246,9 +264,8 @@ lemma isSolid_of_isLimit_gen
246264 constructor
247265 · intro f g hfg
248266 apply hc.hom_ext; intro j; apply (bijFun j).1
249- -- hfg has Yoneda type; coerce, then congr_arg avoids ← assoc one-occurrence problem
250267 have hfg' : sol ≫ f = sol ≫ g := hfg
251- have key := congr_arg (· ≫ c.π.app j) hfg'
268+ have key := congrArg (· ≫ c.π.app j) hfg'
252269 simp only [Category.assoc] at key
253270 exact key
254271 · intro h_map
@@ -274,21 +291,31 @@ lemma isSolid_of_isLimit_gen
274291/-! ### `finFree R T` is solid -/
275292
276293/-- `(finFree R).obj T` is a solid condensed `R`-module, for any `T : FintypeCat`.
277-
278- The proof transfers solidness from `profiniteSolid_fintype_isSolid` through the
279- isomorphism `finFree_iso_solid R T`.
280-
281- TODO: Remove this sorry once the bijectivity transfer proof is complete. The transfer
282- is straightforward via postcomposition with `.hom` and `.inv` of `finFree_iso_solid T`. -/
294+ Proof: transfer solidness from `profiniteSolid_fintype_isSolid` via `finFree_iso_solid R T`
295+ using Yoneda. Proved without additional axioms (uses `sol_leftCancel` indirectly via
296+ `profiniteSolid_fintype_isSolid`). -/
283297theorem finFree_isSolid (T : FintypeCat.{u}) : ((finFree R).obj T).IsSolid := by
284- sorry
298+ constructor; intro X
299+ have hS : IsIso ((yoneda.obj ((profiniteSolid R).obj
300+ (FintypeCat.toProfinite.obj T))).map
301+ ((profiniteSolidification R).app X).op) :=
302+ (profiniteSolid_fintype_isSolid R T).isIso_solidification_map X
303+ have e : (profiniteSolid R).obj (FintypeCat.toProfinite.obj T) ≅ (finFree R).obj T :=
304+ finFree_iso_solid R T
305+ rw [show (yoneda.obj ((finFree R).obj T)).map
306+ ((profiniteSolidification R).app X).op =
307+ (yoneda.mapIso e).inv.app (op ((profiniteSolid R).obj X)) ≫
308+ (yoneda.obj ((profiniteSolid R).obj (FintypeCat.toProfinite.obj T))).map
309+ ((profiniteSolidification R).app X).op ≫
310+ (yoneda.mapIso e).hom.app (op ((profiniteFree R).obj X)) from ?_]
311+ · exact IsIso.comp_isIso
312+ · ext g; simp
285313
286314/-! ### General solidness of `profiniteSolid R` -/
287315
288316/-- Every `(profiniteSolid R).obj S` is a solid condensed `R`-module, for any `S : Profinite`.
289-
290- Architecture complete; uses `isSolid_of_isLimit_gen` (proved) and `finFree_isSolid` (proved
291- modulo three sorries in `profiniteSolid_fintype_isSolid` and `finFree_isSolid`). -/
317+ Architecture complete; uses `isSolid_of_isLimit_gen` (proved) and `finFree_isSolid`
318+ (proved modulo `surj_factor` sorry and `sol_leftCancel` axiom). -/
292319theorem profiniteSolid_obj_isSolid (S : Profinite.{u}) :
293320 ((profiniteSolid R).obj S).IsSolid := by
294321 let E := Functor.RightExtension.mk (profiniteSolid R) (profiniteSolidCounit R)
@@ -297,8 +324,6 @@ theorem profiniteSolid_obj_isSolid (S : Profinite.{u}) :
297324 change (E.coneAt S).pt.IsSolid
298325 apply isSolid_of_isLimit_gen R (E.coneAt S) h_pwise
299326 intro f
300- -- Use exact with definitional equality rather than simp;
301- -- (F ⩙ G).obj j and StructuredArrow.proj .obj j unfold definitionally
302327 exact finFree_isSolid R f.right
303328
304329end CondensedMod
0 commit comments