Theorem: CategoryTheory.Functor.map_shiftFunctorComm_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.73697, 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 B
X : C
a b : B
⊢ F.map ((shiftFunctorComm C a b).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorComm D a b).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq : (F.commShiftIso (a + b)).hom.app X = (CommShift.isoAdd (F.commShiftIso a) (F.commShiftIso b)).hom.app X
⊢ F.map ((shiftFunctorComm C a b).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorComm D a b).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: have eq := NatTrans.congr_app (congr_arg Iso.hom (F.commShiftIso_add a b)) 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.73697, 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 B
X : C
a b : B
eq : (F.commShiftIso (a + b)).hom.app X = (CommShift.isoAdd (F.commShiftIso a) (F.commShiftIso b)).hom.app X
⊢ F.map ((shiftFunctorComm C a b).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorComm D a b).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorComm C a b).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorComm D a b).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: simp only [comp_obj, CommShift.isoAdd_hom_app,
    ← cancel_epi (F.map ((shiftFunctorAdd C a b).inv.app X)), Category.assoc,
    ← F.map_comp_assoc, Iso.inv_hom_id_app, F.map_id, Category.id_comp, F.map_comp] 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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorComm C a b).hom.app X) =
    (F.commShiftIso b).hom.app ((shiftFunctor C a).obj X) ≫
      (shiftFunctor D b).map ((F.commShiftIso a).hom.app X) ≫
        (shiftFunctorComm D a b).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorComm C a b).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 (a + b) ⋯).symm ≪≫ shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: simp only [shiftFunctorComm_eq D a b _ rfl]
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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorComm C a b).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 (a + b) ⋯).symm ≪≫ shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorComm C a b).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 (a + b) ⋯).inv.app (F.obj X) ≫ (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X)) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: dsimp
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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorComm C a b).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 (a + b) ⋯).inv.app (F.obj X) ≫ (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X)) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map (((shiftFunctorAdd C a b).symm ≪≫ shiftFunctorAdd' C b a (a + b) ⋯).hom.app X) =
    F.map ((shiftFunctorAdd C a b).inv.app X) ≫
      (F.commShiftIso (a + b)).hom.app X ≫
        (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: simp only [Functor.map_comp, shiftFunctorAdd'_eq_shiftFunctorAdd, Category.assoc,
    ← reassoc_of% eq, shiftFunctorComm_eq C a b _ rfl]
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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map (((shiftFunctorAdd C a b).symm ≪≫ shiftFunctorAdd' C b a (a + b) ⋯).hom.app X) =
    F.map ((shiftFunctorAdd C a b).inv.app X) ≫
      (F.commShiftIso (a + b)).hom.app X ≫
        (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd C a b).inv.app X ≫ (shiftFunctorAdd' C b a (a + b) ⋯).hom.app X) =
    F.map ((shiftFunctorAdd C a b).inv.app X) ≫
      (F.commShiftIso (a + b)).hom.app X ≫
        (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: dsimp
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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd C a b).inv.app X ≫ (shiftFunctorAdd' C b a (a + b) ⋯).hom.app X) =
    F.map ((shiftFunctorAdd C a b).inv.app X) ≫
      (F.commShiftIso (a + b)).hom.app X ≫
        (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd C a b).inv.app X) ≫ F.map ((shiftFunctorAdd' C b a (a + b) ⋯).hom.app X) =
    F.map ((shiftFunctorAdd C a b).inv.app X) ≫
      (F.commShiftIso (a + b)).hom.app X ≫
        (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
tactic: rw [Functor.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.73697, 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 B
X : C
a b : B
eq :
  F.map ((shiftFunctorAdd C a b).inv.app X) ≫ (F.commShiftIso (a + b)).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).inv.app (F.obj X)
⊢ F.map ((shiftFunctorAdd C a b).inv.app X) ≫ F.map ((shiftFunctorAdd' C b a (a + b) ⋯).hom.app X) =
    F.map ((shiftFunctorAdd C a b).inv.app X) ≫
      (F.commShiftIso (a + b)).hom.app X ≫
        (shiftFunctorAdd' D b a (a + b) ⋯).hom.app (F.obj X) ≫
          (shiftFunctor D a).map ((F.commShiftIso b).inv.app X) ≫ (F.commShiftIso a).inv.app ((shiftFunctor C b).obj X)
state_after: no goals
tactic: simp only [NatTrans.congr_app (congr_arg Iso.hom (F.commShiftIso_add' (add_comm b a))) X,
    CommShift.isoAdd'_hom_app, Category.assoc, Iso.inv_hom_id_app_assoc,
    ← Functor.map_comp_assoc, Iso.hom_inv_id_app,
    Functor.map_id, Category.id_comp, comp_obj, Category.comp_id]