Documentation

Mathlib.Topology.Sheaves.Stalks

Stalks #

For a presheaf F on a topological space X, valued in some category C, the stalk of F at the point x : X is defined as the colimit of the composition of the inclusion of categories (OpenNhds x)ᵒᵖ ⥤ (Opens X)ᵒᵖ and the functor F : (Opens X)ᵒᵖ ⥤ C. For an open neighborhood U of x, we define the map F.germ x : F.obj (op U) ⟶ F.stalk x as the canonical morphism into this colimit.

Taking stalks is functorial: For every point x : X we define a functor stalkFunctor C x, sending presheaves on X to objects of C. Furthermore, for a map f : X ⟶ Y between topological spaces, we define stalkPushforward as the induced map on the stalks (f _* ℱ).stalk (f x) ⟶ ℱ.stalk x.

Some lemmas about stalks and germs only hold for certain classes of concrete categories. A basic property of forgetful functors of categories of algebraic structures (like MonCat, CommRingCat,...) is that they preserve filtered colimits. Since stalks are filtered colimits, this ensures that the stalks of presheaves valued in these categories behave exactly as for Type-valued presheaves. For example, in germ_exist we prove that in such a category, every element of the stalk is the germ of a section.

Furthermore, if we require the forgetful functor to reflect isomorphisms and preserve limits (as is the case for most algebraic structures), we have access to the unique gluing API and can prove further properties. Most notably, in is_iso_iff_stalk_functor_map_iso, we prove that in such a category, a morphism of sheaves is an isomorphism if and only if all of its stalk maps are isomorphisms.

See also the definition of "algebraic structures" in the stacks project: https://stacks.math.columbia.edu/tag/007L

Stalks are functorial with respect to morphisms of presheaves over a fixed X.

Equations
  • One or more equations did not get rendered due to their size.
Instances For

    The stalk of a presheaf F at a point x is calculated as the colimit of the functor nbhds x ⥤ opens F.X ⥤ C

    Equations
    Instances For
      def TopCat.Presheaf.germ {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} (x : U) :
      F.obj { unop := U } F.stalk x

      The germ of a section of a presheaf over an open at a point of that open.

      Equations
      Instances For
        theorem TopCat.Presheaf.germ_res {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {V : TopologicalSpace.Opens X} (i : U V) (x : U) :
        CategoryTheory.CategoryStruct.comp (F.map i.op) (F.germ x) = F.germ ((fun (x : U) => x, ) x)
        theorem TopCat.Presheaf.germ_res_apply {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {V : TopologicalSpace.Opens X} (i : U V) (x : U) [CategoryTheory.ConcreteCategory C] (s : (CategoryTheory.forget C).obj (F.obj { unop := V })) :
        (F.germ x) ((F.map i.op) s) = (F.germ ((fun (x : U) => x, ) x)) s
        theorem TopCat.Presheaf.stalk_hom_ext {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {x : X} {Y : C} {f₁ : F.stalk x Y} {f₂ : F.stalk x Y} (ih : ∀ (U : TopologicalSpace.Opens X) (hxU : x U), CategoryTheory.CategoryStruct.comp (F.germ x, hxU) f₁ = CategoryTheory.CategoryStruct.comp (F.germ x, hxU) f₂) :
        f₁ = f₂

        A morphism from the stalk of F at x to some object Y is completely determined by its composition with the germ morphisms.

        @[simp]
        theorem TopCat.Presheaf.stalkFunctor_map_germ_apply {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} {F : TopCat.Presheaf C X} {G : TopCat.Presheaf C X} (U : TopologicalSpace.Opens X) (x : U) (f : F G) [inst : CategoryTheory.ConcreteCategory C] (x : (CategoryTheory.forget C).obj (((TopologicalSpace.OpenNhds.inclusion x✝).op.comp F).obj { unop := { obj := U, property := } })) :
        (CategoryTheory.Limits.colimMap (CategoryTheory.whiskerLeft (TopologicalSpace.OpenNhds.inclusion x✝).op f)) ((CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion x✝).op.comp F) { unop := { obj := U, property := } }) x) = (CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion x✝).op.comp G) { unop := { obj := U, property := } }) ((f.app { unop := U }) x)
        def TopCat.Presheaf.stalkPushforward (C : Type u) [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} {Y : TopCat} (f : X Y) (F : TopCat.Presheaf C X) (x : X) :
        (f _* F).stalk (f x) F.stalk x

        For a presheaf F on a space X, a continuous map f : X ⟶ Y induces a morphisms between the stalk of f _ * F at f x and the stalk of F at x.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For

          The morphism ℱ_{f x} ⟶ (f⁻¹ℱ)ₓ that factors through (f_*f⁻¹ℱ)_{f x}.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            def TopCat.Presheaf.germToPullbackStalk (C : Type u) [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} {Y : TopCat} (f : X Y) (F : TopCat.Presheaf C Y) (U : TopologicalSpace.Opens X) (x : U) :
            (TopCat.Presheaf.pullbackObj f F).obj { unop := U } F.stalk (f x)

            The morphism (f⁻¹ℱ)(U) ⟶ ℱ_{f(x)} for some U ∋ x.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For

              The morphism (f⁻¹ℱ)ₓ ⟶ ℱ_{f(x)}.

              Equations
              • One or more equations did not get rendered due to their size.
              Instances For

                The isomorphism ℱ_{f(x)} ≅ (f⁻¹ℱ)ₓ.

                Equations
                Instances For
                  noncomputable def TopCat.Presheaf.stalkSpecializes {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {x : X} {y : X} (h : x y) :
                  F.stalk y F.stalk x

                  If x specializes to y, then there is a natural map F.stalk y ⟶ F.stalk x.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    @[simp]
                    theorem TopCat.Presheaf.germ_stalkSpecializes_assoc {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {y : U} {x : X} (h : x y) {Z : C} (h : F.stalk x Z) :
                    theorem TopCat.Presheaf.germ_stalkSpecializes_apply {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {y : U} {x : X} (h : x✝ y) [inst : CategoryTheory.ConcreteCategory C] (x : (CategoryTheory.forget C).obj (((TopologicalSpace.OpenNhds.inclusion y).op.comp F).obj { unop := { obj := U, property := } })) :
                    (CategoryTheory.Limits.colimit.desc ((TopologicalSpace.OpenNhds.inclusion y).op.comp F) { pt := (TopCat.Presheaf.stalkFunctor C x✝).toPrefunctor.1 F, ι := { app := fun (U_1 : (TopologicalSpace.OpenNhds y)ᵒᵖ) => CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion x✝).op.comp F) { unop := { obj := U_1.unop.obj, property := } }, naturality := } }) ((CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion y).op.comp F) { unop := { obj := U, property := } }) x) = (CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion x✝).op.comp F) { unop := { obj := U, property := } }) x
                    @[simp]
                    theorem TopCat.Presheaf.germ_stalkSpecializes {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {y : U} {x : X} (h : x y) :
                    CategoryTheory.CategoryStruct.comp (F.germ y) (F.stalkSpecializes h) = F.germ x,
                    theorem TopCat.Presheaf.germ_stalkSpecializes'_assoc {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {x : X} {y : X} (h : x y) (hy : y U) {Z : C} (h : F.stalk x Z) :
                    CategoryTheory.CategoryStruct.comp (F.germ y, hy) (CategoryTheory.CategoryStruct.comp (F.stalkSpecializes h✝) h) = CategoryTheory.CategoryStruct.comp (F.germ x, ) h
                    theorem TopCat.Presheaf.germ_stalkSpecializes'_apply {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {x : X} {y : X} (h : x✝ y) (hy : y U) [inst : CategoryTheory.ConcreteCategory C] (x : (CategoryTheory.forget C).obj (((TopologicalSpace.OpenNhds.inclusion y).op.comp F).obj { unop := { obj := U, property := } })) :
                    (CategoryTheory.Limits.colimit.desc ((TopologicalSpace.OpenNhds.inclusion y).op.comp F) { pt := (TopCat.Presheaf.stalkFunctor C x✝).toPrefunctor.1 F, ι := { app := fun (U : (TopologicalSpace.OpenNhds y)ᵒᵖ) => CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion x✝).op.comp F) { unop := { obj := U.unop.obj, property := } }, naturality := } }) ((CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion y).op.comp F) { unop := { obj := U, property := } }) x) = (CategoryTheory.Limits.colimit.ι ((TopologicalSpace.OpenNhds.inclusion x✝).op.comp F) { unop := { obj := U, property := } }) x
                    theorem TopCat.Presheaf.germ_stalkSpecializes' {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {x : X} {y : X} (h : x y) (hy : y U) :
                    CategoryTheory.CategoryStruct.comp (F.germ y, hy) (F.stalkSpecializes h) = F.germ x,
                    @[simp]
                    theorem TopCat.Presheaf.stalkSpecializes_comp_assoc {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {x : X} {y : X} {z : X} (h : x y) (h' : y z) {Z : C} (h : F.stalk x Z) :
                    CategoryTheory.CategoryStruct.comp (F.stalkSpecializes h') (CategoryTheory.CategoryStruct.comp (F.stalkSpecializes h✝) h) = CategoryTheory.CategoryStruct.comp (F.stalkSpecializes ) h
                    @[simp]
                    theorem TopCat.Presheaf.stalkSpecializes_comp_apply {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {x : X} {y : X} {z : X} (h : x✝ y) (h' : y z) [inst : CategoryTheory.ConcreteCategory C] (x : (CategoryTheory.forget C).obj (F.stalk z)) :
                    (F.stalkSpecializes h) ((F.stalkSpecializes h') x) = (F.stalkSpecializes ) x
                    @[simp]
                    theorem TopCat.Presheaf.stalkSpecializes_comp {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} (F : TopCat.Presheaf C X) {x : X} {y : X} {z : X} (h : x y) (h' : y z) :
                    CategoryTheory.CategoryStruct.comp (F.stalkSpecializes h') (F.stalkSpecializes h) = F.stalkSpecializes
                    @[simp]
                    theorem TopCat.Presheaf.stalkSpecializes_stalkFunctor_map_apply {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} {F : TopCat.Presheaf C X} {G : TopCat.Presheaf C X} (f : F G) {x : X} {y : X} (h : x✝ y) [inst : CategoryTheory.ConcreteCategory C] (x : (CategoryTheory.forget C).obj (F.stalk y)) :
                    ((TopCat.Presheaf.stalkFunctor C x✝).map f) ((F.stalkSpecializes h) x) = (G.stalkSpecializes h) (((TopCat.Presheaf.stalkFunctor C y).map f) x)
                    theorem TopCat.Presheaf.stalkSpecializes_stalkPushforward_apply {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} {Y : TopCat} (f : X Y) (F : TopCat.Presheaf C X) {x : X} {y : X} (h : x✝ y) [inst : CategoryTheory.ConcreteCategory C] (x : (CategoryTheory.forget C).obj ((f _* F).stalk (f y))) :
                    (TopCat.Presheaf.stalkPushforward C f F x✝) (((f _* F).stalkSpecializes ) x) = (CategoryTheory.CategoryStruct.comp (TopCat.Presheaf.stalkPushforward C f F y) (F.stalkSpecializes h)) x
                    @[simp]
                    theorem TopCat.Presheaf.stalkCongr_inv {X : TopCat} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] [CategoryTheory.Limits.HasColimits C] (F : TopCat.Presheaf C X) {x : X} {y : X} (e : Inseparable x y) :
                    (F.stalkCongr e).inv = F.stalkSpecializes
                    @[simp]
                    theorem TopCat.Presheaf.stalkCongr_hom {X : TopCat} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] [CategoryTheory.Limits.HasColimits C] (F : TopCat.Presheaf C X) {x : X} {y : X} (e : Inseparable x y) :
                    (F.stalkCongr e).hom = F.stalkSpecializes
                    def TopCat.Presheaf.stalkCongr {X : TopCat} {C : Type u_1} [CategoryTheory.Category.{u_2, u_1} C] [CategoryTheory.Limits.HasColimits C] (F : TopCat.Presheaf C X) {x : X} {y : X} (e : Inseparable x y) :
                    F.stalk x F.stalk y

                    The stalks are isomorphic on inseparable points

                    Equations
                    • F.stalkCongr e = { hom := F.stalkSpecializes , inv := F.stalkSpecializes , hom_inv_id := , inv_hom_id := }
                    Instances For
                      theorem TopCat.Presheaf.germ_ext {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} [CategoryTheory.ConcreteCategory C] (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {V : TopologicalSpace.Opens X} {x : X} {hxU : x U} {hxV : x V} (W : TopologicalSpace.Opens X) (hxW : x W) (iWU : W U) (iWV : W V) {sU : (CategoryTheory.forget C).obj (F.obj { unop := U })} {sV : (CategoryTheory.forget C).obj (F.obj { unop := V })} (ih : (F.map iWU.op) sU = (F.map iWV.op) sV) :
                      (F.germ x, hxU) sU = (F.germ x, hxV) sV

                      For presheaves valued in a concrete category whose forgetful functor preserves filtered colimits, every element of the stalk is the germ of a section.

                      theorem TopCat.Presheaf.germ_eq {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} [CategoryTheory.ConcreteCategory C] [CategoryTheory.Limits.PreservesFilteredColimits (CategoryTheory.forget C)] (F : TopCat.Presheaf C X) {U : TopologicalSpace.Opens X} {V : TopologicalSpace.Opens X} (x : X) (mU : x U) (mV : x V) (s : (CategoryTheory.forget C).obj (F.obj { unop := U })) (t : (CategoryTheory.forget C).obj (F.obj { unop := V })) (h : (F.germ x, mU) s = (F.germ x, mV) t) :
                      ∃ (W : TopologicalSpace.Opens X) (_ : x W) (iU : W U) (iV : W V), (F.map iU.op) s = (F.map iV.op) t
                      theorem TopCat.Presheaf.section_ext {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} [CategoryTheory.ConcreteCategory C] [CategoryTheory.Limits.PreservesFilteredColimits (CategoryTheory.forget C)] [CategoryTheory.Limits.HasLimits C] [CategoryTheory.Limits.PreservesLimits (CategoryTheory.forget C)] [(CategoryTheory.forget C).ReflectsIsomorphisms] (F : TopCat.Sheaf C X) (U : TopologicalSpace.Opens X) (s : (CategoryTheory.forget C).obj (F.val.obj { unop := U })) (t : (CategoryTheory.forget C).obj (F.val.obj { unop := U })) (h : ∀ (x : U), (F.presheaf.germ x) s = (F.presheaf.germ x) t) :
                      s = t

                      Let F be a sheaf valued in a concrete category, whose forgetful functor reflects isomorphisms, preserves limits and filtered colimits. Then two sections who agree on every stalk must be equal.

                      theorem TopCat.Presheaf.app_surjective_of_injective_of_locally_surjective {C : Type u} [CategoryTheory.Category.{v, u} C] [CategoryTheory.Limits.HasColimits C] {X : TopCat} [CategoryTheory.ConcreteCategory C] [CategoryTheory.Limits.PreservesFilteredColimits (CategoryTheory.forget C)] [CategoryTheory.Limits.HasLimits C] [CategoryTheory.Limits.PreservesLimits (CategoryTheory.forget C)] [(CategoryTheory.forget C).ReflectsIsomorphisms] {F : TopCat.Sheaf C X} {G : TopCat.Sheaf C X} (f : F G) (U : TopologicalSpace.Opens X) (hinj : ∀ (x : U), Function.Injective ((TopCat.Presheaf.stalkFunctor C x).map f.val)) (hsurj : ∀ (t : (CategoryTheory.forget C).obj (G.val.obj { unop := U })) (x : U), ∃ (V : TopologicalSpace.Opens X) (_ : x V) (iVU : V U) (s : (CategoryTheory.forget C).obj (F.val.obj { unop := V })), (f.val.app { unop := V }) s = (G.val.map iVU.op) t) :
                      Function.Surjective (f.val.app { unop := U })

                      For surjectivity, we are given an arbitrary section t and need to find a preimage for it. We claim that it suffices to find preimages locally. That is, for each x : U we construct a neighborhood V ≤ U and a section s : F.obj (op V)) such that f.app (op V) s and t agree on V.

                      Let F and G be sheaves valued in a concrete category, whose forgetful functor reflects isomorphisms, preserves limits and filtered colimits. Then if the stalk maps of a morphism f : F ⟶ G are all isomorphisms, f must be an isomorphism.

                      Let F and G be sheaves valued in a concrete category, whose forgetful functor reflects isomorphisms, preserves limits and filtered colimits. Then a morphism f : F ⟶ G is an isomorphism if and only if all of its stalk maps are isomorphisms.

                      instance TopCat.Presheaf.algebra_section_stalk {X : TopCat} (F : TopCat.Presheaf CommRingCat X) {U : TopologicalSpace.Opens X} (x : U) :
                      Algebra (F.obj { unop := U }) (F.stalk x)
                      Equations
                      @[simp]
                      theorem TopCat.Presheaf.stalk_open_algebraMap {X : TopCat} (F : TopCat.Presheaf CommRingCat X) {U : TopologicalSpace.Opens X} (x : U) :
                      algebraMap (F.obj { unop := U }) (F.stalk x) = F.germ x