Theorem: CategoryTheory.Sheaf.constantCommuteComposeApp_comp_counit
File: Mathlib/CategoryTheory/Sites/Discrete.lean

Proof steps:
state_before: C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ ((constantCommuteCompose J U).app (F.val.obj (op t))).hom ≫
      (constantSheafAdj J B ht).counit.app ((sheafCompose J U).obj F) =
    (sheafCompose J U).map ((constantSheafAdj J A ht).counit.app F)
state_after: C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ (presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val ≫
        (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F) =
    (presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)) ≫
          (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F)
tactic: simp only [← Iso.eq_inv_comp, constantSheafAdj_counit_app,
    constantCommuteCompose, flip_obj_obj, sheafToPresheaf_obj, id_obj, NatIso.trans_app, comp_obj,
    whiskeringRight_obj_obj, Iso.trans_inv, Iso.app_inv, isoWhiskerRight_inv, Iso.symm_inv,
    whiskerRight_app, isoWhiskerLeft_inv, whiskerLeft_app, evaluation_obj_obj, Functor.map_comp,
    assoc, sheafCompose_obj_val, ← sheafComposeNatIso_app_counit]
state_before: C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ (presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val ≫
        (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F) =
    (presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)) ≫
          (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F)
state_after: C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ ((presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val) ≫
      (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F) =
    (((presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
          (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
            ((const Cᵒᵖ).obj (F.val.obj (op t)))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))) ≫
      (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F)
tactic: simp only [← assoc]
state_before: C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ ((presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val) ≫
      (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F) =
    (((presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
          (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
            ((const Cᵒᵖ).obj (F.val.obj (op t)))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))) ≫
      (sheafCompose J U).map ((sheafificationAdjunction J A).counit.app F)
state_after: case e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ (presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    ((presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t)))) ≫
      (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
tactic: congr 1
state_before: case e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
⊢ (presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    ((presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t)))) ≫
      (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
state_after: case e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ (presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    ((presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t)))) ≫
      (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
tactic: have : (compConstIso Cᵒᵖ U).hom.app (F.val.obj ⟨t⟩) ≫
      { app := fun Y ↦ (F.val ⋙ U).map (ht.from _).op
        naturality := by intros; simp; rw [← Functor.map_comp, ← Functor.map_comp]; congr; simp } =
      ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) := by ext; simp [constantPresheafAdj]
state_before: case e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ (presheafToSheaf J B).map ((constantPresheafAdj B ht).counit.app (F.val ⋙ U)) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    ((presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t)))) ≫
      (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
state_after: case e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ (presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
      (presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    (presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
tactic: simp only [← this, assoc, Functor.map_comp]
state_before: case e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ (presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
      (presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    (presheafToSheaf J B).map ((compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t))) ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
state_after: case e_a.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ (presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
        ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
      (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
tactic: congr 1
state_before: case e_a.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ (presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
      (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val =
    (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
        ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
      (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))
state_after: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ ((presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val).val =
    ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))).val
tactic: apply Sheaf.hom_ext
state_before: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ ((presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
        (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val).val =
    ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
          ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
        (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))).val
state_after: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ toSheafify J ((const Cᵒᵖ ⋙ (whiskeringRight Cᵒᵖ A B).obj U).obj (F.val.obj (op t))) ≫
      ((presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
          (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val).val =
    toSheafify J ((const Cᵒᵖ ⋙ (whiskeringRight Cᵒᵖ A B).obj U).obj (F.val.obj (op t))) ≫
      ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
            ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
          (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))).val
tactic: apply sheafify_hom_ext _ _ _ ((sheafCompose J U).obj ((presheafToSheaf J A).obj F.val)).cond
state_before: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ toSheafify J ((const Cᵒᵖ ⋙ (whiskeringRight Cᵒᵖ A B).obj U).obj (F.val.obj (op t))) ≫
      ((presheafToSheaf J B).map { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } ≫
          (sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val).val =
    toSheafify J ((const Cᵒᵖ ⋙ (whiskeringRight Cᵒᵖ A B).obj U).obj (F.val.obj (op t))) ≫
      ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
            ((const Cᵒᵖ).obj (F.val.obj (op t))) ≫
          (sheafCompose J U).map ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val))).val
state_after: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((presheafToSheaf J B).map { app := fun Y => U.map (F.val.map (ht.from (unop Y)).op), naturality := ⋯ }).val ≫
        ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val).val =
    toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
            ((const Cᵒᵖ).obj (F.val.obj (op t)))).val ≫
        whiskerRight ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val U
tactic: simp only [sheafCompose_obj_val, instCategorySheaf_comp_val, sheafCompose_map_val, comp_obj,
    whiskeringRight_obj_obj, Functor.comp_map]
state_before: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((presheafToSheaf J B).map { app := fun Y => U.map (F.val.map (ht.from (unop Y)).op), naturality := ⋯ }).val ≫
        ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app F.val).val =
    toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)) ⋙ U) ≫
      ((sheafComposeNatIso J U (sheafificationAdjunction J A) (sheafificationAdjunction J B)).hom.app
            ((const Cᵒᵖ).obj (F.val.obj (op t)))).val ≫
        whiskerRight ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val U
state_after: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ { app := fun Y => U.map (F.val.map (ht.from (unop Y)).op), naturality := ⋯ } ≫ whiskerRight (toSheafify J F.val) U =
    whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      whiskerRight ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val U
tactic: erw [← toSheafify_naturality_assoc, sheafComposeIso_hom_fac, sheafComposeIso_hom_fac_assoc]
state_before: case e_a.e_a.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
⊢ { app := fun Y => U.map (F.val.map (ht.from (unop Y)).op), naturality := ⋯ } ≫ whiskerRight (toSheafify J F.val) U =
    whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
      whiskerRight ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val U
state_after: case e_a.e_a.h.w.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ ({ app := fun Y => U.map (F.val.map (ht.from (unop Y)).op), naturality := ⋯ } ≫
          whiskerRight (toSheafify J F.val) U).app
      x✝ =
    (whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
          whiskerRight ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val U).app
      x✝
tactic: ext
state_before: case e_a.e_a.h.w.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ ({ app := fun Y => U.map (F.val.map (ht.from (unop Y)).op), naturality := ⋯ } ≫
          whiskerRight (toSheafify J F.val) U).app
      x✝ =
    (whiskerRight (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))) U ≫
          whiskerRight ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val U).app
      x✝
state_after: case e_a.e_a.h.w.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ U.map (F.val.map (ht.from (unop x✝)).op ≫ (toSheafify J F.val).app x✝) =
    U.map
      ((toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝ ≫
        ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝)
tactic: simp only [comp_obj, const_obj_obj, NatTrans.comp_app, whiskerRight_app, ← Functor.map_comp]
state_before: case e_a.e_a.h.w.h
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ U.map (F.val.map (ht.from (unop x✝)).op ≫ (toSheafify J F.val).app x✝) =
    U.map
      ((toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝ ≫
        ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝)
state_after: case e_a.e_a.h.w.h.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ F.val.map (ht.from (unop x✝)).op ≫ (toSheafify J F.val).app x✝ =
    (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝ ≫
      ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝
tactic: congr 1
state_before: case e_a.e_a.h.w.h.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ F.val.map (ht.from (unop x✝)).op ≫ (toSheafify J F.val).app x✝ =
    (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝ ≫
      ((presheafToSheaf J A).map ((constantPresheafAdj A ht).counit.app F.val)).val.app x✝
state_after: case e_a.e_a.h.w.h.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ (toSheafify J F.val).app (op t) ≫ (sheafify J F.val).map (ht.from (unop x✝)).op =
    (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝ ≫
      ((presheafToSheaf J A).map { app := fun x => F.val.map (ht.from (unop x)).op, naturality := ⋯ }).val.app x✝
tactic: simp only [constantPresheafAdj, comp_obj, evaluation_obj_obj, id_obj, Opposite.op_unop,
    Adjunction.mkOfUnitCounit_counit, NatTrans.naturality]
state_before: case e_a.e_a.h.w.h.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ (toSheafify J F.val).app (op t) ≫ (sheafify J F.val).map (ht.from (unop x✝)).op =
    (toSheafify J ((const Cᵒᵖ).obj (F.val.obj (op t)))).app x✝ ≫
      ((presheafToSheaf J A).map { app := fun x => F.val.map (ht.from (unop x)).op, naturality := ⋯ }).val.app x✝
state_after: case e_a.e_a.h.w.h.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ (toSheafify J F.val).app (op t) ≫ (sheafify J F.val).map (ht.from (unop x✝)).op =
    ({ app := fun x => F.val.map (ht.from (unop x)).op, naturality := ⋯ } ≫ toSheafify J F.val).app x✝
tactic: erw [← NatTrans.comp_app, ← toSheafify_naturality]
state_before: case e_a.e_a.h.w.h.e_a
C : Type u_1
inst✝¹³ : Category.{u_4, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝¹² : Category.{u_5, 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_6, 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✝ F : Sheaf J A
this :
  (compConstIso Cᵒᵖ U).hom.app (F.val.obj (op t)) ≫
      { app := fun Y => (F.val ⋙ U).map (ht.from (unop Y)).op, naturality := ⋯ } =
    (constantPresheafAdj B ht).counit.app (F.val ⋙ U)
x✝ : Cᵒᵖ
⊢ (toSheafify J F.val).app (op t) ≫ (sheafify J F.val).map (ht.from (unop x✝)).op =
    ({ app := fun x => F.val.map (ht.from (unop x)).op, naturality := ⋯ } ≫ toSheafify J F.val).app x✝
state_after: no goals
tactic: simp only [NatTrans.comp_app, const_obj_obj, NatTrans.naturality]