Documentation

DerivedAlgGeo.Topology.Sheaves.ModuleTensor.StalkTensor

Stalks and tensor products of presheaves of modules #

Let R be a presheaf of commutative rings on a topological space X, and let M and P be presheaves of R-modules. This file proves

stalkTensorEquiv : Mₓ ⊗[Rₓ] Pₓ ≃ₗ[Rₓ] (M ⊗ P)ₓ,

the statement that taking stalks commutes with the tensor product of presheaves of modules.

Main definitions #

Main results #

Every declaration in this module intrinsically uses the topology of X through open neighbourhoods, germs, or stalk functors. It is therefore the topological comparison root used by DerivedAlgGeo.Topology.Sheaves.ModuleTensor, not ordinary ModuleCat algebra.

Implementation notes #

The backward map starts with tensors of stalk elements, whose representatives may lie over different neighbourhoods. It restricts both representatives to their intersection and descends through two colimits, first via PresheafOfModules.germTmulRight and then via PresheafOfModules.germTmulBiadd. The identity PresheafOfModules.germ_smul expresses compatibility with scalars along the ring germ map; choosing a common neighbourhood for a scalar and both sections then establishes bilinearity over the stalk ring.

References #

The comparison extends Mathlib's module-presheaf stalk and monoidal APIs.

Tags #

module presheaf, stalk, tensor product, naturality

@[reducible, inline]

Mₓ ⊗ Pₓ, the target of the comparison.

Equations
Instances For
    @[reducible]

    Mₓ ⊗ Pₓ viewed over R(U) for a neighbourhood U of x, via the germ map.

    Equations
    Instances For

      The R(U)-bilinear map (m, p) ↦ germ m ⊗ germ p.

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

        Restriction of a section, stated at the plain module type rather than through ModuleCat.restrictScalars. Reducible, so that rw still sees through it.

        Equations
        Instances For

          For a section m of M over U and a section p of P over V, the germ at x of m ⊗ p restricted to U ⊓ V. This is the value the backward map must take on germs.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            theorem PresheafOfModules.germTmul_res_left {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U U' V : TopologicalSpace.Opens ↑X} (h : U' ≤ U) (hxU' : x ∈ U') (hxV : x ∈ V) (m : ↑(M.obj (Opposite.op U))) (p : ↑(P.obj (Opposite.op V))) :
            M.germTmul P x ⋯ hxV m p = M.germTmul P x hxU' hxV ((CategoryTheory.ConcreteCategory.hom (M.map (CategoryTheory.homOfLE h).op)) m) p

            Shrinking the neighbourhood of m does not change the germ of m ⊗ p.

            theorem PresheafOfModules.germTmul_res_right {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U V V' : TopologicalSpace.Opens ↑X} (h : V' ≤ V) (hxU : x ∈ U) (hxV' : x ∈ V') (m : ↑(M.obj (Opposite.op U))) (p : ↑(P.obj (Opposite.op V))) :
            M.germTmul P x hxU ⋯ m p = M.germTmul P x hxU hxV' m ((CategoryTheory.ConcreteCategory.hom (P.map (CategoryTheory.homOfLE h).op)) p)

            Shrinking the neighbourhood of p does not change the germ of m ⊗ p.

            theorem PresheafOfModules.germTmul_congr {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U U' V V' : TopologicalSpace.Opens ↑X} (hxU : x ∈ U) (hxU' : x ∈ U') (hxV : x ∈ V) (hxV' : x ∈ V') (m : ↑(M.obj (Opposite.op U))) (m' : ↑(M.obj (Opposite.op U'))) (p : ↑(P.obj (Opposite.op V))) (p' : ↑(P.obj (Opposite.op V'))) (hm : (CategoryTheory.ConcreteCategory.hom (TopCat.Presheaf.germ M.presheaf U x hxU)) m = (CategoryTheory.ConcreteCategory.hom (TopCat.Presheaf.germ M.presheaf U' x hxU')) m') (hp : (CategoryTheory.ConcreteCategory.hom (TopCat.Presheaf.germ P.presheaf V x hxV)) p = (CategoryTheory.ConcreteCategory.hom (TopCat.Presheaf.germ P.presheaf V' x hxV')) p') :
            M.germTmul P x hxU hxV m p = M.germTmul P x hxU' hxV' m' p'

            PresheafOfModules.germTmul depends only on the two germs, not on the sections representing them.

            theorem PresheafOfModules.germ_smul_germTmul_self {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U : TopologicalSpace.Opens ↑X} (hxU : x ∈ U) (r : ↑(R.obj (Opposite.op U))) (m : ↑(M.obj (Opposite.op U))) (p : ↑(P.obj (Opposite.op U))) :
            (CategoryTheory.ConcreteCategory.hom (R.germ U x hxU)) r • M.germTmul P x hxU hxU m p = M.germTmul P x hxU hxU (r • m) p

            The scalar action on the stalk, over a single neighbourhood: this is the Rₓ-linearity of the backward map, before the three neighbourhoods are separated.

            Rₓ-linearity of PresheafOfModules.germTmul in the M slot, with the scalar, the section of M and the section of P over three different neighbourhoods.

            theorem PresheafOfModules.germTmul_add_left {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U V : TopologicalSpace.Opens ↑X} (hxU : x ∈ U) (hxV : x ∈ V) (m m' : ↑(M.obj (Opposite.op U))) (p : ↑(P.obj (Opposite.op V))) :
            M.germTmul P x hxU hxV (m + m') p = M.germTmul P x hxU hxV m p + M.germTmul P x hxU hxV m' p

            PresheafOfModules.germTmul is additive in the M slot, over a fixed pair of neighbourhoods.

            theorem PresheafOfModules.germTmul_add_right {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U V : TopologicalSpace.Opens ↑X} (hxU : x ∈ U) (hxV : x ∈ V) (m : ↑(M.obj (Opposite.op U))) (p p' : ↑(P.obj (Opposite.op V))) :
            M.germTmul P x hxU hxV m (p + p') = M.germTmul P x hxU hxV m p + M.germTmul P x hxU hxV m p'

            PresheafOfModules.germTmul is additive in the P slot, over a fixed pair of neighbourhoods.

            For a fixed section m of M over U, the germs m ⊗ p form a cocone on the P-diagram: the legs are additive by PresheafOfModules.germTmul_add_right and natural by PresheafOfModules.germTmul_res_right.

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

              The defining computation rule for PresheafOfModules.germTmulRight, which is a CategoryTheory.Limits.colimit.desc and so is pinned down entirely by its values on germs. Every later proof about it goes through here.

              PresheafOfModules.germTmulRight is unchanged by shrinking the neighbourhood of m: the naturality the outer cocone needs, now at the level of the induced morphism rather than of germs.

              The outer cocone, in the M variable: legs additive by PresheafOfModules.germTmulRight_add, natural by PresheafOfModules.germTmulRight_res_left. Its point is the additive maps out of the stalk of P.

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

                Both colimit stages unwound at once. Since every element of a stalk is a germ, this and additivity determine PresheafOfModules.germTmulBiadd completely — it is the only handle the bilinearity and inverse proofs use.

                theorem PresheafOfModules.germ_smul_germTmul_self_right {X : TopCat} {R : TopCat.Presheaf CommRingCat X} (M P : PresheafOfModules (CategoryTheory.Functor.comp R (CategoryTheory.forget₂ CommRingCat RingCat))) (x : ↑X) {U : TopologicalSpace.Opens ↑X} (hxU : x ∈ U) (r : ↑(R.obj (Opposite.op U))) (m : ↑(M.obj (Opposite.op U))) (p : ↑(P.obj (Opposite.op U))) :
                (CategoryTheory.ConcreteCategory.hom (R.germ U x hxU)) r • M.germTmul P x hxU hxU m p = M.germTmul P x hxU hxU m (r • p)

                Right-slot analogue of PresheafOfModules.germ_smul_germTmul_self: over a single neighbourhood the scalar may be moved into the P factor. Unlike the M slot this is not definitional — it is TensorProduct.tmul_smul, and so uses commutativity of R(U).

                The Rₓ-bilinear map Mₓ → Pₓ → (M ⊗ P)ₓ.

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

                  The backward map sends a pure tensor of germs to the germ of the pure tensor, taken over the intersection of the two neighbourhoods.

                  The leg of the forward cocone at a neighbourhood U of x: the map (M ⊗ P)(U) → Mₓ ⊗ Pₓ sending m ⊗ p to germ m ⊗ germ p.

                  Equations
                  Instances For

                    The cocone on the (M ⊗ P)-diagram whose legs are PresheafOfModules.stalkTensorLeg.

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

                      The forward comparison (M ⊗ P)ₓ → Mₓ ⊗[Rₓ] Pₓ.

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

                        The stalk of a tensor product of presheaves of modules is the tensor product of the stalks, over the stalk of the ring: (M ⊗ P)ₓ ≅ Mₓ ⊗[Rₓ] Pₓ.

                        Equations
                        Instances For
                          @[reducible, inline]

                          The stalk map of a morphism of presheaves of modules, as a morphism of abelian groups.

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

                            The stalk map of a morphism of presheaves of modules is Rₓ-linear.

                            Equations
                            Instances For

                              The tensor-stalk equivalence is natural in both module-presheaf inputs. The proof computes on pure tensors of germs and then uses additivity.

                              PresheafOfModules.stalkTensorEquiv is natural in the second variable. Under the identification of (M ⊗ P)ₓ with Mₓ ⊗ Pₓ, the stalk map of M ◁ g is Mₓ ⊗ (stalk map of g). This is what turns a stalkwise iso into a stalkwise iso after whiskering.

                              Whiskering preserves stalkwise isomorphisms. If g is a stalk isomorphism at x, so is M ◁ g — for any M, with no flatness or local-freeness hypothesis. Tensoring is only right exact in general, but tensoring with an isomorphism is an isomorphism, and PresheafOfModules.stalkTensorEquiv is what makes that visible on stalks.