Theorem: TopCat.Presheaf.stalkPushforward.comp
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
ℱ : Presheaf C X
f : X ⟶ Y
g : Y ⟶ Z
x : ↑X
⊢ stalkPushforward C (f ≫ g) ℱ x = stalkPushforward C g (f _* ℱ) (f x) ≫ stalkPushforward C f ℱ x
state_after: case ih
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
ℱ : Presheaf C X
f : X ⟶ Y
g : Y ⟶ Z
x : ↑X
U✝ : Opens ↑Z
hxU✝ : (f ≫ g) x ∈ U✝
⊢ ((f ≫ g) _* ℱ).germ ⟨(f ≫ g) x, hxU✝⟩ ≫ stalkPushforward C (f ≫ g) ℱ x =
    ((f ≫ g) _* ℱ).germ ⟨(f ≫ g) x, hxU✝⟩ ≫ stalkPushforward C g (f _* ℱ) (f x) ≫ stalkPushforward C f ℱ x

tactic: simp only [germ, stalkPushforward]
state_before: case ih
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
ℱ : Presheaf C X
f : X ⟶ Y
g : Y ⟶ Z
x : ↑X
U✝ : Opens ↑Z
hxU✝ : (f ≫ g) x ∈ U✝
⊢ ((f ≫ g) _* ℱ).germ ⟨(f ≫ g) x, hxU✝⟩ ≫ stalkPushforward C (f ≫ g) ℱ x =
    ((f ≫ g) _* ℱ).germ ⟨(f ≫ g) x, hxU✝⟩ ≫ stalkPushforward C g (f _* ℱ) (f x) ≫ stalkPushforward C f ℱ x
state_after: case ih
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
ℱ : Presheaf C X
f : X ⟶ Y
g : Y ⟶ Z
x : ↑X
U✝ : Opens ↑Z
hxU✝ : (f ≫ g) x ∈ U✝
⊢ colimit.ι ((OpenNhds.inclusion ((f ≫ g) x)).op ⋙ (f ≫ g) _* ℱ) { unop := { obj := U✝, property := ⋯ } } ≫
      colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso (f ≫ g) x).inv) ℱ) ≫
        colimit.pre (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj ℱ)
          (OpenNhds.map (f ≫ g) x).op =
    colimit.ι ((OpenNhds.inclusion ((f ≫ g) x)).op ⋙ (f ≫ g) _* ℱ) { unop := { obj := U✝, property := ⋯ } } ≫
      (colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso g (f x)).inv) (f _* ℱ)) ≫
          colimit.pre
            (((whiskeringLeft (OpenNhds (f x))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f x)).op).obj (f _* ℱ))
            (OpenNhds.map g (f x)).op) ≫
        colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f x).inv) ℱ) ≫
          colimit.pre (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj ℱ)
            (OpenNhds.map f x).op

tactic: simp only [pushforwardObj_obj, Functor.op_obj, Opens.map_comp_obj, whiskeringLeft_obj_obj,
  OpenNhds.inclusionMapIso_inv, NatTrans.op_id, colim_map, ι_colimMap_assoc, Functor.comp_obj,
  OpenNhds.inclusion_obj, OpenNhds.map_obj, whiskerRight_app, NatTrans.id_app,
  CategoryTheory.Functor.map_id, colimit.ι_pre, Category.id_comp, Category.assoc,
  pushforwardObj_map, Functor.op_map, unop_id, op_id, colimit.ι_pre_assoc]
state_before: case ih
C : Type u
inst✝¹ : Category.{v, u} C
inst✝ : HasColimits C
X Y Z : TopCat
ℱ : Presheaf C X
f : X ⟶ Y
g : Y ⟶ Z
x : ↑X
U✝ : Opens ↑Z
hxU✝ : (f ≫ g) x ∈ U✝
⊢ colimit.ι ((OpenNhds.inclusion ((f ≫ g) x)).op ⋙ (f ≫ g) _* ℱ) { unop := { obj := U✝, property := ⋯ } } ≫
      colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso (f ≫ g) x).inv) ℱ) ≫
        colimit.pre (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj ℱ)
          (OpenNhds.map (f ≫ g) x).op =
    colimit.ι ((OpenNhds.inclusion ((f ≫ g) x)).op ⋙ (f ≫ g) _* ℱ) { unop := { obj := U✝, property := ⋯ } } ≫
      (colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso g (f x)).inv) (f _* ℱ)) ≫
          colimit.pre
            (((whiskeringLeft (OpenNhds (f x))ᵒᵖ (Opens ↑Y)ᵒᵖ C).obj (OpenNhds.inclusion (f x)).op).obj (f _* ℱ))
            (OpenNhds.map g (f x)).op) ≫
        colim.map (whiskerRight (NatTrans.op (OpenNhds.inclusionMapIso f x).inv) ℱ) ≫
          colimit.pre (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj ℱ)
            (OpenNhds.map f x).op
state_after: no goals