Theorem: CategoryTheory.Adjunction.adjointOfOpAdjointOp_unit_app
File: Mathlib/CategoryTheory/Adjunction/Opposites.lean

Proof steps:
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
⊢ ∀ {X' X : C} {Y : D} (f : X' ⟶ X) (g : X ⟶ G.obj Y),
    (fun {X} {Y} =>
            ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                    (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
              (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X))).symm
        (f ≫ g) =
      F.map f ≫
        (fun {X} {Y} =>
              ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                      (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
                (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X))).symm
          g
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X' X : C
Y : D
f : X' ⟶ X
g : X ⟶ G.obj Y
⊢ (fun {X} {Y} =>
          ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                  (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
            (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X))).symm
      (f ≫ g) =
    F.map f ≫
      (fun {X} {Y} =>
            ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                    (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
              (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X))).symm
        g
tactic: intros X' X Y f g
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X' X : C
Y : D
f : X' ⟶ X
g : X ⟶ G.obj Y
⊢ (fun {X} {Y} =>
          ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                  (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
            (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X))).symm
      (f ≫ g) =
    F.map f ≫
      (fun {X} {Y} =>
            ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                    (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
              (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X))).symm
        g
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X' X : C
Y : D
f : X' ⟶ X
g : X ⟶ G.obj Y
⊢ ((h.homEquiv (Opposite.op Y) (Opposite.op X')) (g.op ≫ f.op)).unop =
    F.map f ≫ ((h.homEquiv (Opposite.op Y) (Opposite.op X)) g.op).unop
tactic: dsimp [opEquiv]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X' X : C
Y : D
f : X' ⟶ X
g : X ⟶ G.obj Y
⊢ ((h.homEquiv (Opposite.op Y) (Opposite.op X')) (g.op ≫ f.op)).unop =
    F.map f ≫ ((h.homEquiv (Opposite.op Y) (Opposite.op X)) g.op).unop
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X' X : C
Y : D
f : X' ⟶ X
g : X ⟶ G.obj Y
⊢ (h.unit.app (Opposite.op Y) ≫ F.op.map (g.op ≫ f.op)).unop =
    F.map f ≫ (h.unit.app (Opposite.op Y) ≫ F.op.map g.op).unop
tactic: erw [homEquiv_unit, homEquiv_unit]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X' X : C
Y : D
f : X' ⟶ X
g : X ⟶ G.obj Y
⊢ (h.unit.app (Opposite.op Y) ≫ F.op.map (g.op ≫ f.op)).unop =
    F.map f ≫ (h.unit.app (Opposite.op Y) ≫ F.op.map g.op).unop
state_after: no goals
tactic: simp
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
⊢ ∀ {X : C} {Y Y' : D} (f : F.obj X ⟶ Y) (g : Y ⟶ Y'),
    (fun {X} {Y} =>
          ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                  (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
            (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X)))
        (f ≫ g) =
      (fun {X} {Y} =>
            ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                    (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
              (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X)))
          f ≫
        G.map g
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X : C
Y Y' : D
f : F.obj X ⟶ Y
g : Y ⟶ Y'
⊢ (fun {X} {Y} =>
        ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
          (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X)))
      (f ≫ g) =
    (fun {X} {Y} =>
          ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                  (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
            (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X)))
        f ≫
      G.map g
tactic: intros X Y Y' f g
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X : C
Y Y' : D
f : F.obj X ⟶ Y
g : Y ⟶ Y'
⊢ (fun {X} {Y} =>
        ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
          (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X)))
      (f ≫ g) =
    (fun {X} {Y} =>
          ((h.homEquiv (Opposite.op Y) (Opposite.op X)).trans
                  (opEquiv (Opposite.op Y) (F.op.obj (Opposite.op X)))).symm.trans
            (opEquiv (G.op.obj (Opposite.op Y)) (Opposite.op X)))
        f ≫
      G.map g
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X : C
Y Y' : D
f : F.obj X ⟶ Y
g : Y ⟶ Y'
⊢ ((h.homEquiv (Opposite.op Y') (Opposite.op X)).symm (g.op ≫ f.op)).unop =
    ((h.homEquiv (Opposite.op Y) (Opposite.op X)).symm f.op).unop ≫ G.map g
tactic: dsimp [opEquiv]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X : C
Y Y' : D
f : F.obj X ⟶ Y
g : Y ⟶ Y'
⊢ ((h.homEquiv (Opposite.op Y') (Opposite.op X)).symm (g.op ≫ f.op)).unop =
    ((h.homEquiv (Opposite.op Y) (Opposite.op X)).symm f.op).unop ≫ G.map g
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X : C
Y Y' : D
f : F.obj X ⟶ Y
g : Y ⟶ Y'
⊢ (G.op.map (g.op ≫ f.op) ≫ h.counit.app (Opposite.op X)).unop =
    (G.op.map f.op ≫ h.counit.app (Opposite.op X)).unop ≫ G.map g
tactic: erw [homEquiv_counit, homEquiv_counit]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
h : G.op ⊣ F.op
X : C
Y Y' : D
f : F.obj X ⟶ Y
g : Y ⟶ Y'
⊢ (G.op.map (g.op ≫ f.op) ≫ h.counit.app (Opposite.op X)).unop =
    (G.op.map f.op ≫ h.counit.app (Opposite.op X)).unop ≫ G.map g
state_after: no goals
tactic: simp