Theorem: CategoryTheory.Adjunction.natTransEquiv_symm_apply_app
File: Mathlib/CategoryTheory/Adjunction/Unique.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
⊢ ∀ ⦃X Y : C⦄ (f_1 : X ⟶ Y),
    F'.map f_1 ≫ (fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) Y =
      (fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) X ≫ F.map f_1
state_after: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X Y : C
g : X ⟶ Y
⊢ F'.map g ≫ (fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) Y =
    (fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) X ≫ F.map g
tactic: intro X Y g
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X Y : C
g : X ⟶ Y
⊢ F'.map g ≫ (fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) Y =
    (fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) X ≫ F.map g
state_after: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X Y : C
g : X ⟶ Y
⊢ F'.map (g ≫ (adj1.unit ≫ whiskerLeft F f).app Y) ≫ adj2.counit.app (F.obj Y) =
    (F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) ≫ F.map g
tactic: simp only [← Category.assoc, ← Functor.map_comp]
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X Y : C
g : X ⟶ Y
⊢ F'.map (g ≫ (adj1.unit ≫ whiskerLeft F f).app Y) ≫ adj2.counit.app (F.obj Y) =
    (F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) ≫ F.map g
state_after: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X Y : C
g : X ⟶ Y
⊢ F'.map ((adj1.unit ≫ whiskerLeft F f).app X ≫ (F ⋙ G').map g) ≫ adj2.counit.app (F.obj Y) =
    (F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) ≫ F.map g
tactic: erw [(adj1.unit ≫ (whiskerLeft F f)).naturality]
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X Y : C
g : X ⟶ Y
⊢ F'.map ((adj1.unit ≫ whiskerLeft F f).app X ≫ (F ⋙ G').map g) ≫ adj2.counit.app (F.obj Y) =
    (F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X)) ≫ F.map g
state_after: no goals
tactic: simp
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
⊢ ∀ ⦃X Y : D⦄ (f_1 : X ⟶ Y),
    G.map f_1 ≫ (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) Y =
      (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) X ≫ G'.map f_1
state_after: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
X Y : D
g : X ⟶ Y
⊢ G.map g ≫ (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) Y =
    (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) X ≫ G'.map g
tactic: intro X Y g
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
X Y : D
g : X ⟶ Y
⊢ G.map g ≫ (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) Y =
    (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) X ≫ G'.map g
state_after: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
X Y : D
g : X ⟶ Y
⊢ adj2.unit.app (G.obj X) ≫ G'.map (F'.map (G.map g)) ≫ G'.map (f.app (G.obj Y) ≫ adj1.counit.app Y) =
    (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) X ≫ G'.map g
tactic: erw [← adj2.unit_naturality_assoc]
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
X Y : D
g : X ⟶ Y
⊢ adj2.unit.app (G.obj X) ≫ G'.map (F'.map (G.map g)) ≫ G'.map (f.app (G.obj Y) ≫ adj1.counit.app Y) =
    (fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) X ≫ G'.map g
state_after: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
X Y : D
g : X ⟶ Y
⊢ adj2.unit.app (G.obj X) ≫ G'.map (F'.map (G.map g) ≫ f.app (G.obj Y) ≫ adj1.counit.app Y) =
    (adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) ≫ G'.map g
tactic: simp only [← Functor.map_comp]
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
X Y : D
g : X ⟶ Y
⊢ adj2.unit.app (G.obj X) ≫ G'.map (F'.map (G.map g) ≫ f.app (G.obj Y) ≫ adj1.counit.app Y) =
    (adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)) ≫ G'.map g
state_after: no goals
tactic: simp
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
⊢ (fun f => { app := fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X), naturality := ⋯ })
      ((fun f =>
          { app := fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X), naturality := ⋯ })
        f) =
    f
state_after: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X : D
⊢ ((fun f =>
            { app := fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X), naturality := ⋯ })
          ((fun f =>
              { app := fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X),
                naturality := ⋯ })
            f)).app
      X =
    f.app X
tactic: ext X
state_before: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X : D
⊢ ((fun f =>
            { app := fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X), naturality := ⋯ })
          ((fun f =>
              { app := fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X),
                naturality := ⋯ })
            f)).app
      X =
    f.app X
state_after: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X : D
⊢ adj1.unit.app (G.obj X) ≫ f.app (F.obj (G.obj X)) ≫ G'.map (adj1.counit.app X) = f.app X
tactic: simp only [Functor.comp_obj, NatTrans.comp_app, Functor.id_obj, whiskerLeft_app,
      Functor.map_comp, Category.assoc, unit_naturality_assoc, right_triangle_components_assoc]
state_before: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X : D
⊢ adj1.unit.app (G.obj X) ≫ f.app (F.obj (G.obj X)) ≫ G'.map (adj1.counit.app X) = f.app X
state_after: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X : D
⊢ (adj1.unit.app (G.obj X) ≫ G.map (adj1.counit.app X)) ≫ f.app ((𝟭 D).obj X) = f.app X
tactic: erw [← f.naturality (adj1.counit.app X), ← Category.assoc]
state_before: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : G ⟶ G'
X : D
⊢ (adj1.unit.app (G.obj X) ≫ G.map (adj1.counit.app X)) ≫ f.app ((𝟭 D).obj X) = f.app X
state_after: no goals
tactic: simp
state_before: C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
⊢ (fun f =>
        { app := fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X), naturality := ⋯ })
      ((fun f =>
          { app := fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X), naturality := ⋯ })
        f) =
    f
state_after: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
x✝ : C
⊢ ((fun f =>
            { app := fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X),
              naturality := ⋯ })
          ((fun f =>
              { app := fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X),
                naturality := ⋯ })
            f)).app
      x✝ =
    f.app x✝
tactic: ext
state_before: case w.h
C : Type u_1
D : Type u_2
inst✝¹ : Category.{?u.23, u_1} C
inst✝ : Category.{?u.27, u_2} D
F F' : C ⥤ D
G G' : D ⥤ C
adj1 : F ⊣ G
adj2 : F' ⊣ G'
f : F' ⟶ F
x✝ : C
⊢ ((fun f =>
            { app := fun X => F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app (F.obj X),
              naturality := ⋯ })
          ((fun f =>
              { app := fun X => adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X),
                naturality := ⋯ })
            f)).app
      x✝ =
    f.app x✝
state_after: no goals
tactic: simp