Theorem: CategoryTheory.Adjunction.whiskerLeft_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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ ∀ ⦃X Y : D ⥤ C⦄ (f : X ⟶ Y),
    (𝟭 (D ⥤ C)).map f ≫
        (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) Y =
      (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) X ≫
        ((whiskeringLeft E D C).obj G ⋙ (whiskeringLeft D E C).obj F).map f
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : D ⥤ C
f✝ : X✝ ⟶ Y✝
⊢ (𝟭 (D ⥤ C)).map f✝ ≫
      (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) Y✝ =
    (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) X✝ ≫
      ((whiskeringLeft E D C).obj G ⋙ (whiskeringLeft D E C).obj F).map f✝
tactic: intros
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : D ⥤ C
f✝ : X✝ ⟶ Y✝
⊢ (𝟭 (D ⥤ C)).map f✝ ≫
      (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) Y✝ =
    (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) X✝ ≫
      ((whiskeringLeft E D C).obj G ⋙ (whiskeringLeft D E C).obj F).map f✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : D ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : D
⊢ ((𝟭 (D ⥤ C)).map f✝ ≫
          (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) Y✝).app
      x✝ =
    ((fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) X✝ ≫
          ((whiskeringLeft E D C).obj G ⋙ (whiskeringLeft D E C).obj F).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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : D ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : D
⊢ ((𝟭 (D ⥤ C)).map f✝ ≫
          (fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) Y✝).app
      x✝ =
    ((fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom) X✝ ≫
          ((whiskeringLeft E D C).obj G ⋙ (whiskeringLeft D E C).obj F).map f✝).app
      x✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : D ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : D
⊢ f✝.app x✝ ≫ 𝟙 (Y✝.obj x✝) ≫ Y✝.map (adj.unit.app x✝) ≫ 𝟙 (Y✝.obj (G.obj (F.obj x✝))) =
    (𝟙 (X✝.obj x✝) ≫ X✝.map (adj.unit.app x✝) ≫ 𝟙 (X✝.obj (G.obj (F.obj x✝)))) ≫ f✝.app (G.obj (F.obj x✝))
tactic: dsimp
state_before: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : D ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : D
⊢ f✝.app x✝ ≫ 𝟙 (Y✝.obj x✝) ≫ Y✝.map (adj.unit.app x✝) ≫ 𝟙 (Y✝.obj (G.obj (F.obj x✝))) =
    (𝟙 (X✝.obj x✝) ≫ X✝.map (adj.unit.app x✝) ≫ 𝟙 (X✝.obj (G.obj (F.obj x✝)))) ≫ f✝.app (G.obj (F.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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ ∀ ⦃X Y : E ⥤ C⦄ (f : X ⟶ Y),
    ((whiskeringLeft D E C).obj F ⋙ (whiskeringLeft E D C).obj G).map f ≫
        (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) Y =
      (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) X ≫ (𝟭 (E ⥤ C)).map f
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : E ⥤ C
f✝ : X✝ ⟶ Y✝
⊢ ((whiskeringLeft D E C).obj F ⋙ (whiskeringLeft E D C).obj G).map f✝ ≫
      (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) Y✝ =
    (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) X✝ ≫ (𝟭 (E ⥤ C)).map f✝
tactic: intros
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : E ⥤ C
f✝ : X✝ ⟶ Y✝
⊢ ((whiskeringLeft D E C).obj F ⋙ (whiskeringLeft E D C).obj G).map f✝ ≫
      (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) Y✝ =
    (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) X✝ ≫ (𝟭 (E ⥤ C)).map f✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : E ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : E
⊢ (((whiskeringLeft D E C).obj F ⋙ (whiskeringLeft E D C).obj G).map f✝ ≫
          (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) Y✝).app
      x✝ =
    ((fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) X✝ ≫ (𝟭 (E ⥤ C)).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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : E ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : E
⊢ (((whiskeringLeft D E C).obj F ⋙ (whiskeringLeft E D C).obj G).map f✝ ≫
          (fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) Y✝).app
      x✝ =
    ((fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom) X✝ ≫ (𝟭 (E ⥤ C)).map f✝).app x✝
state_after: case w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : E ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : E
⊢ f✝.app (F.obj (G.obj x✝)) ≫ 𝟙 (Y✝.obj (F.obj (G.obj x✝))) ≫ Y✝.map (adj.counit.app x✝) ≫ 𝟙 (Y✝.obj x✝) =
    (𝟙 (X✝.obj (F.obj (G.obj x✝))) ≫ X✝.map (adj.counit.app 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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
X✝ Y✝ : E ⥤ C
f✝ : X✝ ⟶ Y✝
x✝ : E
⊢ f✝.app (F.obj (G.obj x✝)) ≫ 𝟙 (Y✝.obj (F.obj (G.obj x✝))) ≫ Y✝.map (adj.counit.app x✝) ≫ 𝟙 (Y✝.obj x✝) =
    (𝟙 (X✝.obj (F.obj (G.obj x✝))) ≫ X✝.map (adj.counit.app 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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ whiskerRight
        { app := fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom,
          naturality := ⋯ }
        ((whiskeringLeft E D C).obj G) ≫
      (((whiskeringLeft E D C).obj G).associator ((whiskeringLeft D E C).obj F) ((whiskeringLeft E D C).obj G)).hom ≫
        whiskerLeft ((whiskeringLeft E D C).obj G)
          { app := fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom, naturality := ⋯ } =
    NatTrans.id (𝟭 (D ⥤ C) ⋙ (whiskeringLeft E D C).obj G)
state_after: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : D ⥤ C
x✝ : E
⊢ ((whiskerRight
                { app := fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom,
                  naturality := ⋯ }
                ((whiskeringLeft E D C).obj G) ≫
              (((whiskeringLeft E D C).obj G).associator ((whiskeringLeft D E C).obj F)
                    ((whiskeringLeft E D C).obj G)).hom ≫
                whiskerLeft ((whiskeringLeft E D C).obj G)
                  { app := fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom,
                    naturality := ⋯ }).app
          x).app
      x✝ =
    ((NatTrans.id (𝟭 (D ⥤ C) ⋙ (whiskeringLeft E D C).obj G)).app x).app x✝
tactic: ext x
state_before: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : D ⥤ C
x✝ : E
⊢ ((whiskerRight
                { app := fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom,
                  naturality := ⋯ }
                ((whiskeringLeft E D C).obj G) ≫
              (((whiskeringLeft E D C).obj G).associator ((whiskeringLeft D E C).obj F)
                    ((whiskeringLeft E D C).obj G)).hom ≫
                whiskerLeft ((whiskeringLeft E D C).obj G)
                  { app := fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom,
                    naturality := ⋯ }).app
          x).app
      x✝ =
    ((NatTrans.id (𝟭 (D ⥤ C) ⋙ (whiskeringLeft E D C).obj G)).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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : D ⥤ C
x✝ : E
⊢ (𝟙 (x.obj (G.obj x✝)) ≫ x.map (adj.unit.app (G.obj x✝)) ≫ 𝟙 (x.obj (G.obj (F.obj (G.obj x✝))))) ≫
      𝟙 (x.obj (G.obj (F.obj (G.obj x✝)))) ≫
        𝟙 (x.obj (G.obj (F.obj (G.obj x✝)))) ≫ x.map (G.map (adj.counit.app x✝)) ≫ 𝟙 (x.obj (G.obj x✝)) =
    𝟙 (x.obj (G.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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : D ⥤ C
x✝ : E
⊢ (𝟙 (x.obj (G.obj x✝)) ≫ x.map (adj.unit.app (G.obj x✝)) ≫ 𝟙 (x.obj (G.obj (F.obj (G.obj x✝))))) ≫
      𝟙 (x.obj (G.obj (F.obj (G.obj x✝)))) ≫
        𝟙 (x.obj (G.obj (F.obj (G.obj x✝)))) ≫ x.map (G.map (adj.counit.app x✝)) ≫ 𝟙 (x.obj (G.obj x✝)) =
    𝟙 (x.obj (G.obj x✝))
state_after: no goals
tactic: simp [Category.id_comp, Category.comp_id, ← x.map_comp]
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
⊢ whiskerLeft ((whiskeringLeft D E C).obj F)
        { app := fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom,
          naturality := ⋯ } ≫
      (((whiskeringLeft D E C).obj F).associator ((whiskeringLeft E D C).obj G) ((whiskeringLeft D E C).obj F)).inv ≫
        whiskerRight
          { app := fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom, naturality := ⋯ }
          ((whiskeringLeft D E C).obj F) =
    NatTrans.id ((whiskeringLeft D E C).obj F ⋙ 𝟭 (D ⥤ C))
state_after: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : E ⥤ C
x✝ : D
⊢ ((whiskerLeft ((whiskeringLeft D E C).obj F)
                { app := fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom,
                  naturality := ⋯ } ≫
              (((whiskeringLeft D E C).obj F).associator ((whiskeringLeft E D C).obj G)
                    ((whiskeringLeft D E C).obj F)).inv ≫
                whiskerRight
                  { app := fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom,
                    naturality := ⋯ }
                  ((whiskeringLeft D E C).obj F)).app
          x).app
      x✝ =
    ((NatTrans.id ((whiskeringLeft D E C).obj F ⋙ 𝟭 (D ⥤ C))).app x).app x✝
tactic: ext x
state_before: case w.h.w.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : E ⥤ C
x✝ : D
⊢ ((whiskerLeft ((whiskeringLeft D E C).obj F)
                { app := fun X => ((𝟭 (D ⥤ C)).obj X).leftUnitor.inv ≫ whiskerRight adj.unit X ≫ (F.associator G X).hom,
                  naturality := ⋯ } ≫
              (((whiskeringLeft D E C).obj F).associator ((whiskeringLeft E D C).obj G)
                    ((whiskeringLeft D E C).obj F)).inv ≫
                whiskerRight
                  { app := fun X => (G.associator F X).inv ≫ whiskerRight adj.counit X ≫ X.leftUnitor.hom,
                    naturality := ⋯ }
                  ((whiskeringLeft D E C).obj F)).app
          x).app
      x✝ =
    ((NatTrans.id ((whiskeringLeft D E C).obj F ⋙ 𝟭 (D ⥤ C))).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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : E ⥤ C
x✝ : D
⊢ (𝟙 (x.obj (F.obj x✝)) ≫ x.map (F.map (adj.unit.app x✝)) ≫ 𝟙 (x.obj (F.obj (G.obj (F.obj x✝))))) ≫
      𝟙 (x.obj (F.obj (G.obj (F.obj x✝)))) ≫
        𝟙 (x.obj (F.obj (G.obj (F.obj x✝)))) ≫ x.map (adj.counit.app (F.obj x✝)) ≫ 𝟙 (x.obj (F.obj x✝)) =
    𝟙 (x.obj (F.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.20707, u_1} C
inst✝¹ : Category.{?u.20711, u_2} D
inst✝ : Category.{?u.20715, u_3} E
F : D ⥤ E
G : E ⥤ D
adj : F ⊣ G
x : E ⥤ C
x✝ : D
⊢ (𝟙 (x.obj (F.obj x✝)) ≫ x.map (F.map (adj.unit.app x✝)) ≫ 𝟙 (x.obj (F.obj (G.obj (F.obj x✝))))) ≫
      𝟙 (x.obj (F.obj (G.obj (F.obj x✝)))) ≫
        𝟙 (x.obj (F.obj (G.obj (F.obj x✝)))) ≫ x.map (adj.counit.app (F.obj x✝)) ≫ 𝟙 (x.obj (F.obj x✝)) =
    𝟙 (x.obj (F.obj x✝))
state_after: no goals
tactic: simp [Category.id_comp, Category.comp_id, ← x.map_comp]