Transporting homogeneous morphisms across chosen shifts #
IsShiftBy.mapShift moves a closed degree-zero morphism across two chosen
shifts. A shift functor has to move morphisms of every degree, and this file
does that.
One characterising square, and everything else follows #
shiftMap is written down as s.inv ≫ f ≫ s'.hom, but nothing below unfolds
that formula. What is used is that it is the unique degree-p morphism c
with
s.hom ≫ c = f ≫ s'.hom,
uniqueness holding because s.inv ≫ s.hom = 𝟙 makes left composition with
s.hom injective. Identity, composition and the differential are then three
short verifications of that square rather than three associativity chains.
The differential is where the sign appears #
s.hom and s'.hom are closed, so differentiating the square leaves one
Leibniz term, and with the repository's convention
δ(a ≫ b) = a ≫ δb + (-1)^|b| δa ≫ b and |s'.hom| = -n that term carries
(-1)^n. So
δ (shiftMap p f) = (-1)^n • shiftMap (p+1) (δ f),
and not shiftMap (p+1) (δ f). A shift functor must therefore multiply
shiftMap by a sign depending on the degree; (-1)^(n * p) is the unique
solution, and Pretriangulated/FunctorCategory.lean uses it. This is the
reason the naive formula does not define a dg functor.
dgComp commutes with the sign action in its first argument.
dgComp commutes with the sign action in its second argument.
Transport a homogeneous morphism across chosen shifts of its source and target: go back along the source's shift, across, and out along the target's.
mapShift is this at degree zero. The sign that makes the construction a dg
functor is not included here; see the module docstring.
Equations
- s.shiftMap s' p f = ((CategoryTheory.DGCategoryStruct.dgComp (n + p) (-n) p ⋯) (((CategoryTheory.DGCategoryStruct.dgComp n p (n + p) ⋯) s.inv) f)) s'.hom
Instances For
The characterising square. s.hom followed by the transported
morphism is the morphism followed by s'.hom.
The transported morphism is the only one making that square commute.
Left composition with s.hom is injective because s.inv is a left inverse
for it, so the square determines c. Every property of shiftMap below is
proved by checking the square for a candidate.
Transport is additive in the morphism.
Transport commutes with the sign action.
Transport takes the identity to the identity.
Transport preserves the graded composition.
Transport followed by the target's inverse is the source's inverse
followed by the morphism. The two hom/inv factors in the middle cancel,
and this is the form the shift witness's surjectivity argument needs.
Transport does not commute with the differential; it anticommutes by
(-1)^n.
Both s.hom and s'.hom are closed, so differentiating the characterising
square leaves the single Leibniz term carrying (-1)^{-n} = (-1)^n. This is
the identity that forces a shift functor's sign, and it is why the naive
formula does not define a dg functor.
Naturality transports back along the inverses.
Suppose a degree-q family is natural for the transported morphism
s.shiftMap t r g (with the shift functor's sign (-1)^(n r) in place). Then
the family composed with the inverses is natural for g itself, at degree
p = q + n, and the sign becomes (-1)^(p r).
This is the step that makes right composition with a shift element surjective
on natural transformations, and it is stated here, with every object a
variable, on purpose: in the dg category of dg functors the same identity has
(F.shiftedFunctor n).obj X and F.shiftObj n X in the two arguments, which
are definitionally but not syntactically equal, and rw cannot build a motive
over such a goal.
Composing with the inverse and then with the shift element again is the
identity. Stated with the ambient object a variable for the same reason as
comp_inv_naturality.
Comparing two chosen shifts, and composing shifts #
Everything above fixes one shift of the source and one of the target. A shift
functor needs two more things: that the shifts of one object by n form a
contractible groupoid, which IsShiftBy.compare already says, and that
shifting by n and then by m agrees with shifting by n + m. The lemmas
here make both statements natural in the morphism rather than true only at
each object.
The characterising property of compare. Composing the first shift
element with the comparison gives the second; this is s.hom ≫ s.inv = 𝟙 and
nothing else. Every use of compare below reduces to it.
Transport commutes with the comparison of chosen shifts.
Both sides are the transport of f from s to t', because both satisfy that
one characterising square; shiftMap_unique is applied twice and the two
results are compared. This is what lets a shift functor be built from chosen
witnesses without the choice mattering, in every degree and not only in degree
zero.
Transport across a composite shift is the two transports in turn.
IsShiftBy.comp' composes two shift witnesses; this says its shiftMap is the
composite of the two shiftMaps. Together with shiftMap_compare it is the
whole content of a shift functor being additive in the degree.
The two transports and their two signs, merged.
This is comp'_shiftMap with the shift functor's Koszul signs already in
place: shifting by n contributes (-1)^(n p) and then shifting by m
contributes (-1)^(m p), and the product is the (-1)^(nm p) of the single
shift because n p + m p = nm p. Stated here, with every object a variable,
so that the functor-category proof can apply it instead of rewriting across
two spellings of the same shifted object.
Coherence for three composed shifts #
The binary comparison for shifted dg functors is canonical only if its two threefold composites agree. The two lemmas below isolate the remaining pointwise content of that coherence. They are stated for arbitrary shift witnesses so the functor-category proof does not have to unfold the chosen shifted objects.
The degree-zero transport of a comparison is the comparison of the composite witnesses.
The total degree nm is explicit because the associativity proof compares
the propositionally equal indices (n + m) + k and n + (m + k). The proof
uses the characterising square of shiftMap; this is the all-degree
counterpart of mapShift_compare_comp'.
Prefixing two witnesses by the same shift does not change their comparison: the common shift element and its inverse cancel. The explicit total degree keeps the statement usable under either bracketing of three integer shifts.
In degree zero, transport is IsShiftBy.mapShift.
mapShift is the degree-zero transport that Pretriangulated/Basic.lean
already had, and shiftMap is the all-degree one. They are the same map, but
not definitionally: shiftMap indexes its middle composite by n + p, which
at p = 0 is n + 0 and is only propositionally n. shiftMap_unique
crosses that gap, because its result index is a free variable.
Transport across the identity shift is the identity.