Theorem: CategoryTheory.presheafHom_obj
File: Mathlib/CategoryTheory/Sites/SheafHom.lean

Proof steps:
state_before: C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
⊢ ∀ (X : Cᵒᵖ),
    { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
        (𝟙 X) =
      𝟙
        ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
          X)
state_after: case op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
⊢ { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
          map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
      (𝟙 (op X)) =
    𝟙
      ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
        (op X))
tactic: rintro ⟨X⟩
state_before: case op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
⊢ { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
          map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
      (𝟙 (op X)) =
    𝟙
      ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
        (op X))
state_after: case op.h.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
φ :
  { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
        map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
    (op X)
Y : Over (unop (op X))
⊢ ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
          (𝟙 (op X)) φ).app
      (op Y) =
    (𝟙
          ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
                map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
            (op X))
          φ).app
      (op Y)
tactic: ext φ ⟨Y⟩
state_before: case op.h.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
φ :
  { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
        map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
    (op X)
Y : Over (unop (op X))
⊢ ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
          (𝟙 (op X)) φ).app
      (op Y) =
    (𝟙
          ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
                map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
            (op X))
          φ).app
      (op Y)
state_after: no goals
tactic: simpa [Over.mapId] using φ.naturality ((Over.mapId X).hom.app Y).op
state_before: C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
⊢ ∀ {X Y Z : Cᵒᵖ} (f : X ⟶ Y) (g : Y ⟶ Z),
    { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
        (f ≫ g) =
      { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
          f ≫
        { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
          g
state_after: case op.op.op.op.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
⊢ { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
          map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
      (op f ≫ op g) =
    { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
        (op f) ≫
      { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
        (op g)
tactic: rintro ⟨X⟩ ⟨Y⟩ ⟨Z⟩ ⟨f : Y ⟶ X⟩ ⟨g : Z ⟶ Y⟩
state_before: case op.op.op.op.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
⊢ { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
          map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
      (op f ≫ op g) =
    { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
        (op f) ≫
      { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
            map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
        (op g)
state_after: case op.op.op.op.op.h.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
φ :
  { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
        map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
    (op X)
W : Over (unop (op Z))
⊢ ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
          (op f ≫ op g) φ).app
      (op W) =
    (({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
                  map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
              (op f) ≫
            { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
                  map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
              (op g))
          φ).app
      (op W)
tactic: ext φ ⟨W⟩
state_before: case op.op.op.op.op.h.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X Y Z : C
f : Y ⟶ X
g : Z ⟶ Y
φ :
  { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
        map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.obj
    (op X)
W : Over (unop (op Z))
⊢ ({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
              map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
          (op f ≫ op g) φ).app
      (op W) =
    (({ obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
                  map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
              (op f) ≫
            { obj := fun X => (Over.forget (unop X)).op ⋙ F ⟶ (Over.forget (unop X)).op ⋙ G,
                  map := fun {X Y} f => whiskerLeft (Over.map f.unop).op }.map
              (op g))
          φ).app
      (op W)
state_after: no goals
tactic: simpa [Over.mapComp] using φ.naturality ((Over.mapComp g f).hom.app W).op