Documentation

Mathlib.CategoryTheory.Sites.Grothendieck

Grothendieck topologies #

Definition and lemmas about Grothendieck topologies. A Grothendieck topology for a category C is a set of sieves on each object X satisfying certain closure conditions.

Alternate versions of the axioms (in arrow form) are also described. Two explicit examples of Grothendieck topologies are given:

A pretopology, or a basis for a topology is defined in Mathlib/CategoryTheory/Sites/Pretopology.lean. The topology associated to a topological space is defined in Mathlib/CategoryTheory/Sites/Spaces.lean.

Tags #

Grothendieck topology, coverage, pretopology, site

References #

Implementation notes #

We use the definition of [nlab] and [MM92][] (Chapter III, Section 2), where Grothendieck topologies are saturated collections of morphisms, rather than the notions of the Stacks project (00VG) and the Elephant, in which topologies are allowed to be unsaturated, and are then completed. TODO (BM): Add the definition from Stacks, as a pretopology, and complete to a topology.

This is so that we can produce a bijective correspondence between Grothendieck topologies on a small category and Lawvere-Tierney topologies on its presheaf topos, as well as the equivalence between Grothendieck topoi and left exact reflective subcategories of presheaf toposes.

The definition of a Grothendieck topology: a set of sieves J X on each object X satisfying three axioms:

  1. For every object X, the maximal sieve is in J X.
  2. If S ∈ J X then its pullback along any h : Y ⟶ X is in J Y.
  3. If S ∈ J X and R is a sieve on X, then provided that the pullback of R along any arrow f : Y ⟶ X in S is in J Y, we have that R itself is in J X.

A sieve S on X is referred to as J-covering, (or just covering), if S ∈ J X.

See https://stacks.math.columbia.edu/tag/00Z4, or [nlab], or [MM92][] Chapter III, Section 2, Definition 1.

Instances For

    The sieves associated to each object must contain the top sieve. Use GrothendieckTopology.top_mem.

    theorem CategoryTheory.GrothendieckTopology.pullback_stable' {C : Type u} [CategoryTheory.Category.{v, u} C] (self : CategoryTheory.GrothendieckTopology C) ⦃X : C ⦃Y : C ⦃S : CategoryTheory.Sieve X (f : Y X) :
    S self.sieves XCategoryTheory.Sieve.pullback f S self.sieves Y

    Stability under pullback. Use GrothendieckTopology.pullback_stable.

    theorem CategoryTheory.GrothendieckTopology.transitive' {C : Type u} [CategoryTheory.Category.{v, u} C] (self : CategoryTheory.GrothendieckTopology C) ⦃X : C ⦃S : CategoryTheory.Sieve X :
    S self.sieves X∀ (R : CategoryTheory.Sieve X), (∀ ⦃Y : C⦄ ⦃f : Y X⦄, S.arrows fCategoryTheory.Sieve.pullback f R self.sieves Y)R self.sieves X

    Transitivity of sieves in a Grothendieck topology. Use GrothendieckTopology.transitive.

    An extensionality lemma in terms of the coercion to a pi-type. We prove this explicitly rather than deriving it so that it is in terms of the coercion rather than the projection .sieves.

    @[simp]

    Also known as the maximality axiom.

    @[simp]

    Also known as the stability axiom.

    theorem CategoryTheory.GrothendieckTopology.transitive {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {S : CategoryTheory.Sieve X} (J : CategoryTheory.GrothendieckTopology C) (hS : S J.sieves X) (R : CategoryTheory.Sieve X) (h : ∀ ⦃Y : C⦄ ⦃f : Y X⦄, S.arrows fCategoryTheory.Sieve.pullback f R J.sieves Y) :
    R J.sieves X

    If S is a subset of R, and S is covering, then R is covering as well.

    See https://stacks.math.columbia.edu/tag/00Z5 (2), or discussion after [MM92] Chapter III, Section 2, Definition 1.

    The intersection of two covering sieves is covering.

    See https://stacks.math.columbia.edu/tag/00Z5 (1), or [MM92] Chapter III, Section 2, Definition 1 (iv).

    theorem CategoryTheory.GrothendieckTopology.bind_covering {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} (J : CategoryTheory.GrothendieckTopology C) {S : CategoryTheory.Sieve X} {R : Y : C⦄ → f : Y X⦄ → S.arrows fCategoryTheory.Sieve Y} (hS : S J.sieves X) (hR : ∀ ⦃Y : C⦄ ⦃f : Y X⦄ (H : S.arrows f), R H J.sieves Y) :
    CategoryTheory.Sieve.bind S.arrows R J.sieves X

    The sieve S on X J-covers an arrow f to X if S.pullback f ∈ J Y. This definition is an alternate way of presenting a Grothendieck topology.

    Equations
    Instances For
      theorem CategoryTheory.GrothendieckTopology.arrow_max {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (J : CategoryTheory.GrothendieckTopology C) (f : Y X) (S : CategoryTheory.Sieve X) (hf : S.arrows f) :
      J.Covers S f

      The maximality axiom in 'arrow' form: Any arrow f in S is covered by S.

      theorem CategoryTheory.GrothendieckTopology.arrow_stable {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (J : CategoryTheory.GrothendieckTopology C) (f : Y X) (S : CategoryTheory.Sieve X) (h : J.Covers S f) {Z : C} (g : Z Y) :

      The stability axiom in 'arrow' form: If S covers f then S covers g ≫ f for any g.

      theorem CategoryTheory.GrothendieckTopology.arrow_trans {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (J : CategoryTheory.GrothendieckTopology C) (f : Y X) (S : CategoryTheory.Sieve X) (R : CategoryTheory.Sieve X) (h : J.Covers S f) :
      (∀ {Z : C} (g : Z X), S.arrows gJ.Covers R g)J.Covers R f

      The transitivity axiom in 'arrow' form: If S covers f and every arrow in S is covered by R, then R covers f.

      theorem CategoryTheory.GrothendieckTopology.arrow_intersect {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (J : CategoryTheory.GrothendieckTopology C) (f : Y X) (S : CategoryTheory.Sieve X) (R : CategoryTheory.Sieve X) (hS : J.Covers S f) (hR : J.Covers R f) :
      J.Covers (S R) f

      The trivial Grothendieck topology, in which only the maximal sieve is covering. This topology is also known as the indiscrete, coarse, or chaotic topology.

      See [MM92] Chapter III, Section 2, example (a), or https://en.wikipedia.org/wiki/Grothendieck_topology#The_discrete_and_indiscrete_topologies

      Equations
      Instances For

        The discrete Grothendieck topology, in which every sieve is covering.

        See https://en.wikipedia.org/wiki/Grothendieck_topology#The_discrete_and_indiscrete_topologies.

        Equations
        Instances For

          See https://stacks.math.columbia.edu/tag/00Z6

          Equations

          See https://stacks.math.columbia.edu/tag/00Z6

          Equations
          • CategoryTheory.GrothendieckTopology.instPartialOrder = let __src := CategoryTheory.GrothendieckTopology.instLEGrothendieckTopology; PartialOrder.mk

          Construct a complete lattice from the Inf, but make the trivial and discrete topologies definitionally equal to the bottom and top respectively.

          Equations
          • One or more equations did not get rendered due to their size.
          Equations
          • CategoryTheory.GrothendieckTopology.instInhabited = { default := }
          theorem CategoryTheory.GrothendieckTopology.bot_covers {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (S : CategoryTheory.Sieve X) (f : Y X) :
          .Covers S f S.arrows f
          @[simp]
          theorem CategoryTheory.GrothendieckTopology.top_covers {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (S : CategoryTheory.Sieve X) (f : Y X) :
          .Covers S f

          The dense Grothendieck topology.

          See https://ncatlab.org/nlab/show/dense+topology, or [MM92] Chapter III, Section 2, example (e).

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            theorem CategoryTheory.GrothendieckTopology.dense_covering {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {S : CategoryTheory.Sieve X} :
            S CategoryTheory.GrothendieckTopology.dense.sieves X ∀ {Y : C} (f : Y X), ∃ (Z : C) (g : Z Y), S.arrows (CategoryTheory.CategoryStruct.comp g f)

            A category satisfies the right Ore condition if any span can be completed to a commutative square. NB. Any category with pullbacks obviously satisfies the right Ore condition, see right_ore_of_pullbacks.

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

              The atomic Grothendieck topology: a sieve is covering iff it is nonempty. For the pullback stability condition, we need the right Ore condition to hold.

              See https://ncatlab.org/nlab/show/atomic+site, or [MM92] Chapter III, Section 2, example (f).

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

                J.Cover X denotes the poset of covers of X with respect to the Grothendieck topology J.

                Equations
                Instances For
                  Equations
                  • J.instPreorderCover X = let_fun this := inferInstance; this

                  The sieve associated to a term of J.Cover X.

                  Equations
                  • S.sieve = S
                  Instances For
                    instance CategoryTheory.GrothendieckTopology.Cover.instCoeFunForallForallHomProp {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} :
                    CoeFun (J.Cover X) fun (x : J.Cover X) => Y : C⦄ → (Y X)Prop
                    Equations
                    • CategoryTheory.GrothendieckTopology.Cover.instCoeFunForallForallHomProp = { coe := fun (S : J.Cover X) => S.sieve.arrows }
                    theorem CategoryTheory.GrothendieckTopology.Cover.ext {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} (S : J.Cover X) (T : J.Cover X) (h : ∀ ⦃Y : C⦄ (f : Y X), S.sieve.arrows f T.sieve.arrows f) :
                    S = T
                    Equations
                    • CategoryTheory.GrothendieckTopology.Cover.instOrderTop = let __src := inferInstance; OrderTop.mk
                    Equations
                    • CategoryTheory.GrothendieckTopology.Cover.instSemilatticeInf = let __src := inferInstance; SemilatticeInf.mk
                    Equations
                    • CategoryTheory.GrothendieckTopology.Cover.instInhabited = { default := }
                    theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.ext_iff {C : Type u} :
                    ∀ {inst : CategoryTheory.Category.{v, u} C} {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (x y : S.Arrow), x = y x.Y = y.Y HEq x.f y.f
                    theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.ext {C : Type u} :
                    ∀ {inst : CategoryTheory.Category.{v, u} C} {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (x y : S.Arrow), x.Y = y.YHEq x.f y.fx = y

                    An auxiliary structure, used to define S.index.

                    • Y : C

                      The source of the arrow.

                    • f : self.Y X

                      The arrow itself.

                    • hf : S.sieve.arrows self.f

                      The given arrow is contained in the given sieve.

                    Instances For
                      theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.hf {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (self : S.Arrow) :
                      S.sieve.arrows self.f

                      The given arrow is contained in the given sieve.

                      theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.ext {C : Type u} :
                      ∀ {inst : CategoryTheory.Category.{v, u} C} {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {I₁ I₂ : S.Arrow} (x y : I₁.Relation I₂), x.Z = y.ZHEq x.g₁ y.g₁HEq x.g₂ y.g₂x = y
                      theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.ext_iff {C : Type u} :
                      ∀ {inst : CategoryTheory.Category.{v, u} C} {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {I₁ I₂ : S.Arrow} (x y : I₁.Relation I₂), x = y x.Z = y.Z HEq x.g₁ y.g₁ HEq x.g₂ y.g₂
                      structure CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I₁ : S.Arrow) (I₂ : S.Arrow) :
                      Type (max u v)

                      Relation between two elements in S.arrow, the data of which involves a commutative square.

                      Instances For
                        theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.w {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {I₁ : S.Arrow} {I₂ : S.Arrow} (self : I₁.Relation I₂) :

                        The relation itself.

                        @[simp]
                        theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.precomp_Y {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                        (I.precomp g).Y = Z
                        @[simp]
                        theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.precomp_f {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                        def CategoryTheory.GrothendieckTopology.Cover.Arrow.precomp {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                        S.Arrow

                        Given I : S.Arrow and a morphism g : Z ⟶ I.Y, this is the arrow in S.Arrow corresponding to g ≫ I.f.

                        Equations
                        Instances For
                          @[simp]
                          theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.precompRelation_g₂ {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                          (I.precompRelation g).g₂ = g
                          @[simp]
                          theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.precompRelation_Z {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                          (I.precompRelation g).Z = (I.precomp g).Y
                          @[simp]
                          theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.precompRelation_g₁ {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                          (I.precompRelation g).g₁ = CategoryTheory.CategoryStruct.id (I.precomp g).Y
                          def CategoryTheory.GrothendieckTopology.Cover.Arrow.precompRelation {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (I : S.Arrow) {Z : C} (g : Z I.Y) :
                          (I.precomp g).Relation I

                          Given I : S.Arrow and a morphism g : Z ⟶ I.Y, this is the obvious relation from I.precomp g to I.

                          Equations
                          Instances For
                            @[simp]
                            theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.map_Y {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} (I : S.Arrow) (f : S T) :
                            (I.map f).Y = I.Y
                            @[simp]
                            theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.map_f {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} (I : S.Arrow) (f : S T) :
                            (I.map f).f = I.f
                            def CategoryTheory.GrothendieckTopology.Cover.Arrow.map {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} (I : S.Arrow) (f : S T) :
                            T.Arrow

                            Map an Arrow along a refinement S ⟶ T.

                            Equations
                            • I.map f = { Y := I.Y, f := I.f, hf := }
                            Instances For
                              @[simp]
                              theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.map_Z {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} {I₁ : S.Arrow} {I₂ : S.Arrow} (r : I₁.Relation I₂) (f : S T) :
                              (r.map f).Z = r.Z
                              @[simp]
                              theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.map_g₁ {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} {I₁ : S.Arrow} {I₂ : S.Arrow} (r : I₁.Relation I₂) (f : S T) :
                              (r.map f).g₁ = r.g₁
                              @[simp]
                              theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.map_g₂ {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} {I₁ : S.Arrow} {I₂ : S.Arrow} (r : I₁.Relation I₂) (f : S T) :
                              (r.map f).g₂ = r.g₂
                              def CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.map {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {T : J.Cover X} {I₁ : S.Arrow} {I₂ : S.Arrow} (r : I₁.Relation I₂) (f : S T) :
                              (I₁.map f).Relation (I₂.map f)

                              Map an Arrow.Relation along a refinement S ⟶ T.

                              Equations
                              • r.map f = { Z := r.Z, g₁ := r.g₁, g₂ := r.g₂, w := }
                              Instances For

                                Pull back a cover along a morphism.

                                Equations
                                Instances For
                                  @[simp]
                                  theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.base_Y {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} {J : CategoryTheory.GrothendieckTopology C} {f : Y X} {S : J.Cover X} (I : (S.pullback f).Arrow) :
                                  I.base.Y = I.Y
                                  @[simp]
                                  theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.base_f {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} {J : CategoryTheory.GrothendieckTopology C} {f : Y X} {S : J.Cover X} (I : (S.pullback f).Arrow) :
                                  def CategoryTheory.GrothendieckTopology.Cover.Arrow.base {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} {J : CategoryTheory.GrothendieckTopology C} {f : Y X} {S : J.Cover X} (I : (S.pullback f).Arrow) :
                                  S.Arrow

                                  An arrow of S.pullback f gives rise to an arrow of S.

                                  Equations
                                  Instances For
                                    def CategoryTheory.GrothendieckTopology.Cover.Arrow.Relation.base {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} {J : CategoryTheory.GrothendieckTopology C} {f : Y X} {S : J.Cover X} {I₁ : (S.pullback f).Arrow} {I₂ : (S.pullback f).Arrow} (r : I₁.Relation I₂) :
                                    I₁.base.Relation I₂.base

                                    A relation of S.pullback f gives rise to a relation of S.

                                    Equations
                                    • r.base = { Z := r.Z, g₁ := r.g₁, g₂ := r.g₂, w := }
                                    Instances For
                                      @[simp]
                                      theorem CategoryTheory.GrothendieckTopology.Cover.coe_pullback {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} {J : CategoryTheory.GrothendieckTopology C} {Z : C} (f : Y X) (g : Z Y) (S : J.Cover X) :
                                      (S.pullback f).sieve.arrows g S.sieve.arrows (CategoryTheory.CategoryStruct.comp g f)

                                      The isomorphism between S and the pullback of S w.r.t. the identity.

                                      Equations
                                      Instances For
                                        def CategoryTheory.GrothendieckTopology.Cover.pullbackComp {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {Y : C} {Z : C} (S : J.Cover X) (f : Z Y) (g : Y X) :
                                        S.pullback (CategoryTheory.CategoryStruct.comp f g) (S.pullback g).pullback f

                                        Pulling back with respect to a composition is the composition of the pullbacks.

                                        Equations
                                        Instances For
                                          def CategoryTheory.GrothendieckTopology.Cover.bind {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} (S : J.Cover X) (T : (I : S.Arrow) → J.Cover I.Y) :
                                          J.Cover X

                                          Combine a family of covers over a cover.

                                          Equations
                                          • S.bind T = CategoryTheory.Sieve.bind S.sieve.arrows fun (Y : C) (f : Y X) (hf : S.sieve.arrows f) => (T { Y := Y, f := f, hf := hf }).sieve,
                                          Instances For
                                            def CategoryTheory.GrothendieckTopology.Cover.bindToBase {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} (S : J.Cover X) (T : (I : S.Arrow) → J.Cover I.Y) :
                                            S.bind T S

                                            The canonical morphism from S.bind T to T.

                                            Equations
                                            Instances For
                                              noncomputable def CategoryTheory.GrothendieckTopology.Cover.Arrow.middle {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                              C

                                              An arrow in bind has the form A ⟶ B ⟶ X where A ⟶ B is an arrow in T I for some I. and B ⟶ X is an arrow of S. This is the object B.

                                              Equations
                                              Instances For
                                                noncomputable def CategoryTheory.GrothendieckTopology.Cover.Arrow.toMiddleHom {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                I.Y I.middle

                                                An arrow in bind has the form A ⟶ B ⟶ X where A ⟶ B is an arrow in T I for some I. and B ⟶ X is an arrow of S. This is the hom A ⟶ B.

                                                Equations
                                                • I.toMiddleHom = .choose
                                                Instances For
                                                  noncomputable def CategoryTheory.GrothendieckTopology.Cover.Arrow.fromMiddleHom {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                  I.middle X

                                                  An arrow in bind has the form A ⟶ B ⟶ X where A ⟶ B is an arrow in T I for some I. and B ⟶ X is an arrow of S. This is the hom B ⟶ X.

                                                  Equations
                                                  • I.fromMiddleHom = .choose
                                                  Instances For
                                                    theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.from_middle_condition {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                    S.sieve.arrows I.fromMiddleHom
                                                    noncomputable def CategoryTheory.GrothendieckTopology.Cover.Arrow.fromMiddle {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                    S.Arrow

                                                    An arrow in bind has the form A ⟶ B ⟶ X where A ⟶ B is an arrow in T I for some I. and B ⟶ X is an arrow of S. This is the hom B ⟶ X, as an arrow.

                                                    Equations
                                                    • I.fromMiddle = { Y := I.middle, f := I.fromMiddleHom, hf := }
                                                    Instances For
                                                      theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.to_middle_condition {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                      (T I.fromMiddle).sieve.arrows I.toMiddleHom
                                                      noncomputable def CategoryTheory.GrothendieckTopology.Cover.Arrow.toMiddle {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                      (T I.fromMiddle).Arrow

                                                      An arrow in bind has the form A ⟶ B ⟶ X where A ⟶ B is an arrow in T I for some I. and B ⟶ X is an arrow of S. This is the hom A ⟶ B, as an arrow.

                                                      Equations
                                                      • I.toMiddle = { Y := I.Y, f := I.toMiddleHom, hf := }
                                                      Instances For
                                                        theorem CategoryTheory.GrothendieckTopology.Cover.Arrow.middle_spec {C : Type u} [CategoryTheory.Category.{v, u} C] {J : CategoryTheory.GrothendieckTopology C} {X : C} {S : J.Cover X} {T : (I : S.Arrow) → J.Cover I.Y} (I : (S.bind T).Arrow) :
                                                        CategoryTheory.CategoryStruct.comp I.toMiddleHom I.fromMiddleHom = I.f
                                                        theorem CategoryTheory.GrothendieckTopology.Cover.Relation.ext_iff {C : Type u} :
                                                        ∀ {inst : CategoryTheory.Category.{v, u} C} {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (x y : S.Relation), x = y x.fst = y.fst x.snd = y.snd HEq x.r y.r
                                                        theorem CategoryTheory.GrothendieckTopology.Cover.Relation.ext {C : Type u} :
                                                        ∀ {inst : CategoryTheory.Category.{v, u} C} {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} (x y : S.Relation), x.fst = y.fstx.snd = y.sndHEq x.r y.rx = y

                                                        An auxiliary structure, used to define S.index.

                                                        • fst : S.Arrow

                                                          The first arrow.

                                                        • snd : S.Arrow

                                                          The second arrow.

                                                        • r : self.fst.Relation self.snd

                                                          The relation between the two arrows.

                                                        Instances For
                                                          @[simp]
                                                          theorem CategoryTheory.GrothendieckTopology.Cover.Relation.mk'_fst {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {fst : S.Arrow} {snd : S.Arrow} (r : fst.Relation snd) :
                                                          @[simp]
                                                          theorem CategoryTheory.GrothendieckTopology.Cover.Relation.mk'_snd {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {fst : S.Arrow} {snd : S.Arrow} (r : fst.Relation snd) :
                                                          @[simp]
                                                          theorem CategoryTheory.GrothendieckTopology.Cover.Relation.mk'_r {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {fst : S.Arrow} {snd : S.Arrow} (r : fst.Relation snd) :
                                                          def CategoryTheory.GrothendieckTopology.Cover.Relation.mk' {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {S : J.Cover X} {fst : S.Arrow} {snd : S.Arrow} (r : fst.Relation snd) :
                                                          S.Relation

                                                          Constructor for Cover.Relation which takes as an input r : I₁.Relation I₂ with I₁ I₂ : S.Arrow.

                                                          Equations
                                                          Instances For
                                                            @[simp]
                                                            theorem CategoryTheory.GrothendieckTopology.Cover.index_sndTo {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {D : Type u₁} [CategoryTheory.Category.{v₁, u₁} D] (S : J.Cover X) (P : CategoryTheory.Functor Cᵒᵖ D) (I : S.Relation) :
                                                            (S.index P).sndTo I = I.snd
                                                            @[simp]
                                                            theorem CategoryTheory.GrothendieckTopology.Cover.index_right {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {D : Type u₁} [CategoryTheory.Category.{v₁, u₁} D] (S : J.Cover X) (P : CategoryTheory.Functor Cᵒᵖ D) (I : S.Relation) :
                                                            (S.index P).right I = P.obj (Opposite.op I.r.Z)
                                                            @[simp]
                                                            @[simp]
                                                            theorem CategoryTheory.GrothendieckTopology.Cover.index_snd {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {D : Type u₁} [CategoryTheory.Category.{v₁, u₁} D] (S : J.Cover X) (P : CategoryTheory.Functor Cᵒᵖ D) (I : S.Relation) :
                                                            (S.index P).snd I = P.map I.r.g₂.op
                                                            @[simp]
                                                            theorem CategoryTheory.GrothendieckTopology.Cover.index_fst {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {D : Type u₁} [CategoryTheory.Category.{v₁, u₁} D] (S : J.Cover X) (P : CategoryTheory.Functor Cᵒᵖ D) (I : S.Relation) :
                                                            (S.index P).fst I = P.map I.r.g₁.op
                                                            @[simp]
                                                            theorem CategoryTheory.GrothendieckTopology.Cover.index_fstTo {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {J : CategoryTheory.GrothendieckTopology C} {D : Type u₁} [CategoryTheory.Category.{v₁, u₁} D] (S : J.Cover X) (P : CategoryTheory.Functor Cᵒᵖ D) (I : S.Relation) :
                                                            (S.index P).fstTo I = I.fst

                                                            To every S : J.Cover X and presheaf P, associate a MulticospanIndex.

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

                                                              The natural multifork associated to S : J.Cover X for a presheaf P. Saying that this multifork is a limit is essentially equivalent to the sheaf condition at the given object for the given covering sieve. See Sheaf.lean for an equivalent sheaf condition using this.

                                                              Equations
                                                              Instances For
                                                                @[reducible, inline]

                                                                The canonical map from P.obj (op X) to the multiequalizer associated to a covering sieve, assuming such a multiequalizer exists. This will be used in Sheaf.lean to provide an equivalent sheaf condition in terms of multiequalizers.

                                                                Equations
                                                                Instances For
                                                                  @[simp]
                                                                  theorem CategoryTheory.GrothendieckTopology.pullback_obj {C : Type u} [CategoryTheory.Category.{v, u} C] {X : C} {Y : C} (J : CategoryTheory.GrothendieckTopology C) (f : Y X) (S : J.Cover X) :
                                                                  (J.pullback f).obj S = S.pullback f

                                                                  Pull back a cover along a morphism.

                                                                  Equations
                                                                  • J.pullback f = { obj := fun (S : J.Cover X) => S.pullback f, map := fun {X_1 Y_1 : J.Cover X} (f_1 : X_1 Y_1) => .hom, map_id := , map_comp := }
                                                                  Instances For

                                                                    Pulling back along the identity is naturally isomorphic to the identity functor.

                                                                    Equations
                                                                    Instances For
                                                                      def CategoryTheory.GrothendieckTopology.pullbackComp {C : Type u} [CategoryTheory.Category.{v, u} C] (J : CategoryTheory.GrothendieckTopology C) {X : C} {Y : C} {Z : C} (f : X Y) (g : Y Z) :
                                                                      J.pullback (CategoryTheory.CategoryStruct.comp f g) (J.pullback g).comp (J.pullback f)

                                                                      Pulling back along a composition is naturally isomorphic to the composition of the pullbacks.

                                                                      Equations
                                                                      Instances For