Documentation

Mathlib.CategoryTheory.Sites.Sieves.Basic

Sieves #

For an object X of a category C, a sieve on X is a presieve on X, i.e. a predicate on morphisms with codomain X, with the additional property of being closed under precomposition. Thus a sieve records a collection of arrows into X that is stable under passing to further refinements.

This file develops the basic theory of sieves. It gives Sieve X its complete lattice structure and defines Sieve.generate, the smallest sieve containing a presieve. Generation and the underlying-arrow presieve form a Galois insertion. The file also constructs sieves from indexed families of arrows or objects, and defines pullback and pushforward along a fixed morphism together with their Galois connection.

Operations induced by functors between categories are developed in Mathlib.CategoryTheory.Sites.Sieves.Functoriality, while the presheaf associated to a sieve is developed in Mathlib.CategoryTheory.Sites.Sieves.Presheaf.

Tags #

sieve, pullback

structure CategoryTheory.Sieve {C : Type u₁} [Category.{v₁, u₁} C] (X : C) :
Type (max u₁ v₁)

For an object X of a category C, a Sieve X is a predicate on morphisms to X which is closed under left-composition.

Instances For
    theorem CategoryTheory.Sieve.arrows_ext {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {R S : Sieve X} :
    R.arrows = S.arrowsR = S
    theorem CategoryTheory.Sieve.ext {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {R S : Sieve X} (h : ∀ ⦃Y : C⦄ (f : Y X), R.arrows f S.arrows f) :
    R = S
    theorem CategoryTheory.Sieve.ext_iff {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {R S : Sieve X} :
    R = S ∀ ⦃Y : C⦄ (f : Y X), R.arrows f S.arrows f
    def CategoryTheory.Sieve.sup {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (𝒮 : Set (Sieve X)) :

    The supremum of a collection of sieves: the union of them all.

    Equations
    Instances For
      def CategoryTheory.Sieve.inf {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (𝒮 : Set (Sieve X)) :

      The infimum of a collection of sieves: the intersection of them all.

      Equations
      Instances For
        def CategoryTheory.Sieve.union {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (S R : Sieve X) :

        The union of two sieves is a sieve.

        Equations
        Instances For
          def CategoryTheory.Sieve.inter {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (S R : Sieve X) :

          The intersection of two sieves is a sieve.

          Equations
          Instances For
            @[instance_reducible]

            Sieves on an object X form a complete lattice. We generate this directly rather than using the Galois insertion for nicer definitional properties.

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

            The maximal sieve always exists.

            Equations
            @[simp]
            theorem CategoryTheory.Sieve.sInf_apply {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {Ss : Set (Sieve X)} {Y : C} (f : Y X) :
            (sInf Ss).arrows f SSs, S.arrows f
            @[simp]
            theorem CategoryTheory.Sieve.sSup_apply {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {Ss : Set (Sieve X)} {Y : C} (f : Y X) :
            (sSup Ss).arrows f ∃ (S : Sieve X) (_ : S Ss), S.arrows f
            @[simp]
            theorem CategoryTheory.Sieve.inter_apply {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {R S : Sieve X} {Y : C} (f : Y X) :
            (RS).arrows f R.arrows f S.arrows f
            @[simp]
            theorem CategoryTheory.Sieve.union_apply {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {R S : Sieve X} {Y : C} (f : Y X) :
            (RS).arrows f R.arrows f S.arrows f
            theorem CategoryTheory.Sieve.top_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : Y X) :
            @[simp]
            theorem CategoryTheory.Sieve.bot_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : Y X) :

            Generate the smallest sieve containing the given presieve.

            Equations
            Instances For
              @[simp]
              theorem CategoryTheory.Sieve.generate_apply {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (R : Presieve X) (Z : C) (f : Z X) :
              (generate R).arrows f = ∃ (Y : C) (h : Z Y) (g : Y X), R g CategoryStruct.comp h g = f
              def CategoryTheory.Sieve.bind {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (S : Presieve X) (R : Y : C⦄ → f : Y X⦄ → S fSieve Y) :

              Given a presieve on X, and a sieve on each domain of an arrow in the presieve, we can bind to produce a sieve on X.

              Equations
              Instances For
                @[simp]
                theorem CategoryTheory.Sieve.bind_apply {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (S : Presieve X) (R : Y : C⦄ → f : Y X⦄ → S fSieve Y) :
                (bind S R).arrows = S.bind fun (x : C) (x_1 : x X) (h : S x_1) => (R h).arrows
                @[reducible, inline]
                abbrev CategoryTheory.Sieve.BindStruct {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (S : Presieve X) (R : Y : C⦄ → f : Y X⦄ → S fSieve Y) {Z : C} (h : Z X) :
                Type (max u₁ v₁)

                Structure which contains the data and properties for a morphism h satisfying Sieve.bind S R h.

                Equations
                Instances For

                  Show that there is a Galois insertion (generate, underlying presieve).

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

                    If the identity arrow is in a sieve, the sieve is maximal.

                    theorem CategoryTheory.Sieve.generate_of_contains_isSplitEpi {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} {R : Presieve X} (f : Y X) [IsSplitEpi f] (hf : R f) :

                    If a presieve contains a split epi, it generates the maximal sieve.

                    @[simp]
                    theorem CategoryTheory.Sieve.comp_mem_iff {C : Type u₁} [Category.{v₁, u₁} C] {X Y Z : C} (i : X Y) (f : Y Z) [IsIso i] (S : Sieve Z) :
                    @[reducible, inline]
                    abbrev CategoryTheory.Sieve.ofArrows {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} (Y : IC) (f : (i : I) → Y i X) :

                    The sieve of X generated by family of morphisms Y i ⟶ X.

                    Equations
                    Instances For
                      theorem CategoryTheory.Sieve.ofArrows_mk {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} (Y : IC) (f : (i : I) → Y i X) (i : I) :
                      (ofArrows Y f).arrows (f i)
                      theorem CategoryTheory.Sieve.mem_ofArrows_iff {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} (Y : IC) (f : (i : I) → Y i X) {W : C} (g : W X) :
                      (ofArrows Y f).arrows g ∃ (i : I) (a : W Y i), g = CategoryStruct.comp a (f i)
                      theorem CategoryTheory.Sieve.ofArrows.exists {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} {Y : IC} {f : (i : I) → Y i X} {W : C} {g : W X} (hg : (ofArrows Y f).arrows g) :
                      ∃ (i : I) (h : W Y i), g = CategoryStruct.comp h (f i)
                      noncomputable def CategoryTheory.Sieve.ofArrows.i {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} {Y : IC} {f : (i : I) → Y i X} {W : C} {g : W X} (hg : (ofArrows Y f).arrows g) :
                      I

                      When hg : Sieve.ofArrows Y f g, this is a choice of i such that g factors through f i.

                      Equations
                      Instances For
                        noncomputable def CategoryTheory.Sieve.ofArrows.h {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} {Y : IC} {f : (i : I) → Y i X} {W : C} {g : W X} (hg : (ofArrows Y f).arrows g) :
                        W Y (i hg)

                        When hg : Sieve.ofArrows Y f g, this is a morphism h : W ⟶ Y (i hg) such that h ≫ f (i hg) = g.

                        Equations
                        Instances For
                          @[simp]
                          theorem CategoryTheory.Sieve.ofArrows.fac {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} {Y : IC} {f : (i : I) → Y i X} {W : C} {g : W X} (hg : (ofArrows Y f).arrows g) :
                          CategoryStruct.comp (h hg) (f (i hg)) = g
                          @[simp]
                          theorem CategoryTheory.Sieve.ofArrows.fac_assoc {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} {Y : IC} {f : (i : I) → Y i X} {W : C} {g : W X} (hg : (ofArrows Y f).arrows g) {Z : C} (h : X Z) :
                          theorem CategoryTheory.Sieve.ofArrows_category' {C : Type u₁} [Category.{v₁, u₁} C] {S : C} (R : Presieve S) :
                          (ofArrows (fun (f : R.category) => f.obj.left) fun (f : R.category) => f.obj.hom) = generate R

                          The sieve generated by the morphisms in R.category for a presieve R is the sieve generated by R.

                          theorem CategoryTheory.Sieve.ofArrows_category {C : Type u₁} [Category.{v₁, u₁} C] {S : C} (R : Sieve S) :
                          (ofArrows (fun (f : R.arrows.category) => f.obj.left) fun (f : R.arrows.category) => f.obj.hom) = R
                          theorem CategoryTheory.Sieve.exists_eq_ofArrows {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (R : Sieve X) :
                          ∃ (I : Type (max u₁ v₁)) (Y : IC) (f : (i : I) → Y i X), R = ofArrows Y f
                          @[reducible, inline]
                          abbrev CategoryTheory.Sieve.ofTwoArrows {C : Type u₁} [Category.{v₁, u₁} C] {U V X : C} (i : U X) (j : V X) :

                          The sieve generated by two morphisms.

                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            def CategoryTheory.Sieve.ofObjects {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} (Y : IC) (X : C) :

                            The sieve of X : C that is generated by a family of objects Y : I → C: it consists of morphisms p : Z ⟶ X such that there exists a morphism Z ⟶ Y i for some i (note that this does not depend on p, only on the object Z).

                            Equations
                            Instances For
                              theorem CategoryTheory.Sieve.mem_ofObjects_iff {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} (Y : IC) {Z X : C} (g : Z X) :
                              (ofObjects Y X).arrows g ∃ (i : I), Nonempty (Z Y i)
                              theorem CategoryTheory.Sieve.ofArrows_le_ofObjects {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} (Y : IC) {X : C} (f : (i : I) → Y i X) :
                              theorem CategoryTheory.Sieve.ofArrows_eq_ofObjects {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (hX : Limits.IsTerminal X) {I : Type u_1} (Y : IC) (f : (i : I) → Y i X) :
                              theorem CategoryTheory.Sieve.ofObjects_mono {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : IC} {I' : Type u_2} {X' : I'C} {Y : C} (h : Set.range XSet.range X') :
                              def CategoryTheory.Sieve.pullback {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (h : Y X) (S : Sieve X) :

                              Given a morphism h : Y ⟶ X, send a sieve S on X to a sieve on Y as the inverse image of S with _ ≫ h. That is, Sieve.pullback S h := (≫ h) '⁻¹ S.

                              Equations
                              Instances For
                                @[simp]
                                theorem CategoryTheory.Sieve.pullback_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (h : Y X) (S : Sieve X) (x✝ : C) (sl : x✝ Y) :
                                @[simp]
                                theorem CategoryTheory.Sieve.pullback_top {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} {f : Y X} :
                                theorem CategoryTheory.Sieve.pullback_comp {C : Type u₁} [Category.{v₁, u₁} C] {X Y Z : C} {f : Y X} {g : Z Y} (S : Sieve X) :
                                @[simp]
                                theorem CategoryTheory.Sieve.pullback_inter {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} {f : Y X} (S R : Sieve X) :
                                pullback f (SR) = pullback f Spullback f R
                                theorem CategoryTheory.Sieve.pullback_ofArrows_of_iso {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} {X : C} (Z : IC) (f : (i : I) → Z i X) {X' : C} (e : X' X) :
                                pullback e.hom (ofArrows Z f) = ofArrows Z fun (i : I) => CategoryStruct.comp (f i) e.inv
                                theorem CategoryTheory.Sieve.pullback_eq_top_of_mem {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (S : Sieve X) {f : Y X} :
                                S.arrows fpullback f S =
                                theorem CategoryTheory.Sieve.pullback_ofObjects_eq_top {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} (Y : IC) {X : C} {i : I} (g : X Y i) :
                                @[simp]
                                theorem CategoryTheory.Sieve.pullback_ofObjects {C : Type u₁} [Category.{v₁, u₁} C] {I : Type u_1} (X : IC) {Y Z : C} (f : Z Y) :
                                def CategoryTheory.Sieve.pushforward {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : Y X) (R : Sieve Y) :

                                Push a sieve R on Y forward along an arrow f : Y ⟶ X: gf : Z ⟶ X is in the sieve if gf factors through some g : Z ⟶ Y which is in R.

                                Equations
                                Instances For
                                  @[simp]
                                  theorem CategoryTheory.Sieve.pushforward_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : Y X) (R : Sieve Y) (x✝ : C) (gf : x✝ X) :
                                  (pushforward f R).arrows gf = ∃ (g : x✝ Y), CategoryStruct.comp g f = gf R.arrows g
                                  theorem CategoryTheory.Sieve.pushforward_apply_comp {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} {R : Sieve Y} {Z : C} {g : Z Y} (hg : R.arrows g) (f : Y X) :
                                  theorem CategoryTheory.Sieve.pushforward_comp {C : Type u₁} [Category.{v₁, u₁} C] {X Y Z : C} {f : Y X} {g : Z Y} (R : Sieve Z) :
                                  theorem CategoryTheory.Sieve.pushforward_union {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} {f : Y X} (S R : Sieve Y) :
                                  pushforward f (SR) = pushforward f Spushforward f R
                                  @[simp]
                                  theorem CategoryTheory.Sieve.pullback_bot {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : Y X) :
                                  @[simp]
                                  theorem CategoryTheory.Sieve.pushforward_le_bind_of_mem {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (S : Presieve X) (R : Y : C⦄ → f : Y X⦄ → S fSieve Y) (f : Y X) (h : S f) :
                                  pushforward f (R h) bind S R
                                  theorem CategoryTheory.Sieve.le_pullback_bind {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (S : Presieve X) (R : Y : C⦄ → f : Y X⦄ → S fSieve Y) (f : Y X) (h : S f) :
                                  R h pullback f (bind S R)

                                  If f is a monomorphism, the pushforward-pullback adjunction on sieves is coreflective.

                                  Equations
                                  Instances For

                                    If f is a split epi, the pushforward-pullback adjunction on sieves is reflective.

                                    Equations
                                    Instances For
                                      theorem CategoryTheory.Sieve.ofArrows_eq_pullback_of_isPullback {C : Type u₁} [Category.{v₁, u₁} C] {ι : Type u_1} {S : C} {X : ιC} (f : (i : ι) → X i S) {Y : C} {g : Y S} {P : ιC} {p₁ : (i : ι) → P i Y} {p₂ : (i : ι) → P i X i} (h : ∀ (i : ι), IsPullback (p₁ i) (p₂ i) g (f i)) :
                                      ofArrows P p₁ = pullback g (ofArrows X f)
                                      theorem CategoryTheory.Presieve.bind_ofArrows_le_bindOfArrows {C : Type u₁} [Category.{v₁, u₁} C] {ι : Type u_1} {X : C} (Z : ιC) (f : (i : ι) → Z i X) (R : (i : ι) → Presieve (Z i)) :