Strict autoequivalence groups acting on slicings #
Aut(D) is not a group in Lean: C ≌ C under composition is associative only
up to natural isomorphism, so it carries no Group instance and MulAction is
not available. This file takes the cheap way out, deliberately: instead of
quotienting to isomorphism classes, it asks for a group that maps into
endofunctors strictly.
That works because functor composition in Lean is strictly associative —
C ⥤ C is an honest monoid under ⋙. So StrictAut G C below is just a
monoid homomorphism G → (C ⥤ C) whose functors are triangulated, and the
resulting MulAction G (Slicing C) needs no coherence bookkeeping at all.
What this deliberately does NOT cover #
map_one and map_mul are equalities of functors, so F g ⋙ F g⁻¹ = 𝟭 C
on the nose: each F g is an isomorphism of categories, not merely an
equivalence. Many autoequivalences one actually cares about — Serre functors,
spherical twists — satisfy that only up to natural isomorphism, and are
therefore out of scope here.
So this is a real restriction, not a reformulation. It buys a strict
MulAction today at the cost of generality; the general Aut(D) action still
wants the quotient. Do not cite this as "the Aut action is formalized". The
stability-foundation ownership record notes this deliberate restriction.
What it does cover #
Everything hard is already in WeakStabilityCondition/StabilityCondition/Symmetry/Autoequivalence/Slicing/Transport.lean — PostnikovTower.mapF,
HNFiltration.mapF, Slicing.mapEquiv. This file only supplies the group
packaging: StrictAut.equiv turns the strict data into an honest
Equivalence (unit and counit are eqToIso, and the coherence field
discharges automatically), and the MulAction laws are then two simps.
The MulAction is a def, not an instance — ρ is unrecoverable by
instance search, so as an instance it was dead code. See
mulActionSlicing's own docstring.
A strict action of a group G on C by triangulated autoequivalences:
a monoid hom into C ⥤ C, which is a strict monoid under ⋙.
map_mul is contravariant (F (g * h) = F h ⋙ F g) because ⋙ is
diagrammatic order: (F h ⋙ F g).obj = F g ∘ F h.
- F : G → Functor C C
The endofunctor attached to a group element.
The unit acts as the identity functor, on the nose.
Multiplication is composition, on the nose.
Every
F gis additive.Every
F gcommutes with the shift. Unlike its neighbours this field is data, not a proof —Functor.CommShiftcarries the comparison isomorphism — which is whydocBlameasks for a docstring here and not for theProp-valued fields around it.- triangulated (g : G) : (self.F g).IsTriangulated
Every
F gsends distinguished triangles to distinguished triangles.
Instances For
Each ρ.F g is an equivalence, with ρ.F g⁻¹ as a strict inverse.
Unit and counit are eqToIso; Equivalence.mk's coherence field discharges
automatically.
Equations
- ρ.equiv g = CategoryTheory.Equivalence.mk (ρ.F g) (ρ.F g⁻¹) (CategoryTheory.eqToIso ⋯) (CategoryTheory.eqToIso ⋯)
Instances For
g acts on a slicing by moving objects: (g • s).P φ X = s.P φ (g⁻¹ X).
Dual to relabel, which moves phases and fixes objects. The letIs must state
each instance at the (ρ.equiv g).functor form — instance search will not
unfold it to ρ.F g — and must be letI, not haveI, because
Functor.IsTriangulated depends on the CommShift instance and an opaque
haveI breaks the match.
Equations
- ρ.actSlicing g s = s.mapEquiv (ρ.equiv g)
Instances For
A strict group of triangulated autoequivalences acts on slicings.
A def, not an instance, and that is forced rather than stylistic. ρ
is explicit data appearing neither in the return type MulAction G (Slicing C)
nor in any instance-implicit argument, so instance search has nothing to infer
it from: as an instance this was unreachable and could never have fired —
the impossibleInstance linter's finding, and a real defect, not a style nit.
It would also be the wrong thing to register globally even if it worked, since
the head MulAction G (Slicing C) claims every group acts on the slicings of
every pretriangulated category, for whatever ρ search happened to pick.
Bring it into scope at the use site with letI := ρ.mulActionSlicing. For an
action • can find on its own, use AutQuot
(WeakStabilityCondition/StabilityCondition/Symmetry/Autoequivalence/Slicing/Quotient.lean), where
the acting object is the group.
@[reducible] because Lean requires it of any def whose type is a class —
Mathlib's reducible-non-instance convention, and what makes the letI above
transparent to later instance search.
Equations
- ρ.mulActionSlicing = { smul := ρ.actSlicing, mul_smul := ⋯, one_smul := ⋯ }