File: Mathlib/CategoryTheory/Shift/ShiftSequence.lean

full_name: CategoryTheory.Functor.ShiftSequence.shiftIso_add
code: /-- A shift sequence for a functor `F : C ⥤ A` when `C` is equipped with a shift
by a monoid `M` involves a sequence of functor `sequence n : C ⥤ A` for all `n : M`
which behave like `shiftFunctor C n ⋙ F`. -/
class ShiftSequence where
  /-- a sequence of functors -/
  sequence : M → C ⥤ A
  /-- `sequence 0` identifies to the given functor -/
  isoZero : sequence 0 ≅ F
  /-- compatibility isomorphism with the shift -/
  shiftIso (n a a' : M) (ha' : n + a = a') : shiftFunctor C n ⋙ sequence a ≅ sequence a'
  shiftIso_zero (a : M) : shiftIso 0 a a (zero_add a) =
    isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _
  shiftIso_add : ∀ (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a''),
    shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (shiftIso n a a' ha') ≪≫ shiftIso m a' a'' ha''
goal: CategoryTheory.Functor.ShiftSequence.shiftIso (m + n) a a'' ⋯ =
  CategoryTheory.isoWhiskerRight (CategoryTheory.shiftFunctorAdd C m n)
      (CategoryTheory.Functor.ShiftSequence.sequence F a) ≪≫
    (CategoryTheory.shiftFunctor C m).associator (CategoryTheory.shiftFunctor C n)
        (CategoryTheory.Functor.ShiftSequence.sequence F a) ≪≫
      CategoryTheory.isoWhiskerLeft (CategoryTheory.shiftFunctor C m)
          (CategoryTheory.Functor.ShiftSequence.shiftIso n a a' ha') ≪≫
        CategoryTheory.Functor.ShiftSequence.shiftIso m a' a'' ha''

full_name: CategoryTheory.Functor.ShiftSequence.sequence
code: /-- A shift sequence for a functor `F : C ⥤ A` when `C` is equipped with a shift
by a monoid `M` involves a sequence of functor `sequence n : C ⥤ A` for all `n : M`
which behave like `shiftFunctor C n ⋙ F`. -/
class ShiftSequence where
  /-- a sequence of functors -/
  sequence : M → C ⥤ A
  /-- `sequence 0` identifies to the given functor -/
  isoZero : sequence 0 ≅ F
  /-- compatibility isomorphism with the shift -/
  shiftIso (n a a' : M) (ha' : n + a = a') : shiftFunctor C n ⋙ sequence a ≅ sequence a'
  shiftIso_zero (a : M) : shiftIso 0 a a (zero_add a) =
    isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _
  shiftIso_add : ∀ (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a''),
    shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (shiftIso n a a' ha') ≪≫ shiftIso m a' a'' ha''
goal: M → C ⥤ A

full_name: CategoryTheory.Functor.ShiftSequence.isoZero
code: /-- A shift sequence for a functor `F : C ⥤ A` when `C` is equipped with a shift
by a monoid `M` involves a sequence of functor `sequence n : C ⥤ A` for all `n : M`
which behave like `shiftFunctor C n ⋙ F`. -/
class ShiftSequence where
  /-- a sequence of functors -/
  sequence : M → C ⥤ A
  /-- `sequence 0` identifies to the given functor -/
  isoZero : sequence 0 ≅ F
  /-- compatibility isomorphism with the shift -/
  shiftIso (n a a' : M) (ha' : n + a = a') : shiftFunctor C n ⋙ sequence a ≅ sequence a'
  shiftIso_zero (a : M) : shiftIso 0 a a (zero_add a) =
    isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _
  shiftIso_add : ∀ (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a''),
    shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (shiftIso n a a' ha') ≪≫ shiftIso m a' a'' ha''
goal: CategoryTheory.Functor.ShiftSequence.sequence F 0 ≅ F

full_name: CategoryTheory.Functor.ShiftSequence.shiftIso_zero
code: /-- A shift sequence for a functor `F : C ⥤ A` when `C` is equipped with a shift
by a monoid `M` involves a sequence of functor `sequence n : C ⥤ A` for all `n : M`
which behave like `shiftFunctor C n ⋙ F`. -/
class ShiftSequence where
  /-- a sequence of functors -/
  sequence : M → C ⥤ A
  /-- `sequence 0` identifies to the given functor -/
  isoZero : sequence 0 ≅ F
  /-- compatibility isomorphism with the shift -/
  shiftIso (n a a' : M) (ha' : n + a = a') : shiftFunctor C n ⋙ sequence a ≅ sequence a'
  shiftIso_zero (a : M) : shiftIso 0 a a (zero_add a) =
    isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _
  shiftIso_add : ∀ (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a''),
    shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (shiftIso n a a' ha') ≪≫ shiftIso m a' a'' ha''
goal: CategoryTheory.Functor.ShiftSequence.shiftIso 0 a a ⋯ =
  CategoryTheory.isoWhiskerRight (CategoryTheory.shiftFunctorZero C M)
      (CategoryTheory.Functor.ShiftSequence.sequence F a) ≪≫
    (CategoryTheory.Functor.ShiftSequence.sequence F a).leftUnitor

full_name: CategoryTheory.Functor.ShiftSequence
code: /-- A shift sequence for a functor `F : C ⥤ A` when `C` is equipped with a shift
by a monoid `M` involves a sequence of functor `sequence n : C ⥤ A` for all `n : M`
which behave like `shiftFunctor C n ⋙ F`. -/
class ShiftSequence where
  /-- a sequence of functors -/
  sequence : M → C ⥤ A
  /-- `sequence 0` identifies to the given functor -/
  isoZero : sequence 0 ≅ F
  /-- compatibility isomorphism with the shift -/
  shiftIso (n a a' : M) (ha' : n + a = a') : shiftFunctor C n ⋙ sequence a ≅ sequence a'
  shiftIso_zero (a : M) : shiftIso 0 a a (zero_add a) =
    isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _
  shiftIso_add : ∀ (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a''),
    shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (shiftIso n a a' ha') ≪≫ shiftIso m a' a'' ha''
goal: Type (max (max (max (max u_1 u_2) u_3) u_5) u_6)

full_name: CategoryTheory.Functor.ShiftSequence.shiftIso
code: /-- A shift sequence for a functor `F : C ⥤ A` when `C` is equipped with a shift
by a monoid `M` involves a sequence of functor `sequence n : C ⥤ A` for all `n : M`
which behave like `shiftFunctor C n ⋙ F`. -/
class ShiftSequence where
  /-- a sequence of functors -/
  sequence : M → C ⥤ A
  /-- `sequence 0` identifies to the given functor -/
  isoZero : sequence 0 ≅ F
  /-- compatibility isomorphism with the shift -/
  shiftIso (n a a' : M) (ha' : n + a = a') : shiftFunctor C n ⋙ sequence a ≅ sequence a'
  shiftIso_zero (a : M) : shiftIso 0 a a (zero_add a) =
    isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _
  shiftIso_add : ∀ (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a''),
    shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (shiftIso n a a' ha') ≪≫ shiftIso m a' a'' ha''
goal: CategoryTheory.shiftFunctor C n ⋙ CategoryTheory.Functor.ShiftSequence.sequence F a ≅
  CategoryTheory.Functor.ShiftSequence.sequence F a'

full_name: CategoryTheory.Functor.ShiftSequence.tautological
code: /-- The tautological shift sequence on a functor. -/
noncomputable def ShiftSequence.tautological : ShiftSequence F M 
goal: F.ShiftSequence M

full_name: CategoryTheory.Functor.shift
code: /-- The shifted functors given by the shift sequence. -/
def shift (n : M) : C ⥤ A 
goal: C ⥤ A

full_name: CategoryTheory.Functor.shiftIso
code: /-- Compatibility isomorphism `shiftFunctor C n ⋙ F.shift a ≅ F.shift a'` when `n + a = a'`. -/
def shiftIso (n a a' : M) (ha' : n + a = a') :
    shiftFunctor C n ⋙ F.shift a ≅ F.shift a' 
goal: CategoryTheory.shiftFunctor C n ⋙ F.shift a ≅ F.shift a'

full_name: CategoryTheory.Functor.shiftIso_hom_naturality
code: @[reassoc (attr := simp 1100)]
lemma shiftIso_hom_naturality {X Y : C} (n a a' : M) (ha' : n + a = a') (f : X ⟶ Y) :
    (shift F a).map (f⟦n⟧') ≫ (shiftIso F n a a' ha').hom.app Y =
      (shiftIso F n a a' ha').hom.app X ≫ (shift F a').map f 
goal: (F.shift a).map ((CategoryTheory.shiftFunctor C n).map f) ≫ (F.shiftIso n a a' ha').hom.app Y =
  (F.shiftIso n a a' ha').hom.app X ≫ (F.shift a').map f

full_name: CategoryTheory.Functor.shiftIso_inv_naturality
code: @[reassoc (attr := simp 1100)]
lemma shiftIso_inv_naturality {X Y : C} (n a a' : M) (ha' : n + a = a') (f : X ⟶ Y) :
    (shift F a').map f ≫ (shiftIso F n a a' ha').inv.app Y =
      (shiftIso F n a a' ha').inv.app X ≫ (shift F a).map (f⟦n⟧') 
goal: (F.shift a').map f ≫ (F.shiftIso n a a' ha').inv.app Y =
  (F.shiftIso n a a' ha').inv.app X ≫ (F.shift a).map ((CategoryTheory.shiftFunctor C n).map f)

full_name: CategoryTheory.Functor.isoShiftZero
code: /-- The canonical isomorphism `F.shift 0 ≅ F`. -/
def isoShiftZero : F.shift (0 : M) ≅ F 
goal: F.shift 0 ≅ F

full_name: CategoryTheory.Functor.isoShift
code: /-- The canonical isomorphism `shiftFunctor C n ⋙ F ≅ F.shift n`. -/
def isoShift (n : M) : shiftFunctor C n ⋙ F ≅ F.shift n 
goal: CategoryTheory.shiftFunctor C n ⋙ F ≅ F.shift n

full_name: CategoryTheory.Functor.isoShift_hom_naturality
code: @[reassoc]
lemma isoShift_hom_naturality (n : M) {X Y : C} (f : X ⟶ Y) :
    F.map (f⟦n⟧') ≫ (F.isoShift n).hom.app Y =
      (F.isoShift n).hom.app X ≫ (F.shift n).map f 
goal: F.map ((CategoryTheory.shiftFunctor C n).map f) ≫ (F.isoShift n).hom.app Y =
  (F.isoShift n).hom.app X ≫ (F.shift n).map f

full_name: CategoryTheory.Functor.isoShift_inv_naturality
code: @[reassoc]
lemma isoShift_inv_naturality (n : M) {X Y : C} (f : X ⟶ Y) :
    (F.shift n).map f ≫ (F.isoShift n).inv.app Y =
      (F.isoShift n).inv.app X ≫ F.map (f⟦n⟧') 
goal: (F.shift n).map f ≫ (F.isoShift n).inv.app Y =
  (F.isoShift n).inv.app X ≫ F.map ((CategoryTheory.shiftFunctor C n).map f)

full_name: CategoryTheory.Functor.shiftIso_zero
code: lemma shiftIso_zero (a : M) :
    F.shiftIso 0 a a (zero_add a) =
      isoWhiskerRight (shiftFunctorZero C M) _ ≪≫ leftUnitor _ 
goal: F.shiftIso 0 a a ⋯ =
  CategoryTheory.isoWhiskerRight (CategoryTheory.shiftFunctorZero C M) (F.shift a) ≪≫ (F.shift a).leftUnitor

full_name: CategoryTheory.Functor.shiftIso_zero_hom_app
code: @[simp]
lemma shiftIso_zero_hom_app (a : M) (X : C) :
    (F.shiftIso 0 a a (zero_add a)).hom.app X =
      (shift F a).map ((shiftFunctorZero C M).hom.app X) 
goal: (F.shiftIso 0 a a ⋯).hom.app X = (F.shift a).map ((CategoryTheory.shiftFunctorZero C M).hom.app X)

full_name: CategoryTheory.Functor.shiftIso_zero_inv_app
code: @[simp]
lemma shiftIso_zero_inv_app (a : M) (X : C) :
    (F.shiftIso 0 a a (zero_add a)).inv.app X =
      (shift F a).map ((shiftFunctorZero C M).inv.app X) 
goal: (F.shiftIso 0 a a ⋯).inv.app X = (F.shift a).map ((CategoryTheory.shiftFunctorZero C M).inv.app X)

full_name: CategoryTheory.Functor.shiftIso_add
code: lemma shiftIso_add (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a'') :
    F.shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha'']) =
      isoWhiskerRight (shiftFunctorAdd C m n) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (F.shiftIso n a a' ha') ≪≫ F.shiftIso m a' a'' ha'' 
goal: F.shiftIso (m + n) a a'' ⋯ =
  CategoryTheory.isoWhiskerRight (CategoryTheory.shiftFunctorAdd C m n) (F.shift a) ≪≫
    (CategoryTheory.shiftFunctor C m).associator (CategoryTheory.shiftFunctor C n) (F.shift a) ≪≫
      CategoryTheory.isoWhiskerLeft (CategoryTheory.shiftFunctor C m) (F.shiftIso n a a' ha') ≪≫
        F.shiftIso m a' a'' ha''

full_name: CategoryTheory.Functor.shiftIso_add_hom_app
code: lemma shiftIso_add_hom_app (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a'') (X : C) :
    (F.shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha''])).hom.app X =
      (shift F a).map ((shiftFunctorAdd C m n).hom.app X) ≫
        (shiftIso F n a a' ha').hom.app ((shiftFunctor C m).obj X) ≫
          (shiftIso F m a' a'' ha'').hom.app X 
goal: (F.shiftIso (m + n) a a'' ⋯).hom.app X =
  (F.shift a).map ((CategoryTheory.shiftFunctorAdd C m n).hom.app X) ≫
    (F.shiftIso n a a' ha').hom.app ((CategoryTheory.shiftFunctor C m).obj X) ≫ (F.shiftIso m a' a'' ha'').hom.app X

full_name: CategoryTheory.Functor.shiftIso_add_inv_app
code: lemma shiftIso_add_inv_app (n m a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a'') (X : C) :
    (F.shiftIso (m + n) a a'' (by rw [add_assoc, ha', ha''])).inv.app X =
      (shiftIso F m a' a'' ha'').inv.app X ≫
        (shiftIso F n a a' ha').inv.app ((shiftFunctor C m).obj X) ≫
          (shift F a).map ((shiftFunctorAdd C m n).inv.app X) 
goal: (F.shiftIso (m + n) a a'' ⋯).inv.app X =
  (F.shiftIso m a' a'' ha'').inv.app X ≫
    (F.shiftIso n a a' ha').inv.app ((CategoryTheory.shiftFunctor C m).obj X) ≫
      (F.shift a).map ((CategoryTheory.shiftFunctorAdd C m n).inv.app X)

full_name: CategoryTheory.Functor.shiftIso_add'
code: lemma shiftIso_add' (n m mn : M) (hnm : m + n = mn) (a a' a'' : M)
    (ha' : n + a = a') (ha'' : m + a' = a'') :
    F.shiftIso mn a a'' (by rw [← hnm, ← ha'', ← ha', add_assoc]) =
      isoWhiskerRight (shiftFunctorAdd' C m n _ hnm) _ ≪≫ Functor.associator _ _ _ ≪≫
        isoWhiskerLeft _ (F.shiftIso n a a' ha') ≪≫ F.shiftIso m a' a'' ha'' 
goal: F.shiftIso mn a a'' ⋯ =
  CategoryTheory.isoWhiskerRight (CategoryTheory.shiftFunctorAdd' C m n mn hnm) (F.shift a) ≪≫
    (CategoryTheory.shiftFunctor C m).associator (CategoryTheory.shiftFunctor C n) (F.shift a) ≪≫
      CategoryTheory.isoWhiskerLeft (CategoryTheory.shiftFunctor C m) (F.shiftIso n a a' ha') ≪≫
        F.shiftIso m a' a'' ha''

full_name: CategoryTheory.Functor.shiftIso_add'_hom_app
code: lemma shiftIso_add'_hom_app (n m mn : M) (hnm : m + n = mn) (a a' a'' : M)
    (ha' : n + a = a') (ha'' : m + a' = a'') (X : C) :
    (F.shiftIso mn a a'' (by rw [← hnm, ← ha'', ← ha', add_assoc])).hom.app X =
      (shift F a).map ((shiftFunctorAdd' C m n mn hnm).hom.app X) ≫
        (shiftIso F n a a' ha').hom.app ((shiftFunctor C m).obj X) ≫
          (shiftIso F m a' a'' ha'').hom.app X 
goal: (F.shiftIso mn a a'' ⋯).hom.app X =
  (F.shift a).map ((CategoryTheory.shiftFunctorAdd' C m n mn hnm).hom.app X) ≫
    (F.shiftIso n a a' ha').hom.app ((CategoryTheory.shiftFunctor C m).obj X) ≫ (F.shiftIso m a' a'' ha'').hom.app X

full_name: CategoryTheory.Functor.shiftIso_add'_inv_app
code: lemma shiftIso_add'_inv_app (n m mn : M) (hnm : m + n = mn) (a a' a'' : M)
    (ha' : n + a = a') (ha'' : m + a' = a'') (X : C) :
    (F.shiftIso mn a a'' (by rw [← hnm, ← ha'', ← ha', add_assoc])).inv.app X =
      (shiftIso F m a' a'' ha'').inv.app X ≫
        (shiftIso F n a a' ha').inv.app ((shiftFunctor C m).obj X) ≫
        (shift F a).map ((shiftFunctorAdd' C m n mn hnm).inv.app X) 
goal: (F.shiftIso mn a a'' ⋯).inv.app X =
  (F.shiftIso m a' a'' ha'').inv.app X ≫
    (F.shiftIso n a a' ha').inv.app ((CategoryTheory.shiftFunctor C m).obj X) ≫
      (F.shift a).map ((CategoryTheory.shiftFunctorAdd' C m n mn hnm).inv.app X)

full_name: CategoryTheory.Functor.shiftIso_hom_app_comp
code: @[reassoc]
lemma shiftIso_hom_app_comp (n m mn : M) (hnm : m + n = mn)
    (a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a'') (X : C) :
    (shiftIso F n a a' ha').hom.app ((shiftFunctor C m).obj X) ≫
      (shiftIso F m a' a'' ha'').hom.app X =
        (shift F a).map ((shiftFunctorAdd' C m n mn hnm).inv.app X) ≫
          (F.shiftIso mn a a'' (by rw [← hnm, ← ha'', ← ha', add_assoc])).hom.app X 
goal: (F.shiftIso n a a' ha').hom.app ((CategoryTheory.shiftFunctor C m).obj X) ≫ (F.shiftIso m a' a'' ha'').hom.app X =
  (F.shift a).map ((CategoryTheory.shiftFunctorAdd' C m n mn hnm).inv.app X) ≫ (F.shiftIso mn a a'' ⋯).hom.app X

full_name: CategoryTheory.Functor.shiftMap
code: /-- The morphism `(F.shift a).obj X ⟶ (F.shift a').obj Y` induced by a morphism
`f : X ⟶ Y⟦n⟧` when `n + a = a'`. -/
def shiftMap {X Y : C} {n : M} (f : X ⟶ Y⟦n⟧) (a a' : M) (ha' : n + a = a') :
    (F.shift a).obj X ⟶ (F.shift a').obj Y 
goal: (F.shift a).obj X ⟶ (F.shift a').obj Y

full_name: CategoryTheory.Functor.shiftMap_comp
code: @[reassoc]
lemma shiftMap_comp {X Y Z : C} {n : M} (f : X ⟶ Y⟦n⟧) (g : Y ⟶ Z) (a a' : M) (ha' : n + a = a') :
    F.shiftMap (f ≫ g⟦n⟧') a a' ha' = F.shiftMap f a a' ha' ≫ (F.shift a').map g 
goal: F.shiftMap (f ≫ (CategoryTheory.shiftFunctor C n).map g) a a' ha' = F.shiftMap f a a' ha' ≫ (F.shift a').map g

full_name: CategoryTheory.Functor.shiftMap_comp'
code: @[reassoc]
lemma shiftMap_comp' {X Y Z : C} {n : M} (f : X ⟶ Y) (g : Y ⟶ Z⟦n⟧) (a a' : M) (ha' : n + a = a') :
    F.shiftMap (f ≫ g) a a' ha' = (F.shift a).map f ≫ F.shiftMap g a a' ha' 
goal: F.shiftMap (f ≫ g) a a' ha' = (F.shift a).map f ≫ F.shiftMap g a a' ha'

full_name: CategoryTheory.Functor.shiftIso_hom_app_comp_shiftMap
code: /--
When `f : X ⟶ Y⟦m⟧`, `m + n = mn`, `n + a = a'` and `ha'' : m + a' = a''`, this lemma
relates the two morphisms `F.shiftMap f a' a'' ha''` and `(F.shift a).map (f⟦n⟧')`. Indeed,
via canonical isomorphisms, they both identity to morphisms
`(F.shift a').obj X ⟶ (F.shift a'').obj Y`.
-/
lemma shiftIso_hom_app_comp_shiftMap {X Y : C} {m : M} (f : X ⟶ Y⟦m⟧) (n mn : M) (hnm : m + n = mn)
    (a a' a'' : M) (ha' : n + a = a') (ha'' : m + a' = a'') :
    (F.shiftIso n a a' ha').hom.app X ≫ F.shiftMap f a' a'' ha'' =
      (F.shift a).map (f⟦n⟧') ≫ (F.shift a).map ((shiftFunctorAdd' C m n mn hnm).inv.app Y) ≫
        (F.shiftIso mn a a'' (by rw [← ha'', ← ha', ← hnm, add_assoc])).hom.app Y 
goal: (F.shiftIso n a a' ha').hom.app X ≫ F.shiftMap f a' a'' ha'' =
  (F.shift a).map ((CategoryTheory.shiftFunctor C n).map f) ≫
    (F.shift a).map ((CategoryTheory.shiftFunctorAdd' C m n mn hnm).inv.app Y) ≫ (F.shiftIso mn a a'' ⋯).hom.app Y

full_name: CategoryTheory.Functor.shiftIso_hom_app_comp_shiftMap_of_add_eq_zero
code: /--
If `f : X ⟶ Y⟦m⟧`, `n + m = 0` and `ha' : m + a = a'`, this lemma relates the two
morphisms `F.shiftMap f a a' ha'` and `(F.shift a').map (f⟦n⟧')`. Indeed,
via canonical isomorphisms, they both identify to morphisms
`(F.shift a).obj X ⟶ (F.shift a').obj Y`.
-/
lemma shiftIso_hom_app_comp_shiftMap_of_add_eq_zero [F.ShiftSequence G]
    {X Y : C} {m : G} (f : X ⟶ Y⟦m⟧)
    (n : G) (hnm : n + m = 0) (a a' : G) (ha' : m + a = a') :
    (F.shiftIso n a' a (by rw [← ha', ← add_assoc, hnm, zero_add])).hom.app X ≫
      F.shiftMap f a a' ha' =
    (F.shift a').map (f⟦n⟧' ≫ (shiftFunctorCompIsoId C m n
      (by rw [← add_left_inj m, add_assoc, hnm, zero_add, add_zero])).hom.app Y) 
goal: (F.shiftIso n a' a ⋯).hom.app X ≫ F.shiftMap f a a' ha' =
  (F.shift a').map ((CategoryTheory.shiftFunctor C n).map f ≫ (CategoryTheory.shiftFunctorCompIsoId C m n ⋯).hom.app Y)

full_name: CategoryTheory.Functor.instPreservesZeroMorphismsShift
code: instance (n : M) : (F.shift n).PreservesZeroMorphisms 
goal: (F.shift n).PreservesZeroMorphisms

full_name: CategoryTheory.Functor.shiftMap_zero
code: @[simp]
lemma shiftMap_zero (X Y : C) (n a a' : M) (ha' : n + a = a') :
    F.shiftMap (0 : X ⟶ Y⟦n⟧) a a' ha' = 0 
goal: F.shiftMap 0 a a' ha' = 0

full_name: CategoryTheory.Functor.instAdditiveShift
code: instance (n : M) : (F.shift n).Additive 
goal: (F.shift n).Additive