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

tactic: ext
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
⊢ (f _* 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 (f _* F)) j✝ ≫
      (f _* F).stalkSpecializes ⋯ ≫ stalkPushforward C f F x =
    colimit.ι (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj (f _* F)) j✝ ≫
      stalkPushforward C f F y ≫ 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 (f _* F)) j✝ ≫
      (f _* F).stalkSpecializes ⋯ ≫ stalkPushforward C f F x =
    colimit.ι (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj (f _* 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 (f _* F)) j✝ ≫
      (f _* 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 (f _* 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: 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))ᵒᵖ
⊢ colimit.ι (((whiskeringLeft (OpenNhds (f y))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f y)).op).obj (f _* F)) j✝ ≫
      (f _* 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 (f _* 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
        { unop := { obj := j✝.unop.obj, property := ⋯ } } ≫
      colimit.ι (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F)
        ((OpenNhds.map f x).op.obj { unop := { obj := j✝.unop.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) { unop := { obj := U.unop.obj, property := ⋯ } },
                    naturality := ⋯ } }).ι.app
        j✝

tactic: rfl
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
        { unop := { obj := j✝.unop.obj, property := ⋯ } } ≫
      colimit.ι (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F)
        ((OpenNhds.map f x).op.obj { unop := { obj := j✝.unop.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) { unop := { obj := U.unop.obj, property := ⋯ } },
                    naturality := ⋯ } }).ι.app
        j✝
state_after: no goals