Theorem: TopCat.Presheaf.stalkSpecializes_stalkPushforward
File: Mathlib/Topology/Sheaves/Stalks.lean

Proof steps:
state_before: C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
⊢ ((pushforward C f).obj F).stalkSpecializes ⋯ ≫ stalkPushforward C f F x =
    stalkPushforward C f F y ≫ F.stalkSpecializes h
state_after: case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
j✝ : (OpenNhds (f y))ᵒᵖ
⊢ colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      ((pushforward C f).obj F).stalkSpecializes ⋯ ≫ stalkPushforward C f F x =
    colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      stalkPushforward C f F y ≫ F.stalkSpecializes h
tactic: ext
state_before: case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
j✝ : (OpenNhds (f y))ᵒᵖ
⊢ colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      ((pushforward C f).obj F).stalkSpecializes ⋯ ≫ stalkPushforward C f F x =
    colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      stalkPushforward C f F y ≫ F.stalkSpecializes h
state_after: case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
j✝ : (OpenNhds (f y))ᵒᵖ
⊢ colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      ((pushforward C f).obj F).stalkSpecializes ⋯ ≫
        colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f x).inv) F) ≫
          colimit.pre (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F)
            (OpenNhds.map f x).op =
    colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      (colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f y).inv) F) ≫
          colimit.pre (((whiskeringLeft (OpenNhds y)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion y).op).obj F)
            (OpenNhds.map f y).op) ≫
        F.stalkSpecializes h
tactic: delta stalkPushforward
state_before: case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
j✝ : (OpenNhds (f y))ᵒᵖ
⊢ colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      ((pushforward C f).obj F).stalkSpecializes ⋯ ≫
        colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f x).inv) F) ≫
          colimit.pre (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F)
            (OpenNhds.map f x).op =
    colimit.ι
        (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj
          ((pushforward C f).obj F))
        j✝ ≫
      (colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f y).inv) F) ≫
          colimit.pre (((whiskeringLeft (OpenNhds y)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion y).op).obj F)
            (OpenNhds.map f y).op) ≫
        F.stalkSpecializes h
state_after: case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
j✝ : (OpenNhds (f y))ᵒᵖ
⊢ (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f x).inv) F).app (op { obj := (unop j✝).obj, property := ⋯ }) ≫
      colimit.ι (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F)
        ((OpenNhds.map f x).op.obj (op { obj := (unop j✝).obj, property := ⋯ })) =
    (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f y).inv) F).app j✝ ≫
      (Cocone.whisker (OpenNhds.map f y).op
              { pt := (stalkFunctor C x).toPrefunctor.1 F,
                ι :=
                  {
                    app := fun U =>
                      colimit.ι ((OpenNhds.inclusion x).op ⋙ F) (op { obj := (unop U).obj, property := ⋯ }),
                    naturality := ⋯ } }).ι.app
        j✝
tactic: simp only [stalkSpecializes, colimit.ι_desc_assoc, colimit.ι_map_assoc, colimit.ι_pre,
    Category.assoc, colimit.pre_desc, colimit.ι_desc]
state_before: case w
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
f : X ⟶ Y
F : Presheaf C X
x y : ↑X
h : x ⤳ y
j✝ : (OpenNhds (f y))ᵒᵖ
⊢ (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f x).inv) F).app (op { obj := (unop j✝).obj, property := ⋯ }) ≫
      colimit.ι (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F)
        ((OpenNhds.map f x).op.obj (op { obj := (unop j✝).obj, property := ⋯ })) =
    (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f y).inv) F).app j✝ ≫
      (Cocone.whisker (OpenNhds.map f y).op
              { pt := (stalkFunctor C x).toPrefunctor.1 F,
                ι :=
                  {
                    app := fun U =>
                      colimit.ι ((OpenNhds.inclusion x).op ⋙ F) (op { obj := (unop U).obj, property := ⋯ }),
                    naturality := ⋯ } }).ι.app
        j✝
state_after: no goals
tactic: rfl