Theorem: CategoryTheory.Adjunction.whiskerRight_counit_app_app
File: Mathlib/CategoryTheory/Adjunction/Whiskering.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ ∀ ⦃X Y : C ⥤ D⦄ (f : X ⟶ Y),
    (𝟭 (C ⥤ D)).map f ≫
        (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) Y =
      (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) X ≫
        ((whiskeringRight C D E).obj F ⋙ (whiskeringRight C E D).obj G).map f
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ D
f✝ : X✝ ⟶ Y✝
⊢ (𝟭 (C ⥤ D)).map f✝ ≫
      (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) Y✝ =
    (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) X✝ ≫
      ((whiskeringRight C D E).obj F ⋙ (whiskeringRight C E D).obj G).map f✝
tactic: intros
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ D
f✝ : X✝ ⟶ Y✝
⊢ (𝟭 (C ⥤ D)).map f✝ ≫
      (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) Y✝ =
    (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) X✝ ≫
      ((whiskeringRight C D E).obj F ⋙ (whiskeringRight C E D).obj G).map f✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ D
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ ((𝟭 (C ⥤ D)).map f✝ ≫
          (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) Y✝).app
      x✝ =
    ((fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) X✝ ≫
          ((whiskeringRight C D E).obj F ⋙ (whiskeringRight C E D).obj G).map f✝).app
      x✝
tactic: ext
state_before: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ D
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ ((𝟭 (C ⥤ D)).map f✝ ≫
          (fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) Y✝).app
      x✝ =
    ((fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv) X✝ ≫
          ((whiskeringRight C D E).obj F ⋙ (whiskeringRight C E D).obj G).map f✝).app
      x✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ D
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ f✝.app x✝ ≫ 𝟙 (Y✝.obj x✝) ≫ adj.unit.app (Y✝.obj x✝) ≫ 𝟙 (G.obj (F.obj (Y✝.obj x✝))) =
    (𝟙 (X✝.obj x✝) ≫ adj.unit.app (X✝.obj x✝) ≫ 𝟙 (G.obj (F.obj (X✝.obj x✝)))) ≫ G.map (F.map (f✝.app x✝))
tactic: dsimp
state_before: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ D
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ f✝.app x✝ ≫ 𝟙 (Y✝.obj x✝) ≫ adj.unit.app (Y✝.obj x✝) ≫ 𝟙 (G.obj (F.obj (Y✝.obj x✝))) =
    (𝟙 (X✝.obj x✝) ≫ adj.unit.app (X✝.obj x✝) ≫ 𝟙 (G.obj (F.obj (X✝.obj x✝)))) ≫ G.map (F.map (f✝.app x✝))
state_after: no goals
tactic: simp
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ ∀ ⦃X Y : C ⥤ E⦄ (f : X ⟶ Y),
    ((whiskeringRight C E D).obj G ⋙ (whiskeringRight C D E).obj F).map f ≫
        (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) Y =
      (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) X ≫ (𝟭 (C ⥤ E)).map f
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ E
f✝ : X✝ ⟶ Y✝
⊢ ((whiskeringRight C E D).obj G ⋙ (whiskeringRight C D E).obj F).map f✝ ≫
      (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) Y✝ =
    (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) X✝ ≫ (𝟭 (C ⥤ E)).map f✝
tactic: intros
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ E
f✝ : X✝ ⟶ Y✝
⊢ ((whiskeringRight C E D).obj G ⋙ (whiskeringRight C D E).obj F).map f✝ ≫
      (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) Y✝ =
    (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) X✝ ≫ (𝟭 (C ⥤ E)).map f✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ E
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ (((whiskeringRight C E D).obj G ⋙ (whiskeringRight C D E).obj F).map f✝ ≫
          (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) Y✝).app
      x✝ =
    ((fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) X✝ ≫ (𝟭 (C ⥤ E)).map f✝).app x✝
tactic: ext
state_before: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ E
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ (((whiskeringRight C E D).obj G ⋙ (whiskeringRight C D E).obj F).map f✝ ≫
          (fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) Y✝).app
      x✝ =
    ((fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom) X✝ ≫ (𝟭 (C ⥤ E)).map f✝).app x✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ E
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ F.map (G.map (f✝.app x✝)) ≫ 𝟙 (F.obj (G.obj (Y✝.obj x✝))) ≫ adj.counit.app (Y✝.obj x✝) ≫ 𝟙 (Y✝.obj x✝) =
    (𝟙 (F.obj (G.obj (X✝.obj x✝))) ≫ adj.counit.app (X✝.obj x✝) ≫ 𝟙 (X✝.obj x✝)) ≫ f✝.app x✝
tactic: dsimp
state_before: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : C ⥤ E
f✝ : X✝ ⟶ Y✝
x✝ : C
⊢ F.map (G.map (f✝.app x✝)) ≫ 𝟙 (F.obj (G.obj (Y✝.obj x✝))) ≫ adj.counit.app (Y✝.obj x✝) ≫ 𝟙 (Y✝.obj x✝) =
    (𝟙 (F.obj (G.obj (X✝.obj x✝))) ≫ adj.counit.app (X✝.obj x✝) ≫ 𝟙 (X✝.obj x✝)) ≫ f✝.app x✝
state_after: no goals
tactic: simp
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ whiskerRight
        { app := fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv,
          naturality := ⋯ }
        ((whiskeringRight C D E).obj F) ≫
      (((whiskeringRight C D E).obj F).associator ((whiskeringRight C E D).obj G) ((whiskeringRight C D E).obj F)).hom ≫
        whiskerLeft ((whiskeringRight C D E).obj F)
          { app := fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom, naturality := ⋯ } =
    NatTrans.id (𝟭 (C ⥤ D) ⋙ (whiskeringRight C D E).obj F)
state_after: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ D
x✝ : C
⊢ ((whiskerRight
                { app := fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv,
                  naturality := ⋯ }
                ((whiskeringRight C D E).obj F) ≫
              (((whiskeringRight C D E).obj F).associator ((whiskeringRight C E D).obj G)
                    ((whiskeringRight C D E).obj F)).hom ≫
                whiskerLeft ((whiskeringRight C D E).obj F)
                  { app := fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom,
                    naturality := ⋯ }).app
          x✝¹).app
      x✝ =
    ((NatTrans.id (𝟭 (C ⥤ D) ⋙ (whiskeringRight C D E).obj F)).app x✝¹).app x✝
tactic: ext
state_before: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ D
x✝ : C
⊢ ((whiskerRight
                { app := fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv,
                  naturality := ⋯ }
                ((whiskeringRight C D E).obj F) ≫
              (((whiskeringRight C D E).obj F).associator ((whiskeringRight C E D).obj G)
                    ((whiskeringRight C D E).obj F)).hom ≫
                whiskerLeft ((whiskeringRight C D E).obj F)
                  { app := fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom,
                    naturality := ⋯ }).app
          x✝¹).app
      x✝ =
    ((NatTrans.id (𝟭 (C ⥤ D) ⋙ (whiskeringRight C D E).obj F)).app x✝¹).app x✝
state_after: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ D
x✝ : C
⊢ F.map (𝟙 (x✝¹.obj x✝) ≫ adj.unit.app (x✝¹.obj x✝) ≫ 𝟙 (G.obj (F.obj (x✝¹.obj x✝)))) ≫
      𝟙 (F.obj (G.obj (F.obj (x✝¹.obj x✝)))) ≫
        𝟙 (F.obj (G.obj (F.obj (x✝¹.obj x✝)))) ≫ adj.counit.app (F.obj (x✝¹.obj x✝)) ≫ 𝟙 (F.obj (x✝¹.obj x✝)) =
    𝟙 (F.obj (x✝¹.obj x✝))
tactic: dsimp
state_before: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ D
x✝ : C
⊢ F.map (𝟙 (x✝¹.obj x✝) ≫ adj.unit.app (x✝¹.obj x✝) ≫ 𝟙 (G.obj (F.obj (x✝¹.obj x✝)))) ≫
      𝟙 (F.obj (G.obj (F.obj (x✝¹.obj x✝)))) ≫
        𝟙 (F.obj (G.obj (F.obj (x✝¹.obj x✝)))) ≫ adj.counit.app (F.obj (x✝¹.obj x✝)) ≫ 𝟙 (F.obj (x✝¹.obj x✝)) =
    𝟙 (F.obj (x✝¹.obj x✝))
state_after: no goals
tactic: simp
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ whiskerLeft ((whiskeringRight C E D).obj G)
        { app := fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv,
          naturality := ⋯ } ≫
      (((whiskeringRight C E D).obj G).associator ((whiskeringRight C D E).obj F) ((whiskeringRight C E D).obj G)).inv ≫
        whiskerRight
          { app := fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom, naturality := ⋯ }
          ((whiskeringRight C E D).obj G) =
    NatTrans.id ((whiskeringRight C E D).obj G ⋙ 𝟭 (C ⥤ D))
state_after: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ E
x✝ : C
⊢ ((whiskerLeft ((whiskeringRight C E D).obj G)
                { app := fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv,
                  naturality := ⋯ } ≫
              (((whiskeringRight C E D).obj G).associator ((whiskeringRight C D E).obj F)
                    ((whiskeringRight C E D).obj G)).inv ≫
                whiskerRight
                  { app := fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom,
                    naturality := ⋯ }
                  ((whiskeringRight C E D).obj G)).app
          x✝¹).app
      x✝ =
    ((NatTrans.id ((whiskeringRight C E D).obj G ⋙ 𝟭 (C ⥤ D))).app x✝¹).app x✝
tactic: ext
state_before: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ E
x✝ : C
⊢ ((whiskerLeft ((whiskeringRight C E D).obj G)
                { app := fun X => ((𝟭 (C ⥤ D)).obj X).rightUnitor.inv ≫ whiskerLeft X adj.unit ≫ (X.associator F G).inv,
                  naturality := ⋯ } ≫
              (((whiskeringRight C E D).obj G).associator ((whiskeringRight C D E).obj F)
                    ((whiskeringRight C E D).obj G)).inv ≫
                whiskerRight
                  { app := fun X => (X.associator G F).hom ≫ whiskerLeft X adj.counit ≫ X.rightUnitor.hom,
                    naturality := ⋯ }
                  ((whiskeringRight C E D).obj G)).app
          x✝¹).app
      x✝ =
    ((NatTrans.id ((whiskeringRight C E D).obj G ⋙ 𝟭 (C ⥤ D))).app x✝¹).app x✝
state_after: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ E
x✝ : C
⊢ (𝟙 (G.obj (x✝¹.obj x✝)) ≫ adj.unit.app (G.obj (x✝¹.obj x✝)) ≫ 𝟙 (G.obj (F.obj (G.obj (x✝¹.obj x✝))))) ≫
      𝟙 (G.obj (F.obj (G.obj (x✝¹.obj x✝)))) ≫
        G.map (𝟙 (F.obj (G.obj (x✝¹.obj x✝))) ≫ adj.counit.app (x✝¹.obj x✝) ≫ 𝟙 (x✝¹.obj x✝)) =
    𝟙 (G.obj (x✝¹.obj x✝))
tactic: dsimp
state_before: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.63, u_1} C
inst✝¹ : Category.{?u.67, u_2} D
inst✝ : Category.{?u.71, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x✝¹ : C ⥤ E
x✝ : C
⊢ (𝟙 (G.obj (x✝¹.obj x✝)) ≫ adj.unit.app (G.obj (x✝¹.obj x✝)) ≫ 𝟙 (G.obj (F.obj (G.obj (x✝¹.obj x✝))))) ≫
      𝟙 (G.obj (F.obj (G.obj (x✝¹.obj x✝)))) ≫
        G.map (𝟙 (F.obj (G.obj (x✝¹.obj x✝))) ≫ adj.counit.app (x✝¹.obj x✝) ≫ 𝟙 (x✝¹.obj x✝)) =
    𝟙 (G.obj (x✝¹.obj x✝))
state_after: no goals
tactic: simp