Theorem: CategoryTheory.Adjunction.mkOfUnitCounit_counit
File: Mathlib/CategoryTheory/Adjunction/Basic.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
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
⊢ (fun g => F.map g ≫ adj.counit.app Y) ((fun f => adj.unit.app X ≫ G.map f) f) = f
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
⊢ F.map (adj.unit.app X ≫ G.map f) ≫ adj.counit.app Y = f
tactic: change F.map (_ ≫ _) ≫ _ = _
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
⊢ F.map (adj.unit.app X ≫ G.map f) ≫ adj.counit.app Y = f
state_after: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
⊢ (F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X)) ≫ (𝟭 D).map f = f
tactic: rw [F.map_comp, assoc, ← Functor.comp_map, adj.counit.naturality, ← assoc]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
⊢ (F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X)) ≫ (𝟭 D).map f = f
state_after: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
tactic: convert id_comp f
state_before: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
state_after: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
t :
  (fun s => s.app X) (whiskerRight adj.unit F ≫ (F.associator G F).hom ≫ whiskerLeft F adj.counit) =
    (fun s => s.app X) (NatTrans.id (𝟭 C ⋙ F))
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
tactic: have t := congrArg (fun (s : NatTrans (𝟭 C ⋙ F) (F ⋙ 𝟭 D)) => s.app X) adj.left_triangle
state_before: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
t :
  (fun s => s.app X) (whiskerRight adj.unit F ≫ (F.associator G F).hom ≫ whiskerLeft F adj.counit) =
    (fun s => s.app X) (NatTrans.id (𝟭 C ⋙ F))
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
state_after: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
t : F.map (adj.unit.app X) ≫ 𝟙 (F.obj (G.obj (F.obj X))) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
tactic: dsimp at t
state_before: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
t : F.map (adj.unit.app X) ≫ 𝟙 (F.obj (G.obj (F.obj X))) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
state_after: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
t : F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
tactic: simp only [id_comp] at t
state_before: case h.e'_2.h.e'_6.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
f : F.obj X ⟶ Y
e_4✝ : (𝟭 D).obj (F.obj X) = F.obj X
t : F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
⊢ F.map (adj.unit.app X) ≫ adj.counit.app (F.obj X) = 𝟙 (F.obj X)
state_after: no goals
tactic: exact t
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
⊢ (fun f => adj.unit.app X ≫ G.map f) ((fun g => F.map g ≫ adj.counit.app Y) g) = 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
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
⊢ adj.unit.app X ≫ G.map (F.map g ≫ adj.counit.app Y) = g
tactic: change _ ≫ G.map (_ ≫ _) = _
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
⊢ adj.unit.app X ≫ G.map (F.map g ≫ adj.counit.app Y) = 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
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
⊢ (𝟭 C).map g ≫ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = g
tactic: rw [G.map_comp, ← assoc, ← Functor.comp_map, ← adj.unit.naturality, assoc]
state_before: C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
⊢ (𝟭 C).map g ≫ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = g
state_after: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
tactic: convert comp_id g
state_before: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
state_after: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
t :
  (fun t => t.app Y) (whiskerLeft G adj.unit ≫ (G.associator F G).inv ≫ whiskerRight adj.counit G) =
    (fun t => t.app Y) (NatTrans.id (G ⋙ 𝟭 C))
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
tactic: have t := congrArg (fun t : NatTrans (G ⋙ 𝟭 C) (𝟭 D ⋙ G) => t.app Y) adj.right_triangle
state_before: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
t :
  (fun t => t.app Y) (whiskerLeft G adj.unit ≫ (G.associator F G).inv ≫ whiskerRight adj.counit G) =
    (fun t => t.app Y) (NatTrans.id (G ⋙ 𝟭 C))
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
state_after: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
t : adj.unit.app (G.obj Y) ≫ 𝟙 (G.obj (F.obj (G.obj Y))) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
tactic: dsimp at t
state_before: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
t : adj.unit.app (G.obj Y) ≫ 𝟙 (G.obj (F.obj (G.obj Y))) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
state_after: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
t : adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
tactic: simp only [id_comp] at t
state_before: case h.e'_2.h.e'_7.h
C : Type u₁
inst✝¹ : Category.{v₁, u₁} C
D : Type u₂
inst✝ : Category.{v₂, u₂} D
F : C ⥤ D
G : D ⥤ C
adj : CoreUnitCounit F G
X : C
Y : D
g : X ⟶ G.obj Y
e_4✝ : (𝟭 C).obj (G.obj Y) = G.obj Y
t : adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
⊢ adj.unit.app (G.obj Y) ≫ G.map (adj.counit.app Y) = 𝟙 (G.obj Y)
state_after: no goals
tactic: exact t