Theorem: _private.Mathlib.CategoryTheory.Sites.Discrete.0.CategoryTheory.Sheaf.sheafifyComposeIso_comp_sheafCompose_map_constantSheafAdj_counit
File: Mathlib/CategoryTheory/Sites/Discrete.lean

Proof steps:
state_before: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ (sheafifyComposeIso J U ((const Cᵒᵖ).obj (F.val.obj (op t)))).hom ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    ((presheafToSheaf J B ⋙ sheafToPresheaf J B).mapIso (constComp Cᵒᵖ (F.val.obj (op t)) U)).hom ≫
      ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
state_after: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      (sheafifyComposeIso J U ((const Cᵒᵖ).obj (F.val.obj (op t)))).hom ≫
        ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((presheafToSheaf J B ⋙ sheafToPresheaf J B).mapIso (constComp Cᵒᵖ (F.val.obj (op t)) U)).hom ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
tactic: apply sheafify_hom_ext _ _ _ ((sheafCompose J U).obj F).cond
state_before: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      (sheafifyComposeIso J U ((const Cᵒᵖ).obj (F.val.obj (op t)))).hom ≫
        ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((presheafToSheaf J B ⋙ sheafToPresheaf J B).mapIso (constComp Cᵒᵖ (F.val.obj (op t)) U)).hom ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
state_after: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((presheafToSheaf J B).map (constComp Cᵒᵖ (F.val.obj (op t)) U).hom).val ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
tactic: simp only [sheafCompose_obj_val, id_obj, comp_obj, flip_obj_obj, sheafToPresheaf_obj,
    sheafComposeIso_hom_fac_assoc, mapIso_hom, Functor.comp_map, sheafToPresheaf_map]
state_before: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((presheafToSheaf J B).map (constComp Cᵒᵖ (F.val.obj (op t)) U).hom).val ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
state_after: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    (constComp Cᵒᵖ (F.val.obj (op t)) U).hom ≫
      (sheafificationAdjunction J B).unit.app ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
tactic: erw [Adjunction.unit_naturality_assoc]
state_before: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    (constComp Cᵒᵖ (F.val.obj (op t)) U).hom ≫
      (sheafificationAdjunction J B).unit.app ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
state_after: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    { app := fun x => 𝟙 (U.obj (F.val.obj (op t))), naturality := ⋯ } ≫
      toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
tactic: simp only [const_obj_obj, const_obj_map, id_obj, constComp, comp_obj, sheafToPresheaf_obj,
    sheafificationAdjunction_unit_app]
state_before: C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
⊢ whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val =
    { app := fun x => 𝟙 (U.obj (F.val.obj (op t))), naturality := ⋯ } ≫
      toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
        ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val
state_after: case w.h
C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
x✝ : Cᵒᵖ
⊢ (whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
          ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val).app
      x✝ =
    ({ app := fun x => 𝟙 (U.obj (F.val.obj (op t))), naturality := ⋯ } ≫
          toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
            ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val).app
      x✝
tactic: ext
state_before: case w.h
C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
x✝ : Cᵒᵖ
⊢ (whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
          ((sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)).val).app
      x✝ =
    ({ app := fun x => 𝟙 (U.obj (F.val.obj (op t))), naturality := ⋯ } ≫
          toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
            ((constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F)).val).app
      x✝
state_after: case w.h
C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
x✝ : Cᵒᵖ
⊢ U.map ((toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝) ≫
      U.map (𝟙 (((presheafToSheaf J A).obj ((const Cᵒᵖ).obj (F.val.obj (op t)))).val.obj x✝)) ≫
        U.map (((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝) ≫
          U.map ((sheafifyLift J (𝟙 F.val) ⋯).app x✝) =
    (toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t))))).app x✝ ≫
      (sheafifyLift J ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ⋯).app x✝
tactic: simp only [comp_obj, const_obj_obj, NatTrans.comp_app, whiskerRight_app, Category.id_comp,
    comp_obj, flip_obj_obj, sheafToPresheaf_obj, id_obj, constantSheafAdj,
    Adjunction.comp, evaluation_obj_obj, NatTrans.comp_app, associator_hom_app, whiskerLeft_app,
    whiskerRight_app, map_comp, instCategorySheaf_comp_val, sheafCompose_obj_val,
    sheafCompose_map_val, instCategorySheaf_id_val, sheafificationAdjunction_counit_app_val,
    NatTrans.id_app, sheafifyMap_sheafifyLift, Category.comp_id, Category.id_comp]
state_before: case w.h
C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
x✝ : Cᵒᵖ
⊢ U.map ((toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝) ≫
      U.map (𝟙 (((presheafToSheaf J A).obj ((const Cᵒᵖ).obj (F.val.obj (op t)))).val.obj x✝)) ≫
        U.map (((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝) ≫
          U.map ((sheafifyLift J (𝟙 F.val) ⋯).app x✝) =
    (toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t))))).app x✝ ≫
      (sheafifyLift J ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ⋯).app x✝
state_after: case w.h
C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
x✝ : Cᵒᵖ
⊢ U.map ((toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝) ≫
      U.map (((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝) ≫
        U.map ((sheafifyLift J (𝟙 F.val) ⋯).app x✝) =
    (toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
          sheafifyLift J ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ⋯).app
      x✝
tactic: erw [Functor.map_id, Category.id_comp, ← NatTrans.comp_app]
state_before: case w.h
C : Type u_1
inst✝¹³ : Category.{u_5, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_6, u_2} A
inst✝¹¹ : HasWeakSheafify J A
inst✝¹⁰ : (constantSheaf J A).Faithful
inst✝⁹ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
B : Type u_3
inst✝⁸ : Category.{u_4, u_3} B
U : A ⥤ B
inst✝⁷ : HasWeakSheafify J A
inst✝⁶ : HasWeakSheafify J B
inst✝⁵ : (constantSheaf J A).Faithful
inst✝⁴ : (constantSheaf J A).Full
inst✝³ : (constantSheaf J B).Faithful
inst✝² : (constantSheaf J B).Full
inst✝¹ : J.PreservesSheafification U
inst✝ : J.HasSheafCompose U
F : Sheaf J A
x✝ : Cᵒᵖ
⊢ U.map ((toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝) ≫
      U.map (((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝) ≫
        U.map ((sheafifyLift J (𝟙 F.val) ⋯).app x✝) =
    (toSheafify J ((const Cᵒᵖ).obj (U.obj (F.val.obj (op t)))) ≫
          sheafifyLift J ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ⋯).app
      x✝
state_after: no goals
tactic: simp only [toSheafify_sheafifyLift, ← Functor.map_comp, ← NatTrans.comp_app,
    sheafifyMap_sheafifyLift, Category.comp_id,
    constantPresheafAdj, comp_obj, evaluation_obj_obj, id_obj, op_unop,
    mkOfUnitCounit_counit, Functor.comp_map]