Theorem: CategoryTheory.Functor.map_shiftFunctorCompIsoId_hom_app
File: Mathlib/CategoryTheory/Shift/CommShift.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
⊢ F.map ((shiftFunctorCompIsoId C a b h).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫ (shiftFunctorCompIsoId D a b h).hom.app (F.obj X)
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
⊢ F.map ((shiftFunctorAdd' C a b 0 h).inv.app X ≫ (shiftFunctorZero C A).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
tactic: dsimp [shiftFunctorCompIsoId]
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
⊢ F.map ((shiftFunctorAdd' C a b 0 h).inv.app X ≫ (shiftFunctorZero C A).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
eq : (F.commShiftIso 0).hom.app X = (CommShift.isoAdd' h (F.commShiftIso a) (F.commShiftIso b)).hom.app X
⊢ F.map ((shiftFunctorAdd' C a b 0 h).inv.app X ≫ (shiftFunctorZero C A).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
tactic: have eq := NatTrans.congr_app (congr_arg Iso.hom (F.commShiftIso_add' h)) X
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
eq : (F.commShiftIso 0).hom.app X = (CommShift.isoAdd' h (F.commShiftIso a) (F.commShiftIso b)).hom.app X
⊢ F.map ((shiftFunctorAdd' C a b 0 h).inv.app X ≫ (shiftFunctorZero C A).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
eq :
  F.map ((shiftFunctorZero C A).hom.app X) ≫ (shiftFunctorZero D A).inv.app (F.obj X) =
    F.map ((shiftFunctorAdd' C a b 0 h).hom.app X) ≫
      (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
        (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫ (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd' C a b 0 h).inv.app X ≫ (shiftFunctorZero C A).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
tactic: simp only [commShiftIso_zero, comp_obj, CommShift.isoZero_hom_app,
    CommShift.isoAdd'_hom_app] at eq
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
eq :
  F.map ((shiftFunctorZero C A).hom.app X) ≫ (shiftFunctorZero D A).inv.app (F.obj X) =
    F.map ((shiftFunctorAdd' C a b 0 h).hom.app X) ≫
      (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
        (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫ (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd' C a b 0 h).inv.app X ≫ (shiftFunctorZero C A).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
eq :
  F.map ((shiftFunctorZero C A).hom.app X) ≫ (shiftFunctorZero D A).inv.app (F.obj X) =
    F.map ((shiftFunctorAdd' C a b 0 h).hom.app X) ≫
      (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
        (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫ (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd' C a b 0 h).hom.app X) ≫
      F.map ((shiftFunctorAdd' C a b 0 h).inv.app X) ≫ F.map ((shiftFunctorZero C A).hom.app X) =
    F.map ((shiftFunctorZero C A).hom.app X) ≫
      (shiftFunctorZero D A).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
tactic: rw [← cancel_epi (F.map ((shiftFunctorAdd' C a b 0 h).hom.app X)), ← reassoc_of% eq, F.map_comp]
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝¹⁰ : Category.{u_6, u_1} C
inst✝⁹ : Category.{u_7, u_2} D
inst✝⁸ : Category.{?u.82739, u_3} E
F : C ⥤ D
G : D ⥤ E
A : Type u_4
B : Type u_5
inst✝⁷ : AddMonoid A
inst✝⁶ : AddCommMonoid B
inst✝⁵ : HasShift C A
inst✝⁴ : HasShift D A
inst✝³ : HasShift E A
inst✝² : HasShift C B
inst✝¹ : HasShift D B
inst✝ : F.CommShift A
X : C
a b : A
h : a + b = 0
eq :
  F.map ((shiftFunctorZero C A).hom.app X) ≫ (shiftFunctorZero D A).inv.app (F.obj X) =
    F.map ((shiftFunctorAdd' C a b 0 h).hom.app X) ≫
      (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
        (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫ (shiftFunctorAdd' D a b 0 h).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd' C a b 0 h).hom.app X) ≫
      F.map ((shiftFunctorAdd' C a b 0 h).inv.app X) ≫ F.map ((shiftFunctorZero C A).hom.app X) =
    F.map ((shiftFunctorZero C A).hom.app X) ≫
      (shiftFunctorZero D A).inv.app (F.obj X) ≫ (shiftFunctorZero D A).hom.app (F.obj X)
state_after: no goals
tactic: simp only [Iso.inv_hom_id_app, id_obj, Category.comp_id, ← F.map_comp_assoc, Iso.hom_inv_id_app,
    F.map_id, Category.id_comp]