Theorem: CategoryTheory.Sheaf.adjunctionToTypes_counit_app_val
File: Mathlib/CategoryTheory/Sites/Adjunction.lean

Proof steps:
state_before: C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ ((adjunctionToTypes J adj).counit.app X).val =
    sheafifyLift J ((X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1) ⋯
state_after: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ toSheafify J
        (((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            ((sheafEquivSheafOfTypes J).inverse.obj ((sheafForget J).obj X)))) ≫
      ((adjunctionToTypes J adj).counit.app X).val =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
tactic: apply sheafifyLift_unique
state_before: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ toSheafify J
        (((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            ((sheafEquivSheafOfTypes J).inverse.obj ((sheafForget J).obj X)))) ≫
      ((adjunctionToTypes J adj).counit.app X).val =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
state_after: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ toSheafify J
        (((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            ((sheafEquivSheafOfTypes J).inverse.obj ((sheafForget J).obj X)))) ≫
      (((sheafCompose J (forget D)).associator (sheafEquivSheafOfTypes J).symm.inverse
                  ((sheafEquivSheafOfTypes J).symm.functor ⋙ composeAndSheafify J G)).hom.app
            X).val ≫
        ((whiskerLeft (sheafCompose J (forget D))
                  (whiskerRight (sheafEquivSheafOfTypes J).symm.toAdjunction.counit (composeAndSheafify J G))).app
              X).val ≫
          ((adjunction J adj).counit.app X).val =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
tactic: dsimp only [adjunctionToTypes, Adjunction.comp, NatTrans.comp_app,
    instCategorySheaf_comp_val, instCategorySheaf_id_val]
state_before: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ toSheafify J
        (((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            ((sheafEquivSheafOfTypes J).inverse.obj ((sheafForget J).obj X)))) ≫
      (((sheafCompose J (forget D)).associator (sheafEquivSheafOfTypes J).symm.inverse
                  ((sheafEquivSheafOfTypes J).symm.functor ⋙ composeAndSheafify J G)).hom.app
            X).val ≫
        ((whiskerLeft (sheafCompose J (forget D))
                  (whiskerRight (sheafEquivSheafOfTypes J).symm.toAdjunction.counit (composeAndSheafify J G))).app
              X).val ≫
          ((adjunction J adj).counit.app X).val =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
state_after: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ toSheafify J
        (((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            ((sheafEquivSheafOfTypes J).inverse.obj ((sheafForget J).obj X)))) ≫
      (((sheafCompose J (forget D)).associator (sheafEquivSheafOfTypes J).symm.inverse
                  ((sheafEquivSheafOfTypes J).symm.functor ⋙ composeAndSheafify J G)).hom.app
            X).val ≫
        ((whiskerLeft (sheafCompose J (forget D))
                  (whiskerRight (sheafEquivSheafOfTypes J).symm.toAdjunction.counit (composeAndSheafify J G))).app
              X).val ≫
          sheafifyLift J
            (((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv (X.val ⋙ forget D) X.val).symm (𝟙 (X.val ⋙ forget D))) ⋯ =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
tactic: rw [adjunction_counit_app_val]
state_before: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ toSheafify J
        (((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            ((sheafEquivSheafOfTypes J).inverse.obj ((sheafForget J).obj X)))) ≫
      (((sheafCompose J (forget D)).associator (sheafEquivSheafOfTypes J).symm.inverse
                  ((sheafEquivSheafOfTypes J).symm.functor ⋙ composeAndSheafify J G)).hom.app
            X).val ≫
        ((whiskerLeft (sheafCompose J (forget D))
                  (whiskerRight (sheafEquivSheafOfTypes J).symm.toAdjunction.counit (composeAndSheafify J G))).app
              X).val ≫
          sheafifyLift J
            (((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv (X.val ⋙ forget D) X.val).symm (𝟙 (X.val ⋙ forget D))) ⋯ =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
state_after: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ ((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).map
        ((sheafToPresheaf J (Type (max u₁ v₁))).map
          ((sheafEquivSheafOfTypes J).symm.toAdjunction.counit.app ((sheafCompose J (forget D)).obj X))) ≫
      ((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv (X.val ⋙ forget D) X.val).symm (𝟙 (X.val ⋙ forget D)) =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
tactic: erw [Category.id_comp, sheafifyMap_sheafifyLift, toSheafify_sheafifyLift]
state_before: case a
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
⊢ ((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).map
        ((sheafToPresheaf J (Type (max u₁ v₁))).map
          ((sheafEquivSheafOfTypes J).symm.toAdjunction.counit.app ((sheafCompose J (forget D)).obj X))) ≫
      ((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv (X.val ⋙ forget D) X.val).symm (𝟙 (X.val ⋙ forget D)) =
    (X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1
state_after: case a.w.h.w
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
x✝¹ : Cᵒᵖ
x✝ :
  (forget D).obj
    ((((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            (((sheafEquivSheafOfTypes J).symm.inverse ⋙ (sheafEquivSheafOfTypes J).symm.functor).obj
              ((sheafCompose J (forget D)).obj X)))).obj
      x✝¹)
⊢ ((((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).map
              ((sheafToPresheaf J (Type (max u₁ v₁))).map
                ((sheafEquivSheafOfTypes J).symm.toAdjunction.counit.app ((sheafCompose J (forget D)).obj X))) ≫
            ((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv (X.val ⋙ forget D) X.val).symm (𝟙 (X.val ⋙ forget D))).app
        x✝¹)
      x✝ =
    (((X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1).app x✝¹) x✝
tactic: ext
state_before: case a.w.h.w
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
x✝¹ : Cᵒᵖ
x✝ :
  (forget D).obj
    ((((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            (((sheafEquivSheafOfTypes J).symm.inverse ⋙ (sheafEquivSheafOfTypes J).symm.functor).obj
              ((sheafCompose J (forget D)).obj X)))).obj
      x✝¹)
⊢ ((((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).map
              ((sheafToPresheaf J (Type (max u₁ v₁))).map
                ((sheafEquivSheafOfTypes J).symm.toAdjunction.counit.app ((sheafCompose J (forget D)).obj X))) ≫
            ((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv (X.val ⋙ forget D) X.val).symm (𝟙 (X.val ⋙ forget D))).app
        x✝¹)
      x✝ =
    (((X.1.associator (forget D) G).hom ≫ (Adjunction.whiskerRight Cᵒᵖ adj).counit.app X.1).app x✝¹) x✝
state_after: case a.w.h.w
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
x✝¹ : Cᵒᵖ
x✝ :
  (forget D).obj
    ((((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            (((sheafEquivSheafOfTypes J).symm.inverse ⋙ (sheafEquivSheafOfTypes J).symm.functor).obj
              ((sheafCompose J (forget D)).obj X)))).obj
      x✝¹)
⊢ (G.map (𝟙 ((forget D).obj (X.val.obj x✝¹))) ≫
        G.map (𝟙 ((forget D).obj (X.val.obj x✝¹))) ≫
          𝟙 (G.obj ((forget D).obj (X.val.obj x✝¹))) ≫ adj.counit.app (X.val.obj x✝¹) ≫ 𝟙 (X.val.obj x✝¹))
      x✝ =
    (𝟙 (G.obj ((forget D).obj (X.1.obj x✝¹))) ≫
        𝟙 (G.obj ((forget D).obj (X.1.obj x✝¹))) ≫ adj.counit.app (X.1.obj x✝¹) ≫ 𝟙 (X.val.obj x✝¹))
      x✝
tactic: dsimp [sheafEquivSheafOfTypes, Equivalence.symm, Equivalence.toAdjunction,
    NatIso.ofComponents, Adjunction.whiskerRight, Adjunction.mkOfUnitCounit]
state_before: case a.w.h.w
C : Type u₁
inst✝⁵ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁴ : Category.{v₂, u₂} D
E : Type u_1
inst✝³ : Category.{?u.49535, u_1} E
F : D ⥤ E
G✝ : E ⥤ D
inst✝² : HasWeakSheafify J D
inst✝¹ : ConcreteCategory D
inst✝ : J.HasSheafCompose (forget D)
G : Type (max v₁ u₁) ⥤ D
adj : G ⊣ forget D
X : Sheaf J D
x✝¹ : Cᵒᵖ
x✝ :
  (forget D).obj
    ((((whiskeringRight Cᵒᵖ (Type (max u₁ v₁)) D).obj G).obj
          ((sheafToPresheaf J (Type (max u₁ v₁))).obj
            (((sheafEquivSheafOfTypes J).symm.inverse ⋙ (sheafEquivSheafOfTypes J).symm.functor).obj
              ((sheafCompose J (forget D)).obj X)))).obj
      x✝¹)
⊢ (G.map (𝟙 ((forget D).obj (X.val.obj x✝¹))) ≫
        G.map (𝟙 ((forget D).obj (X.val.obj x✝¹))) ≫
          𝟙 (G.obj ((forget D).obj (X.val.obj x✝¹))) ≫ adj.counit.app (X.val.obj x✝¹) ≫ 𝟙 (X.val.obj x✝¹))
      x✝ =
    (𝟙 (G.obj ((forget D).obj (X.1.obj x✝¹))) ≫
        𝟙 (G.obj ((forget D).obj (X.1.obj x✝¹))) ≫ adj.counit.app (X.1.obj x✝¹) ≫ 𝟙 (X.val.obj x✝¹))
      x✝
state_after: no goals
tactic: simp