Skip to content

feat(CategoryTheory/Abelian/TorsionTheory): Introduce torsion theory for abelian categories#36744

Draft
farmanb wants to merge 19 commits intoleanprover-community:masterfrom
farmanb:torsion-theory
Draft

feat(CategoryTheory/Abelian/TorsionTheory): Introduce torsion theory for abelian categories#36744
farmanb wants to merge 19 commits intoleanprover-community:masterfrom
farmanb:torsion-theory

Conversation

@farmanb
Copy link
Copy Markdown
Contributor

@farmanb farmanb commented Mar 16, 2026


Open in Gitpod

@farmanb farmanb changed the title feat(CategoryTheory/Abelian/TorsionTheory): Introduce torsion theory for abelian categories. feat(CategoryTheory/Abelian/TorsionTheory): Introduce torsion theory for abelian categories Mar 16, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Mar 16, 2026

PR summary b6118399e6

Import changes for modified files

No significant changes to the import graph

Import changes for all files
Files Import difference
Mathlib.CategoryTheory.Abelian.TorsionTheory.Basic (new file) 832

Declarations diff

+ TorsionTheory
+ eq_rightOrthogonal_leftOrthogonal
+ gc_rightOrthogonal_leftOrthogonal
+ instance (P : ObjectProperty C) : (P.leftOrthogonal).IsClosedUnderExtensions
+ instance (P : ObjectProperty C) : (P.leftOrthogonal).IsClosedUnderQuotients
+ instance (P : ObjectProperty C) {J : Type u'} [Category.{v'} J] :
+ isClosedUnderCoproducts_of_torsionTheory
+ isClosedUnderExtensions_of_torsionTheory
+ isClosedUnderQuotients_of_torsionTheory
+ isLimit_kernelFork_pullbackπ_cokernel_π
+ isTorsionClass_iff
+ kernelForkPullbackπCokernelπ
+ le_leftOrthogonal_rightOrthogonal
+ le_pullback_cokernel_π
+ le_rightOrthogonal_leftOrthogonal
+ le_sSup_of_prop
+ leftOrthogonal_rightOrthogonal_leftOrthogonal_eq_leftOrthogonal
+ leftOrthogonal_rightOrthogonal_leftOrthogonal_eq_rightOrthogonal
+ mem_free_iff
+ rightOrthogonal_cokernel_sSup
+ rightOrthogonal_leftOrthogonal_le
+ sSup_prop
+ shortComplexPullbackπCokernelπ
+ shortExact_shortComplexPullbackπCokernelπ
+ torsionTheoryCogeneratedBy
+ torsionTheoryGeneratedBy

You can run this locally as follows
## summary with just the declaration names:
./scripts/pr_summary/declarations_diff.sh <optional_commit>

## more verbose report:
./scripts/pr_summary/declarations_diff.sh long <optional_commit>

The doc-module for scripts/pr_summary/declarations_diff.sh contains some details about this script.


No changes to technical debt.

You can run this locally as

./scripts/reporting/technical-debt-metrics.sh pr_summary
  • The relative value is the weighted sum of the differences with weight given by the inverse of the current value of the statistic.
  • The absolute value is the relative value divided by the total sum of the inverses of the current values (i.e. the weighted average of the differences).

@github-actions github-actions bot added the t-category-theory Category theory label Mar 16, 2026
@farmanb
Copy link
Copy Markdown
Contributor Author

farmanb commented Mar 16, 2026

WIP

@github-actions github-actions bot added the WIP Work in progress label Mar 16, 2026
/-- A Torsion Theory in an abelian category consists of two classes, `T` and `F`, of
torsion and torsion-free objects, respectively, such that `T` is the left orthogonal
of `F` and `F` is the right orthogonal of `T`. -/
class TorsionTheory (T F : ObjectProperty C) : Prop where
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this resembles Concept

@joelriou
Copy link
Copy Markdown
Contributor

It would be useful to show this:

lemma gc_rightOrthogonal_leftOrthogonal :
    GaloisConnection (OrderDual.toDual (α := ObjectProperty C) ∘ rightOrthogonal)
  (leftOrthogonal ∘ OrderDual.ofDual) :=
  fun _ _ ↦ ⟨fun h _ hX _ _ hY ↦ h _ hY _ hX, fun h _ hX _ _ hY ↦ h _ hY _ hX⟩

Comment on lines +149 to +150
lemma isClosedUnderCoproducts_of_torsionTheory {T F : ObjectProperty C} (hTF : TorsionTheory T F) :
∀ {J : Type w}, T.IsClosedUnderColimitsOfShape (Discrete J) := by
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should hold for colimits of any shape, and this should even be an instance for MorphismProperty.leftOrthogonal (and there is a dual statement for rightOrthogonal).
In general, from the various lemmas, could you extract the statements (instances) which hold for any left or right orthogonal?

blake-farman added 3 commits March 20, 2026 22:18
…otients, extensions, and coproducts in a locally small and well-powered category C, then P = P.rightOrthogonal.leftOrthogonal. This is basically the characterization of a torsion class.
(X : C) :
P (Subobject.sSup {A : Subobject X | P (A : C)}) := by
let subobjs := {A : Subobject X | P (A : C)}
let I := equivShrink (Subobject X) '' subobjs
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here, you may probably simplify the proof a little bit by showing that C has coproducts of shape subobjs (and P is stable under such coproducts) by transporting the assumptions through an equivalence of discrete categories (also given by equivShrink, but once these instance are around, equivShrink will no longer be necessary in the rest of the code).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I took a stab at this. I'm not sure it's actually simpler. I can't see a way to avoid using equivShrink since sSup subobjs is defined to be the image of smallCoproductDesc subobjs, which in turn is defined via equivShrink. The colimit over the subobjs-indexed functor is isomorphic but not definitionally equal to the coproduct inside sSup, so it appears necessary to build the bridge between them explicitly. I'm not sure if you see something that I don't, or if I've misunderstood your intent...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is even more simple:

lemma prop_sSup_subobjectOf (P : ObjectProperty C)
    [P.IsClosedUnderQuotients] [∀ J : Type w, P.IsClosedUnderColimitsOfShape (Discrete J)]
    [LocallySmall.{w} C] [WellPowered.{w} C] [HasCoproducts.{w} C]
    (X : C) : P (Subobject.sSup {A : Subobject X | P (A : C)}) :=
  P.prop_of_iso (Subobject.underlyingIso
    (Limits.image.ι (Subobject.smallCoproductDesc _))).symm
      (P.prop_of_epi (factorThruImage _)
        ((ObjectProperty.prop_colimit _ _ (fun ⟨j⟩ ↦ by
          dsimp
          obtain ⟨S, hS, hj⟩ := j.2
          simpa [← hj] using hS))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

t-category-theory Category theory WIP Work in progress

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants