/-- Shifting by `i` and shifting by `j` forms an equivalence when `i + j = 0`. -/
@[simps]
def shiftEquiv' (i j : A) (h : i + j = 0) : C ≌ C where
  functor := shiftFunctor C i
  inverse := shiftFunctor C j
  unitIso := (shiftFunctorCompIsoId C i j h).symm
  counitIso := shiftFunctorCompIsoId C j i
    (by rw [← add_left_inj j, add_assoc, h, zero_add, add_zero])
  functor_unitIso_comp X := by
    convert (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) ⟨i⟩ ⟨j⟩ (Discrete.eqToIso h)
      (Discrete.eqToIso (by dsimp; rw [← add_left_inj j, add_assoc, h, zero_add, add_zero]))
      (Subsingleton.elim _ _)).functor_unitIso_comp X
    all_goals
      ext X
      dsimp [shiftFunctorCompIsoId, unitOfTensorIsoUnit,
        shiftFunctorAdd']
      simp only [Category.assoc, eqToHom_map]
      

Proof state:
case h.e'_2.h.h.e'_7.h.h.e'_7.h.h.e'_5.h.w.w.h
C : Type u
A : Type u_1
inst✝² : Category.{v, u} C
inst✝¹ : AddGroup A
inst✝ : HasShift C A
i j : A
h : i + j = 0
X✝ : C
e_1✝ :
  ((shiftFunctor C i).obj ((𝟭 C).obj X✝) ⟶ (𝟭 C).obj ((shiftFunctor C i).obj X✝)) =
    ((equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
              (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
              (_ :
                MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                    (MonoidalCategory.leftUnitor { as := i }).hom =
                  (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                    MonoidalCategory.tensorHom (𝟙 { as := i })
                        (Discrete.eqToIso
                            (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                      (MonoidalCategory.rightUnitor { as := i }).hom)).functor.obj
        ((𝟭 C).obj X✝) ⟶
      (𝟭 C).obj
        ((equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
                (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
                (_ :
                  MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                      (MonoidalCategory.leftUnitor { as := i }).hom =
                    (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                      MonoidalCategory.tensorHom (𝟙 { as := i })
                          (Discrete.eqToIso
                              (_ :
                                (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                        (MonoidalCategory.rightUnitor { as := i }).hom)).functor.obj
          X✝))
e_4✝ :
  (shiftFunctor C i).obj ((shiftFunctor C i ⋙ shiftFunctor C j).obj X✝) =
    (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
            (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
            (_ :
              MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                  (MonoidalCategory.leftUnitor { as := i }).hom =
                (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                  MonoidalCategory.tensorHom (𝟙 { as := i })
                      (Discrete.eqToIso
                          (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                    (MonoidalCategory.rightUnitor { as := i }).hom)).functor.obj
      (((equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
                (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
                (_ :
                  MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                      (MonoidalCategory.leftUnitor { as := i }).hom =
                    (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                      MonoidalCategory.tensorHom (𝟙 { as := i })
                          (Discrete.eqToIso
                              (_ :
                                (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                        (MonoidalCategory.rightUnitor { as := i }).hom)).functor ⋙
            (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
                (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
                (_ :
                  MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                      (MonoidalCategory.leftUnitor { as := i }).hom =
                    (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                      MonoidalCategory.tensorHom (𝟙 { as := i })
                          (Discrete.eqToIso
                              (_ :
                                (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                        (MonoidalCategory.rightUnitor { as := i }).hom)).inverse).obj
        X✝)
e_5✝¹ :
  (𝟭 C).obj ((shiftFunctor C i).obj X✝) =
    (𝟭 C).obj
      ((equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
              (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
              (_ :
                MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                    (MonoidalCategory.leftUnitor { as := i }).hom =
                  (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                    MonoidalCategory.tensorHom (𝟙 { as := i })
                        (Discrete.eqToIso
                            (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                      (MonoidalCategory.rightUnitor { as := i }).hom)).functor.obj
        X✝)
e_5✝ :
  shiftFunctor C j ⋙ shiftFunctor C i =
    (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
          (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
          (_ :
            MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                (MonoidalCategory.leftUnitor { as := i }).hom =
              (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                MonoidalCategory.tensorHom (𝟙 { as := i })
                    (Discrete.eqToIso
                        (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                  (MonoidalCategory.rightUnitor { as := i }).hom)).inverse ⋙
      (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
          (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
          (_ :
            MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                (MonoidalCategory.leftUnitor { as := i }).hom =
              (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                MonoidalCategory.tensorHom (𝟙 { as := i })
                    (Discrete.eqToIso
                        (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                  (MonoidalCategory.rightUnitor { as := i }).hom)).functor
e_3✝ :
  shiftFunctor C j ⋙ shiftFunctor C i =
    (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
          (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
          (_ :
            MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                (MonoidalCategory.leftUnitor { as := i }).hom =
              (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                MonoidalCategory.tensorHom (𝟙 { as := i })
                    (Discrete.eqToIso
                        (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                  (MonoidalCategory.rightUnitor { as := i }).hom)).inverse ⋙
      (equivOfTensorIsoUnit (shiftMonoidalFunctor C A) { as := i } { as := j } (Discrete.eqToIso h)
          (Discrete.eqToIso (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as))
          (_ :
            MonoidalCategory.tensorHom (Discrete.eqToIso h).hom (𝟙 { as := i }) ≫
                (MonoidalCategory.leftUnitor { as := i }).hom =
              (MonoidalCategory.associator { as := i } { as := j } { as := i }).hom ≫
                MonoidalCategory.tensorHom (𝟙 { as := i })
                    (Discrete.eqToIso
                        (_ : (MonoidalCategory.tensorObj { as := j } { as := i }).as = (𝟙_ (Discrete A)).as)).hom ≫
                  (MonoidalCategory.rightUnitor { as := i }).hom)).functor
X : C
⊢ (shiftFunctorAdd C j i).inv.app X ≫
      (eqToHom (_ : shiftFunctor C (j + i) = shiftFunctor C 0)).app X ≫ (shiftFunctorZero C A).hom.app X =
    (LaxMonoidalFunctor.μ (shiftMonoidalFunctor C A).toLaxMonoidalFunctor { as := j } { as := i }).app X ≫
      (eqToHom
              (_ :
                (shiftMonoidalFunctor C A).toLaxMonoidalFunctor.toFunctor.obj
                    (MonoidalCategory.tensorObj { as := j } { as := i }) =
                  (shiftMonoidalFunctor C A).toLaxMonoidalFunctor.toFunctor.obj (𝟙_ (Discrete A)))).app
          X ≫
        (MonoidalFunctor.εIso (shiftMonoidalFunctor C A)).inv.app X

Next tactic:
rfl