IsShiftBy really is a shift of hom-complexes #
Pretriangulated.lean says, in prose, that Y is a shift of X by n when
dgHom W Y ≅ (dgHom W X)⟦n⟧ naturally in W. What IsShiftBy actually
carries is weaker on its face: a closed element ε of degree -n such that
right composition with it is bijective in each degree. Degreewise
bijections are not an isomorphism of complexes, so the sentence is a gloss
until someone supplies the differentials.
This file supplies them, and the point is that the Koszul sign is what makes it work. Leibniz gives
δ (f · ε) = f · (δ ε) + (-1) ^ (-n) • (δ f) · ε
and ε is closed, so δ (f · ε) = (-1) ^ (-n) • (δ f) · ε. Right composition
with ε therefore does not commute with the differentials — it commutes
with them up to (-1) ^ (-n). That is exactly the sign shiftD carries, so
compRight is a map of complexes into the shifted hom-complex and into no
other. The two (-1) ^ (-n) cancel because a unit squares to one, which is the
whole proof of compRight_comm.
So Shift.lean's sign is not decoration on a definition: it is what makes
IsShiftBy's degreewise data assemble into the isomorphism its docstring
claims.
Right composition with a closed element of degree -n is a map of
complexes into the (-n)-shifted hom-complex. It is not a map into the
unshifted one: Leibniz leaves a factor (-1) ^ (-n), and shiftD (-n) is
where that factor is absorbed.
The morphism of complexes underlying IsShiftBy: right composition with the
structure element, landing in the shifted hom-complex.
Equations
- h.homMap W = { f := fun (p : ℤ) => AddCommGrpCat.ofHom (CategoryTheory.compRight W h.hom p (p + -n) ⋯), comm' := ⋯ }
Instances For
Each component of IsShiftBy.homMap is bijective — this is the structure's
own bijective field, restated at the degree the shifted complex uses.
The Hom-complex comparison represented by a chosen dg shift.
This is the categorical form of the degreewise bijectivity stored in
IsShiftBy: homMap already supplies compatibility with the differentials,
and its components are isomorphisms by bijective_homMap.
Equations
- h.homIso W = HomologicalComplex.Hom.isoOfComponents (fun (p : ℤ) => CategoryTheory.asIso ((h.homMap W).f p)) ⋯