Theorem: CategoryTheory.constantSheafAdj_counit_app
File: Mathlib/CategoryTheory/Sites/ConstantSheaf.lean

Proof steps:
state_before: C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ (constantSheafAdj J D hT).counit.app F =
    (presheafToSheaf J D).map ((constantPresheafAdj D hT).counit.app F.val) ≫
      (sheafificationAdjunction J D).counit.app F
state_after: case h
C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ ((constantSheafAdj J D hT).counit.app F).val =
    ((presheafToSheaf J D).map ((constantPresheafAdj D hT).counit.app F.val) ≫
        (sheafificationAdjunction J D).counit.app F).val
tactic: apply Sheaf.hom_ext
state_before: case h
C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ ((constantSheafAdj J D hT).counit.app F).val =
    ((presheafToSheaf J D).map ((constantPresheafAdj D hT).counit.app F.val) ≫
        (sheafificationAdjunction J D).counit.app F).val
state_after: case h
C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ toSheafify J ((const Cᵒᵖ).obj (((sheafSections J D).obj (op T)).obj F)) ≫
      ((constantSheafAdj J D hT).counit.app F).val =
    toSheafify J ((const Cᵒᵖ).obj (((sheafSections J D).obj (op T)).obj F)) ≫
      ((presheafToSheaf J D).map ((constantPresheafAdj D hT).counit.app F.val) ≫
          (sheafificationAdjunction J D).counit.app F).val
tactic: apply sheafify_hom_ext _ _ _ F.cond
state_before: case h
C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ toSheafify J ((const Cᵒᵖ).obj (((sheafSections J D).obj (op T)).obj F)) ≫
      ((constantSheafAdj J D hT).counit.app F).val =
    toSheafify J ((const Cᵒᵖ).obj (((sheafSections J D).obj (op T)).obj F)) ≫
      ((presheafToSheaf J D).map ((constantPresheafAdj D hT).counit.app F.val) ≫
          (sheafificationAdjunction J D).counit.app F).val
state_after: case h
C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op T))) ≫
      𝟙 ((presheafToSheaf J D).obj ((const Cᵒᵖ).obj (F.val.obj (op T)))).val ≫
        sheafifyLift J { app := fun x => F.val.map (hT.from (unop x)).op, naturality := ⋯ } ⋯ =
    { app := fun x => F.val.map (hT.from (unop x)).op, naturality := ⋯ }
tactic: simp only [flip_obj_obj, sheafToPresheaf_obj, comp_obj, id_obj, constantSheafAdj, Adjunction.comp,
    evaluation_obj_obj, constantPresheafAdj, Opposite.op_unop, Adjunction.mkOfUnitCounit_unit,
    Adjunction.mkOfUnitCounit_counit, NatTrans.comp_app, associator_hom_app, whiskerLeft_app,
    whiskerRight_app, instCategorySheaf_comp_val, instCategorySheaf_id_val,
    sheafificationAdjunction_counit_app_val, sheafifyMap_sheafifyLift, comp_id,
    toSheafify_sheafifyLift]
state_before: case h
C : Type u_1
inst✝² : Category.{u_3, u_1} C
J : GrothendieckTopology C
D : Type u_2
inst✝¹ : Category.{u_4, u_2} D
inst✝ : HasWeakSheafify J D
T : C
hT : IsTerminal T
F : Sheaf J D
⊢ toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op T))) ≫
      𝟙 ((presheafToSheaf J D).obj ((const Cᵒᵖ).obj (F.val.obj (op T)))).val ≫
        sheafifyLift J { app := fun x => F.val.map (hT.from (unop x)).op, naturality := ⋯ } ⋯ =
    { app := fun x => F.val.map (hT.from (unop x)).op, naturality := ⋯ }
state_after: no goals
tactic: erw [id_comp, toSheafify_sheafifyLift]