Theorem: CategoryTheory.Functor.toSheafify_pullbackSheafificationCompatibility
File: Mathlib/CategoryTheory/Sites/CoverLifting.lean

tactic: dsimp [pushforwardContinuousSheafificationCompatibility]
state_before: C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ toSheafify J (G.op ⋙ F) ≫ ((G.pushforwardContinuousSheafificationCompatibility A J K).hom.app F).val =
    whiskerLeft G.op (toSheafify K F)
state_after: C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ toSheafify J (G.op ⋙ F) ≫
      ((((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).leftAdjointUniq
                ((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K))).hom.app
          F).val =
    whiskerLeft G.op (toSheafify K F)

tactic: simp only [Adjunction.leftAdjointUniq, Iso.symm_hom, Adjunction.natIsoEquiv_apply_inv,
  Iso.refl_inv, Adjunction.natTransEquiv_apply_app, comp_obj, whiskeringLeft_obj_obj,
  sheafToPresheaf_obj, whiskerLeft_id', Category.comp_id, comp_map, whiskeringLeft_obj_map,
  Sheaf.instCategorySheaf_comp_val]
state_before: C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ toSheafify J (G.op ⋙ F) ≫
      ((((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).leftAdjointUniq
                ((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K))).hom.app
          F).val =
    whiskerLeft G.op (toSheafify K F)
state_after: C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ toSheafify J (G.op ⋙ F) ≫
      ((presheafToSheaf J A).map
            (whiskerLeft G.op
              (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
        (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
            ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val =
    whiskerLeft G.op (toSheafify K F)

tactic: apply Quiver.Hom.op_inj
state_before: C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ toSheafify J (G.op ⋙ F) ≫
      ((presheafToSheaf J A).map
            (whiskerLeft G.op
              (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
        (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
            ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val =
    whiskerLeft G.op (toSheafify K F)
state_after: case a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ (toSheafify J (G.op ⋙ F) ≫
        ((presheafToSheaf J A).map
              (whiskerLeft G.op
                (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
          (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
              ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val).op =
    (whiskerLeft G.op (toSheafify K F)).op

tactic: apply coyoneda.map_injective
state_before: case a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ (toSheafify J (G.op ⋙ F) ≫
        ((presheafToSheaf J A).map
              (whiskerLeft G.op
                (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
          (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
              ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val).op =
    (whiskerLeft G.op (toSheafify K F)).op
state_after: case a.a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ coyoneda.map
      (toSheafify J (G.op ⋙ F) ≫
          ((presheafToSheaf J A).map
                (whiskerLeft G.op
                  (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
            (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
                ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val).op =
    coyoneda.map (whiskerLeft G.op (toSheafify K F)).op

tactic: ext E : 2
state_before: case a.a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
⊢ coyoneda.map
      (toSheafify J (G.op ⋙ F) ≫
          ((presheafToSheaf J A).map
                (whiskerLeft G.op
                  (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
            (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
                ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val).op =
    coyoneda.map (whiskerLeft G.op (toSheafify K F)).op
state_after: case a.a.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
⊢ (coyoneda.map
          (toSheafify J (G.op ⋙ F) ≫
              ((presheafToSheaf J A).map
                    (whiskerLeft G.op
                      (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
                (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
                    ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val).op).app
      E =
    (coyoneda.map (whiskerLeft G.op (toSheafify K F)).op).app E

tactic: dsimp [Functor.preimage, Coyoneda.preimage, coyoneda, Adjunction.comp]
state_before: case a.a.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
⊢ (coyoneda.map
          (toSheafify J (G.op ⋙ F) ≫
              ((presheafToSheaf J A).map
                    (whiskerLeft G.op
                      (((sheafificationAdjunction K A).comp (G.sheafAdjunctionCocontinuous A J K)).unit.app F))).val ≫
                (((Ran.adjunction A G.op).comp (sheafificationAdjunction J A)).counit.app
                    ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val).op).app
      E =
    (coyoneda.map (whiskerLeft G.op (toSheafify K F)).op).app E
state_after: case a.a.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
⊢ (fun g =>
      (toSheafify J (G.op ⋙ F) ≫
          ((presheafToSheaf J A).map
                (whiskerLeft G.op (toSheafify K F) ≫
                  whiskerLeft G.op ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val) ≫
                    𝟙
                      (G.op ⋙
                        ((G.sheafPushforwardCocontinuous A J K).obj
                            ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val))).val ≫
            𝟙
                ((presheafToSheaf J A).obj
                    (G.op ⋙
                      (ran G.op).obj
                        ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val)).val ≫
              ((presheafToSheaf J A).map
                    ((Ran.adjunction A G.op).counit.app
                      ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val)).val ≫
                ((sheafificationAdjunction J A).counit.app
                    ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val) ≫
        g) =
    fun g => whiskerLeft G.op (toSheafify K F) ≫ g

tactic: simp only [Category.comp_id, map_id, whiskerLeft_id', map_comp, Sheaf.instCategorySheaf_comp_val,
  sheafificationAdjunction_counit_app_val, sheafifyMap_sheafifyLift,
  Category.id_comp, Category.assoc, toSheafify_sheafifyLift]
state_before: case a.a.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
⊢ (fun g =>
      (toSheafify J (G.op ⋙ F) ≫
          ((presheafToSheaf J A).map
                (whiskerLeft G.op (toSheafify K F) ≫
                  whiskerLeft G.op ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val) ≫
                    𝟙
                      (G.op ⋙
                        ((G.sheafPushforwardCocontinuous A J K).obj
                            ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val))).val ≫
            𝟙
                ((presheafToSheaf J A).obj
                    (G.op ⋙
                      (ran G.op).obj
                        ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val)).val ≫
              ((presheafToSheaf J A).map
                    ((Ran.adjunction A G.op).counit.app
                      ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val)).val ≫
                ((sheafificationAdjunction J A).counit.app
                    ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F))).val) ≫
        g) =
    fun g => whiskerLeft G.op (toSheafify K F) ≫ g
state_after: case a.a.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
⊢ (fun g =>
      whiskerLeft G.op (toSheafify K F) ≫
        whiskerLeft G.op ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val) ≫
          (Ran.adjunction A G.op).counit.app
              ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ≫
            g) =
    fun g => whiskerLeft G.op (toSheafify K F) ≫ g

tactic: ext t s : 3
state_before: case a.a.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
⊢ (fun g =>
      whiskerLeft G.op (toSheafify K F) ≫
        whiskerLeft G.op ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val) ≫
          (Ran.adjunction A G.op).counit.app
              ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ≫
            g) =
    fun g => whiskerLeft G.op (toSheafify K F) ≫ g
state_after: case a.a.w.h.h.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ (whiskerLeft G.op (toSheafify K F) ≫
          whiskerLeft G.op ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val) ≫
            (Ran.adjunction A G.op).counit.app
                ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ≫
              t).app
      s =
    (whiskerLeft G.op (toSheafify K F) ≫ t).app s

tactic: dsimp [sheafPushforwardContinuous]
state_before: case a.a.w.h.h.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ (whiskerLeft G.op (toSheafify K F) ≫
          whiskerLeft G.op ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val) ≫
            (Ran.adjunction A G.op).counit.app
                ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ≫
              t).app
      s =
    (whiskerLeft G.op (toSheafify K F) ≫ t).app s
state_after: case a.a.w.h.h.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ (toSheafify K F).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
        ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s ≫ t.app s =
    (toSheafify K F).app { unop := G.obj s.unop } ≫ t.app s

tactic: congr 1
state_before: case a.a.w.h.h.w.h
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ (toSheafify K F).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
        ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s ≫ t.app s =
    (toSheafify K F).app { unop := G.obj s.unop } ≫ t.app s
state_after: case a.a.w.h.h.w.h.e_a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s ≫ t.app s =
    t.app s

tactic: simp only [← Category.assoc]
state_before: case a.a.w.h.h.w.h.e_a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s ≫ t.app s =
    t.app s
state_after: case a.a.w.h.h.w.h.e_a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ (((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
        ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s) ≫
      t.app s =
    t.app s

tactic: convert Category.id_comp (obj := A) _
state_before: case a.a.w.h.h.w.h.e_a
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ (((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
        ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s) ≫
      t.app s =
    t.app s
state_after: case h.e'_2.h.h.e'_6
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s =
    𝟙 (((presheafToSheaf K A).obj F).val.obj { unop := G.obj s.unop })

tactic: have := (Ran.adjunction A G.op).left_triangle
state_before: case h.e'_2.h.h.e'_6
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s =
    𝟙 (((presheafToSheaf K A).obj F).val.obj { unop := G.obj s.unop })
state_after: case h.e'_2.h.h.e'_6
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
this :
  whiskerRight (Ran.adjunction A G.op).unit ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) ≫
      whiskerLeft ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) (Ran.adjunction A G.op).counit =
    𝟙 (𝟭 (Dᵒᵖ ⥤ A) ⋙ (whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op)
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s =
    𝟙 (((presheafToSheaf K A).obj F).val.obj { unop := G.obj s.unop })

tactic: apply_fun (fun e => (e.app (sheafify K F)).app s) at this
state_before: case h.e'_2.h.h.e'_6
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
this :
  whiskerRight (Ran.adjunction A G.op).unit ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) ≫
      whiskerLeft ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) (Ran.adjunction A G.op).counit =
    𝟙 (𝟭 (Dᵒᵖ ⥤ A) ⋙ (whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op)
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s =
    𝟙 (((presheafToSheaf K A).obj F).val.obj { unop := G.obj s.unop })
state_after: case h.e'_2.h.h.e'_6
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
this :
  ((whiskerRight (Ran.adjunction A G.op).unit ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) ≫
              whiskerLeft ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) (Ran.adjunction A G.op).counit).app
          (sheafify K F)).app
      s =
    ((𝟙 (𝟭 (Dᵒᵖ ⥤ A) ⋙ (whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op)).app (sheafify K F)).app s
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s =
    𝟙 (((presheafToSheaf K A).obj F).val.obj { unop := G.obj s.unop })

tactic: exact this
state_before: case h.e'_2.h.h.e'_6
C : Type u_1
D : Type u_2
inst✝⁸ : Category.{u_4, u_1} C
inst✝⁷ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝⁶ : Category.{w', w} A
inst✝⁵ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝⁴ : G.IsCocontinuous J K
inst✝³ : HasWeakSheafify J A
inst✝² : HasWeakSheafify K A
inst✝¹ : G.IsCocontinuous J K
inst✝ : G.IsContinuous J K
F : Dᵒᵖ ⥤ A
E : Cᵒᵖ ⥤ A
t : ((G.sheafPushforwardContinuous A J K).obj ((presheafToSheaf K A).obj F)).val ⟶ E
s : Cᵒᵖ
this :
  ((whiskerRight (Ran.adjunction A G.op).unit ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) ≫
              whiskerLeft ((whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op) (Ran.adjunction A G.op).counit).app
          (sheafify K F)).app
      s =
    ((𝟙 (𝟭 (Dᵒᵖ ⥤ A) ⋙ (whiskeringLeft Cᵒᵖ Dᵒᵖ A).obj G.op)).app (sheafify K F)).app s
⊢ ((Ran.adjunction A G.op).unit.app ((presheafToSheaf K A).obj F).val).app { unop := G.obj s.unop } ≫
      ((Ran.adjunction A G.op).counit.app (G.op ⋙ ((presheafToSheaf K A).obj F).val)).app s =
    𝟙 (((presheafToSheaf K A).obj F).val.obj { unop := G.obj s.unop })
state_after: no goals