Theorem: CategoryTheory.SingleFunctors.postcomp_functor
File: Mathlib/CategoryTheory/Shift/SingleFunctors.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
a : A
⊢ (fun n a a' ha' =>
        (F.functor a').associator G (shiftFunctor E n) ≪≫
          isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
            ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
      0 a a ⋯ =
    isoWhiskerLeft ((fun a => F.functor a ⋙ G) a) (shiftFunctorZero E A)
state_after: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
a : A
X : C
⊢ ((fun n a a' ha' =>
              (F.functor a').associator G (shiftFunctor E n) ≪≫
                isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                  ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
            0 a a ⋯).hom.app
      X =
    (isoWhiskerLeft ((fun a => F.functor a ⋙ G) a) (shiftFunctorZero E A)).hom.app X
tactic: ext X
state_before: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
a : A
X : C
⊢ ((fun n a a' ha' =>
              (F.functor a').associator G (shiftFunctor E n) ≪≫
                isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                  ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
            0 a a ⋯).hom.app
      X =
    (isoWhiskerLeft ((fun a => F.functor a ⋙ G) a) (shiftFunctorZero E A)).hom.app X
state_after: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
a : A
X : C
⊢ 𝟙 ((shiftFunctor E 0).obj (G.obj ((F.functor a).obj X))) ≫
      (G.commShiftIso 0).inv.app ((F.functor a).obj X) ≫
        𝟙 (G.obj ((shiftFunctor D 0).obj ((F.functor a).obj X))) ≫ G.map ((F.shiftIso 0 a a ⋯).hom.app X) =
    (shiftFunctorZero E A).hom.app (G.obj ((F.functor a).obj X))
tactic: dsimp
state_before: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
a : A
X : C
⊢ 𝟙 ((shiftFunctor E 0).obj (G.obj ((F.functor a).obj X))) ≫
      (G.commShiftIso 0).inv.app ((F.functor a).obj X) ≫
        𝟙 (G.obj ((shiftFunctor D 0).obj ((F.functor a).obj X))) ≫ G.map ((F.shiftIso 0 a a ⋯).hom.app X) =
    (shiftFunctorZero E A).hom.app (G.obj ((F.functor a).obj X))
state_after: no goals
tactic: simp only [Functor.commShiftIso_zero, Functor.CommShift.isoZero_inv_app,
      SingleFunctors.shiftIso_zero_hom_app,id_comp, assoc, ← G.map_comp, Iso.inv_hom_id_app,
      Functor.map_id, Functor.id_obj, comp_id]
state_before: C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
⊢ (fun n a a' ha' =>
        (F.functor a').associator G (shiftFunctor E n) ≪≫
          isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
            ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
      (m + n) a a'' ⋯ =
    isoWhiskerLeft ((fun a => F.functor a ⋙ G) a'') (shiftFunctorAdd E m n) ≪≫
      (((fun a => F.functor a ⋙ G) a'').associator (shiftFunctor E m) (shiftFunctor E n)).symm ≪≫
        isoWhiskerRight
            ((fun n a a' ha' =>
                (F.functor a').associator G (shiftFunctor E n) ≪≫
                  isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                    ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
              m a' a'' ha'')
            (shiftFunctor E n) ≪≫
          (fun n a a' ha' =>
              (F.functor a').associator G (shiftFunctor E n) ≪≫
                isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                  ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
            n a a' ha'
state_after: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
X : C
⊢ ((fun n a a' ha' =>
              (F.functor a').associator G (shiftFunctor E n) ≪≫
                isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                  ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
            (m + n) a a'' ⋯).hom.app
      X =
    (isoWhiskerLeft ((fun a => F.functor a ⋙ G) a'') (shiftFunctorAdd E m n) ≪≫
            (((fun a => F.functor a ⋙ G) a'').associator (shiftFunctor E m) (shiftFunctor E n)).symm ≪≫
              isoWhiskerRight
                  ((fun n a a' ha' =>
                      (F.functor a').associator G (shiftFunctor E n) ≪≫
                        isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                          ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫
                            isoWhiskerRight (F.shiftIso n a a' ha') G)
                    m a' a'' ha'')
                  (shiftFunctor E n) ≪≫
                (fun n a a' ha' =>
                    (F.functor a').associator G (shiftFunctor E n) ≪≫
                      isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                        ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫
                          isoWhiskerRight (F.shiftIso n a a' ha') G)
                  n a a' ha').hom.app
      X
tactic: ext X
state_before: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
X : C
⊢ ((fun n a a' ha' =>
              (F.functor a').associator G (shiftFunctor E n) ≪≫
                isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                  ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫ isoWhiskerRight (F.shiftIso n a a' ha') G)
            (m + n) a a'' ⋯).hom.app
      X =
    (isoWhiskerLeft ((fun a => F.functor a ⋙ G) a'') (shiftFunctorAdd E m n) ≪≫
            (((fun a => F.functor a ⋙ G) a'').associator (shiftFunctor E m) (shiftFunctor E n)).symm ≪≫
              isoWhiskerRight
                  ((fun n a a' ha' =>
                      (F.functor a').associator G (shiftFunctor E n) ≪≫
                        isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                          ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫
                            isoWhiskerRight (F.shiftIso n a a' ha') G)
                    m a' a'' ha'')
                  (shiftFunctor E n) ≪≫
                (fun n a a' ha' =>
                    (F.functor a').associator G (shiftFunctor E n) ≪≫
                      isoWhiskerLeft (F.functor a') (G.commShiftIso n).symm ≪≫
                        ((F.functor a').associator (shiftFunctor D n) G).symm ≪≫
                          isoWhiskerRight (F.shiftIso n a a' ha') G)
                  n a a' ha').hom.app
      X
state_after: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
X : C
⊢ 𝟙 ((shiftFunctor E (m + n)).obj (G.obj ((F.functor a'').obj X))) ≫
      (G.commShiftIso (m + n)).inv.app ((F.functor a'').obj X) ≫
        𝟙 (G.obj ((shiftFunctor D (m + n)).obj ((F.functor a'').obj X))) ≫
          G.map ((F.shiftIso (m + n) a a'' ⋯).hom.app X) =
    (shiftFunctorAdd E m n).hom.app (G.obj ((F.functor a'').obj X)) ≫
      𝟙 ((shiftFunctor E n).obj ((shiftFunctor E m).obj (G.obj ((F.functor a'').obj X)))) ≫
        (shiftFunctor E n).map
            (𝟙 ((shiftFunctor E m).obj (G.obj ((F.functor a'').obj X))) ≫
              (G.commShiftIso m).inv.app ((F.functor a'').obj X) ≫
                𝟙 (G.obj ((shiftFunctor D m).obj ((F.functor a'').obj X))) ≫
                  G.map ((F.shiftIso m a' a'' ha'').hom.app X)) ≫
          𝟙 ((shiftFunctor E n).obj (G.obj ((F.functor a').obj X))) ≫
            (G.commShiftIso n).inv.app ((F.functor a').obj X) ≫
              𝟙 (G.obj ((shiftFunctor D n).obj ((F.functor a').obj X))) ≫ G.map ((F.shiftIso n a a' ha').hom.app X)
tactic: dsimp
state_before: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
X : C
⊢ 𝟙 ((shiftFunctor E (m + n)).obj (G.obj ((F.functor a'').obj X))) ≫
      (G.commShiftIso (m + n)).inv.app ((F.functor a'').obj X) ≫
        𝟙 (G.obj ((shiftFunctor D (m + n)).obj ((F.functor a'').obj X))) ≫
          G.map ((F.shiftIso (m + n) a a'' ⋯).hom.app X) =
    (shiftFunctorAdd E m n).hom.app (G.obj ((F.functor a'').obj X)) ≫
      𝟙 ((shiftFunctor E n).obj ((shiftFunctor E m).obj (G.obj ((F.functor a'').obj X)))) ≫
        (shiftFunctor E n).map
            (𝟙 ((shiftFunctor E m).obj (G.obj ((F.functor a'').obj X))) ≫
              (G.commShiftIso m).inv.app ((F.functor a'').obj X) ≫
                𝟙 (G.obj ((shiftFunctor D m).obj ((F.functor a'').obj X))) ≫
                  G.map ((F.shiftIso m a' a'' ha'').hom.app X)) ≫
          𝟙 ((shiftFunctor E n).obj (G.obj ((F.functor a').obj X))) ≫
            (G.commShiftIso n).inv.app ((F.functor a').obj X) ≫
              𝟙 (G.obj ((shiftFunctor D n).obj ((F.functor a').obj X))) ≫ G.map ((F.shiftIso n a a' ha').hom.app X)
state_after: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
X : C
⊢ (shiftFunctorAdd E m n).hom.app (G.obj ((F.functor a'').obj X)) ≫
      (shiftFunctor E n).map ((G.commShiftIso m).inv.app ((F.functor a'').obj X)) ≫
        (G.commShiftIso n).inv.app ((shiftFunctor D m).obj ((F.functor a'').obj X)) ≫
          G.map ((shiftFunctorAdd D m n).inv.app ((F.functor a'').obj X)) ≫
            G.map ((shiftFunctorAdd D m n).hom.app ((F.functor a'').obj X)) ≫
              G.map ((shiftFunctor D n).map ((F.shiftIso m a' a'' ha'').hom.app X)) ≫
                G.map ((F.shiftIso n a a' ha').hom.app X) =
    (shiftFunctorAdd E m n).hom.app (G.obj ((F.functor a'').obj X)) ≫
      (shiftFunctor E n).map ((G.commShiftIso m).inv.app ((F.functor a'').obj X)) ≫
        (G.commShiftIso n).inv.app ((shiftFunctor D m).obj ((F.functor a'').obj X)) ≫
          G.map ((shiftFunctor D n).map ((F.shiftIso m a' a'' ha'').hom.app X)) ≫
            G.map ((F.shiftIso n a a' ha').hom.app X)
tactic: simp only [F.shiftIso_add_hom_app n m a a' a'' ha' ha'', Functor.commShiftIso_add,
      Functor.CommShift.isoAdd_inv_app, Functor.map_comp, id_comp, assoc,
      Functor.commShiftIso_inv_naturality_assoc]
state_before: case w.w.h
C : Type u_1
D : Type u_2
E : Type u_3
E' : Type u_4
inst✝⁸ : Category.{?u.62618, u_1} C
inst✝⁷ : Category.{?u.62622, u_2} D
inst✝⁶ : Category.{?u.62626, u_3} E
inst✝⁵ : Category.{?u.62630, u_4} E'
A : Type u_5
inst✝⁴ : AddMonoid A
inst✝³ : HasShift D A
inst✝² : HasShift E A
inst✝¹ : HasShift E' A
F G✝ H : SingleFunctors C D A
G : D ⥤ E
inst✝ : G.CommShift A
n m a a' a'' : A
ha' : n + a = a'
ha'' : m + a' = a''
X : C
⊢ (shiftFunctorAdd E m n).hom.app (G.obj ((F.functor a'').obj X)) ≫
      (shiftFunctor E n).map ((G.commShiftIso m).inv.app ((F.functor a'').obj X)) ≫
        (G.commShiftIso n).inv.app ((shiftFunctor D m).obj ((F.functor a'').obj X)) ≫
          G.map ((shiftFunctorAdd D m n).inv.app ((F.functor a'').obj X)) ≫
            G.map ((shiftFunctorAdd D m n).hom.app ((F.functor a'').obj X)) ≫
              G.map ((shiftFunctor D n).map ((F.shiftIso m a' a'' ha'').hom.app X)) ≫
                G.map ((F.shiftIso n a a' ha').hom.app X) =
    (shiftFunctorAdd E m n).hom.app (G.obj ((F.functor a'').obj X)) ≫
      (shiftFunctor E n).map ((G.commShiftIso m).inv.app ((F.functor a'').obj X)) ≫
        (G.commShiftIso n).inv.app ((shiftFunctor D m).obj ((F.functor a'').obj X)) ≫
          G.map ((shiftFunctor D n).map ((F.shiftIso m a' a'' ha'').hom.app X)) ≫
            G.map ((F.shiftIso n a a' ha').hom.app X)
state_after: no goals
tactic: simp only [← G.map_comp, Iso.inv_hom_id_app_assoc]