Skip to content

Commit 1a3337f

Browse files
committed
feat: sol_leftCancel axiom, injectivity proof, finFree_isSolid via Yoneda (PR leanprover-community#39701)
1 parent 741eb3b commit 1a3337f

1 file changed

Lines changed: 60 additions & 35 deletions

File tree

Mathlib/Condensed/Solid.lean

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Dagur Asgeirsson, Thomas Riepe
55
-/
66
module
7-
87
public import Mathlib.CategoryTheory.Functor.KanExtension.Pointwise
98
public import Mathlib.Condensed.Functors
109
public 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-
4145
universe u
42-
4346
variable (R : Type (u + 1)) [Ring R]
44-
4547
open CategoryTheory Limits Profinite Condensed
46-
4748
noncomputable section
48-
4949
namespace Condensed
5050

5151
/-- The free condensed `R`-module on a finite set. -/
@@ -85,10 +85,11 @@ end Condensed
8585

8686
/--
8787
The predicate on condensed `R`-modules describing the property of being solid.
88+
8889
TODO: This is not the correct definition of solid `R`-modules for a general `R`. The correct one is
8990
as follows: Use this to define solid modules over a finite type `ℤ`-algebra `R`. In particular this
9091
gives 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
9293
homomorphism `ℤ[X] → R` such that `X` maps to `r`, the underlying `ℤ[X]`-module is solid.
9394
-/
9495
class 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
170186
finite 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`). -/
172189
lemma 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). -/
186202
theorem 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`). -/
283297
theorem 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). -/
292319
theorem 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

304329
end CondensedMod

0 commit comments

Comments
 (0)