Documentation

Mathlib.CategoryTheory.Sites.Sheaf

Sheaves taking values in a category #

If C is a category with a Grothendieck topology, we define the notion of a sheaf taking values in an arbitrary category A. We follow the definition in https://stacks.math.columbia.edu/tag/00VR, noting that the presheaf of sets "defined above" can be seen in the comments between tags 00VQ and 00VR on the page https://stacks.math.columbia.edu/tag/00VL. The advantage of this definition is that we need no assumptions whatsoever on A other than the assumption that the morphisms in C and A live in the same universe.

Implementation notes #

Occasionally we need to take a limit in A of a collection of morphisms of C indexed by a collection of objects in C. This turns out to force the morphisms of A to be in a sufficiently large universe. Rather than use UnivLE we prove some results for a category A' instead, whose morphism universe of A' is defined to be max u₁ v₁, where u₁, v₁ are the universes for C. Perhaps after we get better at handling universe inequalities this can be changed.

A sheaf of A is a presheaf P : Cᵒᵖ ⥤ A such that for every E : A, the presheaf of types given by sending U : C to Hom_{A}(E, P U) is a sheaf of types.

Instances For
    def CategoryTheory.Presheaf.IsSeparated {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] (J : GrothendieckTopology C) (P : Functor Cᵒᵖ A) {FA : AAType u_1} {CA : AType u_2} [(X Y : A) → FunLike (FA X Y) (CA X) (CA Y)] [ConcreteCategory A FA] :

    Condition that a presheaf with values in a concrete category is separated for a Grothendieck topology.

    Instances For

      Given a sieve S on X : C, a presheaf P : Cᵒᵖ ⥤ A, and an object E of A, the cones over the natural diagram S.arrows.diagram.op ⋙ P associated to S and P with cone point E are in 1-1 correspondence with SieveCompatible family of elements for the sieve S and the presheaf of types Hom (E, P -).

      Instances For

        The cone corresponding to a SieveCompatible family of elements, dot notation enabled.

        Instances For

          Cone morphisms from the cone corresponding to a SieveCompatible family to the natural cone associated to a sieve S and a presheaf P are in 1-1 correspondence with amalgamations of the family.

          Instances For

            Given sieve S and presheaf P : Cᵒᵖ ⥤ A, their natural associated cone is a limit cone iff Hom (E, P -) is a sheaf of types for the sieve S and all E : A.

            theorem CategoryTheory.Presheaf.subsingleton_iff_isSeparatedFor {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] (P : Functor Cᵒᵖ A) {X : C} (S : Sieve X) :
            (∀ (c : Limits.Cone (S.arrows.diagram.op.comp P)), Subsingleton (c P.mapCone S.arrows.cocone.op)) ∀ (E : Aᵒᵖ), Presieve.IsSeparatedFor (P.comp (coyoneda.obj E)) S.arrows

            Given sieve S and presheaf P : Cᵒᵖ ⥤ A, their natural associated cone admits at most one morphism from every cone in the same category (i.e. over the same diagram), iff Hom (E, P -) is separated for the sieve S and all E : A.

            theorem CategoryTheory.Presheaf.isSheaf_iff_isLimit {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] (J : GrothendieckTopology C) (P : Functor Cᵒᵖ A) :
            IsSheaf J P ∀ ⦃X : C⦄, SJ X, Nonempty (Limits.IsLimit (P.mapCone S.arrows.cocone.op))

            A presheaf P is a sheaf for the Grothendieck topology J iff for every covering sieve S of J, the natural cone associated to P and S is a limit cone.

            theorem CategoryTheory.Presheaf.isSeparated_iff_subsingleton {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] (J : GrothendieckTopology C) (P : Functor Cᵒᵖ A) :
            (∀ (E : A), Presieve.IsSeparated J (P.comp (coyoneda.obj (Opposite.op E)))) ∀ ⦃X : C⦄, SJ X, ∀ (c : Limits.Cone (S.arrows.diagram.op.comp P)), Subsingleton (c P.mapCone S.arrows.cocone.op)

            A presheaf P is separated for the Grothendieck topology J iff for every covering sieve S of J, the natural cone associated to P and S admits at most one morphism from every cone in the same category.

            Given presieve R and presheaf P : Cᵒᵖ ⥤ A, the natural cone associated to P and the sieve Sieve.generate R generated by R is a limit cone iff Hom (E, P -) is a sheaf of types for the presieve R and all E : A.

            A presheaf P is a sheaf for the Grothendieck topology generated by a pretopology K iff for every covering presieve R of K, the natural cone associated to P and Sieve.generate R is a limit cone.

            noncomputable def CategoryTheory.Presheaf.IsSheaf.amalgamate {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {E : A} {X : C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) (S : J.Cover X) (x : (I : S.Arrow) → E P.obj (Opposite.op I.Y)) (hx : ∀ ⦃I₁ I₂ : S.Arrow⦄ (r : I₁.Relation I₂), CategoryStruct.comp (x I₁) (P.map r.g₁.op) = CategoryStruct.comp (x I₂) (P.map r.g₂.op)) :

            This is a wrapper around Presieve.IsSheafFor.amalgamate to be used below. If P is a sheaf, S is a cover of X, and x is a collection of morphisms from E to P evaluated at terms in the cover which are compatible, then we can amalgamate the xs to obtain a single morphism E ⟶ P.obj (op X).

            Instances For
              @[simp]
              theorem CategoryTheory.Presheaf.IsSheaf.amalgamate_map {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {E : A} {X : C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) (S : J.Cover X) (x : (I : S.Arrow) → E P.obj (Opposite.op I.Y)) (hx : ∀ ⦃I₁ I₂ : S.Arrow⦄ (r : I₁.Relation I₂), CategoryStruct.comp (x I₁) (P.map r.g₁.op) = CategoryStruct.comp (x I₂) (P.map r.g₂.op)) (I : S.Arrow) :
              CategoryStruct.comp (hP.amalgamate S x hx) (P.map I.f.op) = x I
              @[simp]
              theorem CategoryTheory.Presheaf.IsSheaf.amalgamate_map_assoc {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {E : A} {X : C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) (S : J.Cover X) (x : (I : S.Arrow) → E P.obj (Opposite.op I.Y)) (hx : ∀ ⦃I₁ I₂ : S.Arrow⦄ (r : I₁.Relation I₂), CategoryStruct.comp (x I₁) (P.map r.g₁.op) = CategoryStruct.comp (x I₂) (P.map r.g₂.op)) (I : S.Arrow) {Z : A} (h : P.obj (Opposite.op I.Y) Z) :
              theorem CategoryTheory.Presheaf.IsSheaf.hom_ext {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {E : A} {X : C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) (S : J.Cover X) (e₁ e₂ : E P.obj (Opposite.op X)) (h : ∀ (I : S.Arrow), CategoryStruct.comp e₁ (P.map I.f.op) = CategoryStruct.comp e₂ (P.map I.f.op)) :
              e₁ = e₂
              theorem CategoryTheory.Presheaf.IsSheaf.hom_ext_ofArrows {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) {I : Type u_1} {S : C} {X : IC} (f : (i : I) → X i S) (hf : Sieve.ofArrows X f J S) {E : A} {x y : E P.obj (Opposite.op S)} (h : ∀ (i : I), CategoryStruct.comp x (P.map (f i).op) = CategoryStruct.comp y (P.map (f i).op)) :
              x = y
              theorem CategoryTheory.Presheaf.IsSheaf.existsUnique_amalgamation_ofArrows {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) {I : Type u_1} {S : C} {X : IC} (f : (i : I) → X i S) (hf : Sieve.ofArrows X f J S) {E : A} (x : (i : I) → E P.obj (Opposite.op (X i))) (hx : ∀ ⦃W : C⦄ ⦃i j : I⦄ (a : W X i) (b : W X j), CategoryStruct.comp a (f i) = CategoryStruct.comp b (f j)CategoryStruct.comp (x i) (P.map a.op) = CategoryStruct.comp (x j) (P.map b.op)) :
              ∃! g : E P.obj (Opposite.op S), ∀ (i : I), CategoryStruct.comp g (P.map (f i).op) = x i
              noncomputable def CategoryTheory.Presheaf.IsSheaf.amalgamateOfArrows {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) {I : Type u_1} {S : C} {X : IC} (f : (i : I) → X i S) (hf : Sieve.ofArrows X f J S) {E : A} (x : (i : I) → E P.obj (Opposite.op (X i))) (hx : ∀ ⦃W : C⦄ ⦃i j : I⦄ (a : W X i) (b : W X j), CategoryStruct.comp a (f i) = CategoryStruct.comp b (f j)CategoryStruct.comp (x i) (P.map a.op) = CategoryStruct.comp (x j) (P.map b.op)) :

              If P : Cᵒᵖ ⥤ A is a sheaf and f i : X i ⟶ S is a covering family, then a morphism E ⟶ P.obj (op S) can be constructed from a compatible family of morphisms x : E ⟶ P.obj (op (X i)).

              Instances For
                @[simp]
                theorem CategoryTheory.Presheaf.IsSheaf.amalgamateOfArrows_map {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) {I : Type u_1} {S : C} {X : IC} (f : (i : I) → X i S) (hf : Sieve.ofArrows X f J S) {E : A} (x : (i : I) → E P.obj (Opposite.op (X i))) (hx : ∀ ⦃W : C⦄ ⦃i j : I⦄ (a : W X i) (b : W X j), CategoryStruct.comp a (f i) = CategoryStruct.comp b (f j)CategoryStruct.comp (x i) (P.map a.op) = CategoryStruct.comp (x j) (P.map b.op)) (i : I) :
                CategoryStruct.comp (hP.amalgamateOfArrows f hf x hx) (P.map (f i).op) = x i
                @[simp]
                theorem CategoryTheory.Presheaf.IsSheaf.amalgamateOfArrows_map_assoc {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) {I : Type u_1} {S : C} {X : IC} (f : (i : I) → X i S) (hf : Sieve.ofArrows X f J S) {E : A} (x : (i : I) → E P.obj (Opposite.op (X i))) (hx : ∀ ⦃W : C⦄ ⦃i j : I⦄ (a : W X i) (b : W X j), CategoryStruct.comp a (f i) = CategoryStruct.comp b (f j)CategoryStruct.comp (x i) (P.map a.op) = CategoryStruct.comp (x j) (P.map b.op)) (i : I) {Z : A} (h : P.obj (Opposite.op (X i)) Z) :
                @[reducible, inline]
                abbrev CategoryTheory.Sheaf {C : Type u₁} [Category.{v₁, u₁} C] (J : GrothendieckTopology C) (A : Type u₂) [Category.{v₂, u₂} A] :
                Type (max (max (max u₂ v₂) u₁) v₁)

                The category of sheaves taking values in A on a Grothendieck topology.

                Instances For
                  @[reducible, inline, deprecated "Use ObjectProperty.obj" (since := "2026-03-03")]

                  The underlying presheaf of a sheaf.

                  Instances For
                    @[deprecated "Use ObjectProperty.FullSubcategory.property" (since := "2026-03-03")]
                    @[deprecated CategoryTheory.ObjectProperty.homMk (since := "2026-03-03")]

                    Alias of CategoryTheory.ObjectProperty.homMk.

                    Instances For
                      theorem CategoryTheory.Sheaf.hom_ext_iff {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {F G : Sheaf J A} {f g : F G} :
                      f = g f.hom = g.hom
                      theorem CategoryTheory.Sheaf.hom_ext {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {F G : Sheaf J A} {f g : F G} (h : f.hom = g.hom) :
                      f = g
                      @[reducible, inline]

                      The inclusion functor of the category of sheaves in the category of presheaves.

                      Instances For
                        @[reducible, inline]

                        The sections of a sheaf (i.e. evaluation as a presheaf on C).

                        Instances For

                          The sheaf sections functor on X is given by evaluation of presheaves on X.

                          Instances For
                            @[reducible, inline]

                            The functor Sheaf J A ⥤ Cᵒᵖ ⥤ A is fully faithful.

                            Instances For
                              @[reducible, inline]
                              abbrev CategoryTheory.Sheaf.homEquiv {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] {X Y : Sheaf J A} :
                              (X Y) (X.obj Y.obj)

                              The bijection (X ⟶ Y) ≃ (X.val ⟶ Y.val) when X and Y are sheaves.

                              Instances For

                                This is stated as a lemma to prevent class search from forming a loop since a sheaf morphism is monic if and only if it is monic as a presheaf morphism (under suitable assumption).

                                def CategoryTheory.sheafOver {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} ( : Sheaf J A) (E : A) :
                                Sheaf J (Type v₂)

                                The sheaf of sections guaranteed by the sheaf condition.

                                Instances For
                                  @[simp]
                                  theorem CategoryTheory.sheafOver_obj {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} ( : Sheaf J A) (E : A) :

                                  The category of sheaves on the bottom (trivial) Grothendieck topology is equivalent to the category of presheaves.

                                  Instances For
                                    @[simp]
                                    theorem CategoryTheory.sheafBotEquivalence_counitIso {C : Type u₁} [Category.{v₁, u₁} C] (A : Type u₂) [Category.{v₂, u₂} A] :
                                    (sheafBotEquivalence A).counitIso = Iso.refl ({ obj := fun (P : Functor Cᵒᵖ A) => { obj := P, property := }, map := fun {X Y : Functor Cᵒᵖ A} (f : X Y) => { hom := f }, map_id := , map_comp := }.comp (sheafToPresheaf A))
                                    noncomputable def CategoryTheory.Sheaf.isTerminalOfBotCover {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] (F : Sheaf J A) (X : C) (H : J X) :

                                    If the empty sieve is a cover of X, then F(X) is terminal.

                                    Instances For

                                      A terminal object in A gives rise to a terminal object in Sheaf J

                                      Instances For

                                        The constant sheaf of a terminal object is indeed terminal

                                        Instances For

                                          If the topology is discrete, any sheaf is terminal.

                                          Instances For
                                            @[simp]
                                            theorem CategoryTheory.Sheaf.Hom.add_app {C : Type u₁} [Category.{v₁, u₁} C] {J : GrothendieckTopology C} {A : Type u₂} [Category.{v₂, u₂} A] [Preadditive A] {P Q : Sheaf J A} (f g : P Q) (U : Cᵒᵖ) :
                                            (f + g).hom.app U = f.hom.app U + g.hom.app U
                                            noncomputable def CategoryTheory.Presheaf.isLimitOfIsSheaf {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] (J : GrothendieckTopology C) (P : Functor Cᵒᵖ A) {X : C} (S : J.Cover X) (hP : IsSheaf J P) :

                                            When P is a sheaf and S is a cover, the associated multifork is a limit.

                                            Instances For
                                              noncomputable def CategoryTheory.Presheaf.IsSheaf.isLimitMultifork {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {J : GrothendieckTopology C} {P : Functor Cᵒᵖ A} (hP : IsSheaf J P) {X : C} (S : J.Cover X) :

                                              If F : Cᵒᵖ ⥤ A is a sheaf for a Grothendieck topology J on C, and S is a cover of X : C, then the multifork S.multifork F is limit.

                                              Instances For
                                                noncomputable def CategoryTheory.Presheaf.firstObj {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {U : C} (R : Presieve U) (P : Functor Cᵒᵖ A) [Limits.HasProducts A] :
                                                A

                                                The middle object of the fork diagram given in Equation (3) of [MM92], as well as the fork diagram of the Stacks entry.

                                                Instances For
                                                  noncomputable def CategoryTheory.Presheaf.forkMap {C : Type u₁} [Category.{v₁, u₁} C] {A : Type u₂} [Category.{v₂, u₂} A] {U : C} (R : Presieve U) (P : Functor Cᵒᵖ A) [Limits.HasProducts A] :

                                                  The left morphism of the fork diagram given in Equation (3) of [MM92], as well as the fork diagram of the Stacks entry.

                                                  Instances For

                                                    The rightmost object of the fork diagram of the Stacks entry, which contains the data used to check a family of elements for a presieve is compatible.

                                                    Instances For

                                                      The map pr₀* of the Stacks entry.

                                                      Instances For

                                                        The map pr₁* of the Stacks entry.

                                                        Instances For

                                                          An alternative definition of the sheaf condition in terms of equalizers. This is shown to be equivalent in CategoryTheory.Presheaf.isSheaf_iff_isSheaf'.

                                                          Instances For

                                                            (Implementation). An auxiliary lemma to convert between sheaf conditions.

                                                            Instances For

                                                              The equalizer definition of a sheaf given by isSheaf' is equivalent to isSheaf.

                                                              For a concrete category (A, s) where the forgetful functor s : A ⥤ Type v preserves limits and reflects isomorphisms, and A has limits, an A-valued presheaf P : Cᵒᵖ ⥤ A is a sheaf iff its underlying Type-valued presheaf P ⋙ s : Cᵒᵖ ⥤ Type is a sheaf.

                                                              Note this lemma applies for "algebraic" categories, e.g. groups, abelian groups and rings, but not for the category of topological spaces, topological rings, etc. since reflecting isomorphisms does not hold.