Documentation

TauCeti.AlgebraicTopology.SimplicialSet.Join.Basic

The join of simplicial sets #

The join K ⋆ L of simplicial sets K and L is the simplicial set whose n-simplices are the decompositions of the vertices {0, …, n} into an initial segment I and a final segment J, together with a simplex of K with vertices I and a simplex of L with vertices J, where a simplex on the empty set of vertices is a single point. Thus K and L are the parts of K ⋆ L over the two vertices of Δ[1], and every simplex of K is joined to every simplex of L. The join is the operation through which cone and slice quasicategories, and hence limits and colimits in quasicategories, are defined: a cocone on a diagram Y ⟶ C is a map Y ⋆ Δ[0] ⟶ C extending it.

The decomposition of the vertices of a simplex is a map to Δ[1], and the simplices of K and L are maps from the parts over the vertices 0 and 1 of Δ[1]. Accordingly, a map from any simplicial set X to the join is described by join data (SSet.JoinData X K L): a map p : X ⟶ Δ[1] together with maps to K and L from the subcomplexes SSet.joinFiber p 0 and SSet.joinFiber p 1 of X lying over the two vertices. The join is the simplicial set of join data on standard simplices, and SSet.join.homEquiv identifies its maps from X with the join data on X.

Main definitions #

Main results #

Implementation notes #

The universal property reduces Joyal's theorem to horn filling in K, L and Δ[1] (SSet.JoinData.exists_precomp_horn_ι_eq): over Δ[1], an inner horn lies either entirely over one vertex, or so that its parts over both vertices are faces contained in the horn.

The pushout square SSet.Subcomplex.unionJoin.isPushout is obtained, as Mathlib's SSet.Subcomplex.unionProd.isPushout (Joël Riou and Jack McKoen) is for products, from the bicartesian square of subcomplexes formed by A ⋆ B, A ⋆ L, K ⋆ B and their union.

References #

def SSet.joinFiber {X : SSet} (p : X ⟶ stdSimplex.obj { len := 1 }) (e : Fin 2) :

The part of a simplicial set X lying over the vertex e of Δ[1] along p : X ⟶ Δ[1]: the subcomplex of the simplices all of whose vertices are sent to e.

Instances For
    @[simp]
    theorem SSet.mem_joinFiber_iff {X : SSet} (p : X ⟶ stdSimplex.obj { len := 1 }) (e : Fin 2) {d : ℕ} (x : X.obj (Opposite.op { len := d })) :
    x ∈ (joinFiber p e).obj (Opposite.op { len := d }) ↔ ∀ (j : Fin (d + 1)), ((CategoryTheory.ConcreteCategory.hom (p.app (Opposite.op { len := d }))) x) j = e
    @[simp]
    theorem SSet.joinFiber_const_self {X : SSet} (e : Fin 2) :

    The whole of X lies over the vertex e along the constant map at e.

    @[simp]
    theorem SSet.joinFiber_const_of_ne {X : SSet} {e e' : Fin 2} (h : e ≠ e') :

    Nothing lies over the vertex e' along the constant map at a different vertex e.

    @[simp]

    The part of X over the vertex e lies over e.

    @[simp]

    The part of X over the vertex e lies over e.

    theorem SSet.obj₀Equiv_symm_mem_joinFiber_iff {m : ℕ} (q : stdSimplex.obj { len := m } ⟶ stdSimplex.obj { len := 1 }) (e : Fin 2) (j : Fin (m + 1)) :

    The vertex j of Δ[m] lies over the vertex e of Δ[1] along q exactly when q sends j to e.

    theorem SSet.yonedaEquiv_apply_of_mem_joinFiber {d : ℕ} {q : stdSimplex.obj { len := d } ⟶ stdSimplex.obj { len := 1 }} {c : Fin 2} {a : ℕ} {y : (stdSimplex.obj { len := d }).obj (Opposite.op { len := a })} (hy : y ∈ (joinFiber q c).obj (Opposite.op { len := a })) (t : Fin (a + 1)) :
    (yonedaEquiv q) (y t) = c

    Every vertex of a simplex of Δ[d] over the vertex c of Δ[1] along q is sent to c by q.

    theorem SSet.joinFiber_hom_vertex_le {d k : ℕ} {q : stdSimplex.obj { len := d } ⟶ stdSimplex.obj { len := 1 }} {c : Fin 2} (g : (joinFiber q c).toSSet ⟶ stdSimplex.obj { len := k }) {j l : Fin (d + 1)} (hjl : j ≤ l) (hj : (yonedaEquiv q) j = c) (hl : (yonedaEquiv q) l = c) :

    A map to Δ[k] from the part of Δ[d] over a vertex c of Δ[1] is monotone on the vertices over c.

    noncomputable def SSet.joinFiberZeroRetraction {m : ℕ} (q : stdSimplex.obj { len := m } ⟶ stdSimplex.obj { len := 1 }) (h : (yonedaEquiv q) 0 = 0) :

    When the vertex 0 of Δ[m] lies over the vertex 0 of Δ[1] along q, the retraction of Δ[m] onto its part over 0, which collapses the vertices over 1 onto the last vertex over 0.

    Instances For
      theorem SSet.joinFiberZeroRetraction_app_of_mem {m : ℕ} (q : stdSimplex.obj { len := m } ⟶ stdSimplex.obj { len := 1 }) (h : (yonedaEquiv q) 0 = 0) {k : ℕ} (y : (stdSimplex.obj { len := m }).obj (Opposite.op { len := k })) (hy : y ∈ (joinFiber q 0).obj (Opposite.op { len := k })) :

      The retraction joinFiberZeroRetraction fixes the part of Δ[m] over 0.

      @[simp]

      The retraction joinFiberZeroRetraction is a retraction of the inclusion of the part of Δ[m] over 0.

      @[simp]

      The retraction joinFiberZeroRetraction is a retraction of the inclusion of the part of Δ[m] over 0.

      theorem SSet.joinFiber_one_eq_top {m : ℕ} {q : stdSimplex.obj { len := m } ⟶ stdSimplex.obj { len := 1 }} (h : (yonedaEquiv q) 0 ≠ 0) :

      If the vertex 0 of Δ[m] does not lie over 0 along q, the whole of Δ[m] lies over 1.

      structure SSet.JoinData (X K L : SSet) :

      The data of a map from X to the join of K and L: a map p : X ⟶ Δ[1], a map to K from the part of X over the vertex 0, and a map to L from the part of X over the vertex 1.

      Instances For
        theorem SSet.JoinData.ext {X K L : SSet} {d d' : X.JoinData K L} (hp : d.p = d'.p) (hl : ∀ (n : SimplexCategoryᵒᵖ) (x : X.obj n) (hx : x ∈ (joinFiber d.p 0).obj n) (hx' : x ∈ (joinFiber d'.p 0).obj n), (CategoryTheory.ConcreteCategory.hom (d.left.app n)) ⟨x, hx⟩ = (CategoryTheory.ConcreteCategory.hom (d'.left.app n)) ⟨x, hx'⟩) (hr : ∀ (n : SimplexCategoryᵒᵖ) (x : X.obj n) (hx : x ∈ (joinFiber d.p 1).obj n) (hx' : x ∈ (joinFiber d'.p 1).obj n), (CategoryTheory.ConcreteCategory.hom (d.right.app n)) ⟨x, hx⟩ = (CategoryTheory.ConcreteCategory.hom (d'.right.app n)) ⟨x, hx'⟩) :
        d = d'

        Join data are equal when their maps to Δ[1] agree and their maps to K and L agree on every simplex.

        theorem SSet.JoinData.ext_iff {X K L : SSet} {d d' : X.JoinData K L} :
        d = d' ↔ d.p = d'.p ∧ (∀ (n : SimplexCategoryᵒᵖ) (x : X.obj n) (hx : x ∈ (joinFiber d.p 0).obj n) (hx' : x ∈ (joinFiber d'.p 0).obj n), (CategoryTheory.ConcreteCategory.hom (d.left.app n)) ⟨x, hx⟩ = (CategoryTheory.ConcreteCategory.hom (d'.left.app n)) ⟨x, hx'⟩) ∧ ∀ (n : SimplexCategoryᵒᵖ) (x : X.obj n) (hx : x ∈ (joinFiber d.p 1).obj n) (hx' : x ∈ (joinFiber d'.p 1).obj n), (CategoryTheory.ConcreteCategory.hom (d.right.app n)) ⟨x, hx⟩ = (CategoryTheory.ConcreteCategory.hom (d'.right.app n)) ⟨x, hx'⟩
        theorem SSet.JoinData.congr_left_app {X K L : SSet} {d d' : X.JoinData K L} (h : d = d') {n : SimplexCategoryᵒᵖ} (x : X.obj n) (hx : x ∈ (joinFiber d.p 0).obj n) (hx' : x ∈ (joinFiber d'.p 0).obj n) :

        Equal join data have equal maps to K.

        theorem SSet.JoinData.congr_right_app {X K L : SSet} {d d' : X.JoinData K L} (h : d = d') {n : SimplexCategoryᵒᵖ} (x : X.obj n) (hx : x ∈ (joinFiber d.p 1).obj n) (hx' : x ∈ (joinFiber d'.p 1).obj n) :

        Equal join data have equal maps to L.

        def SSet.JoinData.precomp {X Y K L : SSet} (d : X.JoinData K L) (g : Y ⟶ X) :
        Y.JoinData K L

        The restriction of join data on X along a map g : Y ⟶ X.

        Instances For
          @[simp]
          theorem SSet.JoinData.precomp_p {X Y K L : SSet} (d : X.JoinData K L) (g : Y ⟶ X) :
          theorem SSet.JoinData.yonedaEquiv_precomp_p_apply {K L : SSet} {k k' : ℕ} (d : (stdSimplex.obj { len := k }).JoinData K L) (g : stdSimplex.obj { len := k' } ⟶ stdSimplex.obj { len := k }) (j : Fin (k' + 1)) :

          Along join data on Δ[k] restricted by g : Δ[k'] ⟶ Δ[k], the vertex j of Δ[k'] lies over the vertex of Δ[1] over which yonedaEquiv g j lies.

          @[simp]
          theorem SSet.JoinData.precomp_precomp {X Y Z K L : SSet} (d : X.JoinData K L) (g : Y ⟶ X) (h : Z ⟶ Y) :
          def SSet.JoinData.postcomp {X K L K' L' : SSet} (d : X.JoinData K L) (f : K ⟶ K') (g : L ⟶ L') :
          X.JoinData K' L'

          Composition of join data with maps f : K ⟶ K' and g : L ⟶ L'.

          Instances For
            @[simp]
            theorem SSet.JoinData.postcomp_p {X K L K' L' : SSet} (d : X.JoinData K L) (f : K ⟶ K') (g : L ⟶ L') :
            (d.postcomp f g).p = d.p
            @[simp]
            theorem SSet.JoinData.postcomp_left_app {X K L K' L' : SSet} (d : X.JoinData K L) (f : K ⟶ K') (g : L ⟶ L') {n : SimplexCategoryᵒᵖ} (x : X.obj n) (hx : x ∈ (joinFiber (d.postcomp f g).p 0).obj n) :
            @[simp]
            theorem SSet.JoinData.postcomp_right_app {X K L K' L' : SSet} (d : X.JoinData K L) (f : K ⟶ K') (g : L ⟶ L') {n : SimplexCategoryᵒᵖ} (x : X.obj n) (hx : x ∈ (joinFiber (d.postcomp f g).p 1).obj n) :
            @[simp]
            theorem SSet.JoinData.postcomp_postcomp {X K L K' L' K'' L'' : SSet} (d : X.JoinData K L) (f : K ⟶ K') (g : L ⟶ L') (f' : K' ⟶ K'') (g' : L' ⟶ L'') :
            theorem SSet.JoinData.precomp_postcomp {X Y K L K' L' : SSet} (d : X.JoinData K L) (h : Y ⟶ X) (f : K ⟶ K') (g : L ⟶ L') :
            (d.postcomp f g).precomp h = (d.precomp h).postcomp f g
            theorem SSet.JoinData.postcomp_injective {X K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') [CategoryTheory.Mono f] [CategoryTheory.Mono g] :
            Function.Injective fun (d : X.JoinData K L) => d.postcomp f g

            Composition of join data with monomorphisms is injective.

            Join data, as a presheaf on simplicial sets.

            Instances For
              @[simp]
              @[simp]
              theorem SSet.JoinData.functor_map (K L : SSet) {X✝ Y✝ : SSetᵒᵖ} (g : X✝ ⟶ Y✝) :
              (functor K L).map g = TypeCat.ofHom fun (d : (Opposite.unop X✝).JoinData K L) => d.precomp g.unop
              def SSet.join (K L : SSet) :

              The join K ⋆ L of simplicial sets K and L. Its n-simplices are the join data on Δ[n]: a splitting of the vertices of Δ[n] into an initial segment and a final segment, with a simplex of K on the first and a simplex of L on the second, either of which is omitted when its segment is empty.

              Instances For

                Restricting join data along the simplex x and evaluating its map to K on the top simplex gives the value of the map to K at x.

                Restricting join data along the simplex x and evaluating its map to L on the top simplex gives the value of the map to L at x.

                The n-simplices of the join K ⋆ L are the join data on Δ[n].

                Instances For
                  def SSet.join.π (K L : SSet) :
                  K.join L ⟶ stdSimplex.obj { len := 1 }

                  The projection of the join K ⋆ L to Δ[1].

                  Instances For

                    A simplex x of the join lies over the vertex e exactly when the top simplex of Δ[n] lies over e for the join data of x.

                    def SSet.join.univ (K L : SSet) :
                    (K.join L).JoinData K L

                    The tautological join data on the join K ⋆ L, corresponding to its identity map.

                    Instances For
                      @[simp]
                      theorem SSet.join.univ_p {K L : SSet} :
                      (univ K L).p = π K L

                      Restricting the tautological join data along a simplex x of the join gives the join data of x.

                      def SSet.join.homEquiv {X K L : SSet} :
                      (X ⟶ K.join L) ≃ X.JoinData K L

                      The universal property of the join: maps of simplicial sets X ⟶ K ⋆ L correspond to join data on X, that is, to a map p : X ⟶ Δ[1] together with maps to K and L from the parts of X over the vertices 0 and 1. The join data of a map F is the restriction of the tautological join data along F.

                      Instances For
                        theorem SSet.join.homEquiv_apply {X K L : SSet} (F : X ⟶ K.join L) :
                        @[simp]
                        theorem SSet.join.homEquiv_comp {X Y K L : SSet} (f : Y ⟶ X) (F : X ⟶ K.join L) :
                        @[simp]

                        The join data of a map F to the join has F ≫ π K L as its map to Δ[1].

                        The join K ⋆ L represents join data.

                        Instances For
                          def SSet.join.map {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') :
                          K.join L ⟶ K'.join L'

                          The map of joins K ⋆ L ⟶ K' ⋆ L' induced by maps f : K ⟶ K' and g : L ⟶ L'.

                          Instances For
                            @[simp]
                            theorem SSet.join.homEquiv_comp_map {X K L K' L' : SSet} (F : X ⟶ K.join L) (f : K ⟶ K') (g : L ⟶ L') :
                            instance SSet.join.mono_map {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') [CategoryTheory.Mono f] [CategoryTheory.Mono g] :

                            The join of two monomorphisms is a monomorphism.

                            @[simp]
                            theorem SSet.join.map_π {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') :
                            @[simp]
                            theorem SSet.join.map_π_assoc {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') {Z : SSet} (h : stdSimplex.obj { len := 1 } ⟶ Z) :
                            theorem SSet.join.map_comp {K L K' L' K'' L'' : SSet} (f : K ⟶ K') (g : L ⟶ L') (f' : K' ⟶ K'') (g' : L' ⟶ L'') :
                            def SSet.join.inl (K L : SSet) :
                            K ⟶ K.join L

                            The inclusion of K into the join K ⋆ L, as the part over the vertex 0.

                            Instances For
                              def SSet.join.inr (K L : SSet) :
                              L ⟶ K.join L

                              The inclusion of L into the join K ⋆ L, as the part over the vertex 1.

                              Instances For

                                On the part of K over the vertex 0, the inclusion of K is inverse to the map to K of the tautological join data.

                                On the part of L over the vertex 1, the inclusion of L is inverse to the map to L of the tautological join data.

                                The join data of the inclusion of K into K ⋆ L restrict to the identity of K over the vertex 0.

                                The join data of the inclusion of L into K ⋆ L restrict to the identity of L over the vertex 1.

                                @[simp]

                                Every simplex of the join over the vertex 0 is the inclusion of its image in K under the map to K of the tautological join data.

                                @[simp]

                                Every simplex of the join over the vertex 1 is the inclusion of its image in L under the map to L of the tautological join data.

                                On the part of the join over the vertex 0, the map to K of the tautological join data is inverse to the inclusion of K.

                                On the part of the join over the vertex 1, the map to L of the tautological join data is inverse to the inclusion of L.

                                The inclusion of K lands in the part of the join over the vertex 0.

                                The inclusion of L lands in the part of the join over the vertex 1.

                                The part of the join K ⋆ L over the vertex 0 is K, through the map to K of the tautological join data and the inclusion of K.

                                Instances For

                                  The part of the join K ⋆ L over the vertex 1 is L, through the map to L of the tautological join data and the inclusion of L.

                                  Instances For
                                    @[simp]

                                    The isomorphism joinFiberZeroIso is the map to K of the tautological join data.

                                    @[simp]

                                    The isomorphism joinFiberOneIso is the map to L of the tautological join data.

                                    @[simp]

                                    The inverse of joinFiberZeroIso is the inclusion of K.

                                    @[simp]

                                    The inverse of joinFiberOneIso is the inclusion of L.

                                    @[simp]
                                    theorem SSet.join.inl_map {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') :
                                    @[simp]
                                    theorem SSet.join.inr_map {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') :

                                    The join of two terminal simplicial sets, such as Δ[0] ⋆ Δ[0], is Δ[1], through the projection π K L.

                                    Instances For

                                      When L is empty, the whole join K ⋆ L lies over the vertex 0: a vertex over 1 would be a vertex of L.

                                      When K is empty, the whole join K ⋆ L lies over the vertex 1: a vertex over 0 would be a vertex of K.

                                      When L is empty, the inclusion K ⟶ K ⋆ L is an isomorphism.

                                      When K is empty, the inclusion L ⟶ K ⋆ L is an isomorphism.

                                      def SSet.join.edgeMk {K L : SSet} (x : K.obj (Opposite.op { len := 0 })) (y : L.obj (Opposite.op { len := 0 })) :

                                      The edge of the join K ⋆ L from a vertex x of K to a vertex y of L: the join data on Δ[1] splitting its vertices as {0} and {1}, with the constant maps at x and y.

                                      Instances For
                                        @[simp]
                                        theorem SSet.join.objEquiv_edgeMk_edge {K L : SSet} (x : K.obj (Opposite.op { len := 0 })) (y : L.obj (Opposite.op { len := 0 })) :
                                        objEquiv (edgeMk x y).edge = { p := CategoryTheory.CategoryStruct.id (stdSimplex.obj { len := 1 }), left := const x, right := const y }

                                        The join data of the edge edgeMk x y on Δ[1].

                                        theorem SSet.join.edge_mem_joinFiber_zero {K L : SSet} {v w : (K.join L).obj (Opposite.op { len := 0 })} (e : Edge v w) (hw : w ∈ (joinFiber (univ K L).p 0).obj (Opposite.op { len := 0 })) :
                                        e.edge ∈ (joinFiber (univ K L).p 0).obj (Opposite.op { len := 1 })

                                        An edge of the join K ⋆ L whose target lies over the vertex 0 lies over 0, since the projection to Δ[1] is monotone along the edge.

                                        @[simp]

                                        The map from a standard simplex given by the join data of a simplex s of the join is the map yonedaEquiv.symm s corresponding to s.

                                        theorem SSet.join.exists_eq_comp_inr {K L : SSet} {m : ℕ} (t : stdSimplex.obj { len := m } ⟶ K.join L) (h : (yonedaEquiv (homEquiv t).p) 0 ≠ 0) :
                                        ∃ (l : stdSimplex.obj { len := m } ⟶ L), t = CategoryTheory.CategoryStruct.comp l (inr K L)

                                        A simplex t of K ⋆ L none of whose vertices lies over 0 comes from L.

                                        A simplex of K ⋆ L with join data e whose vertex 0 lies over 0 is the image, under g ⋆ L, of the simplex of Δ[m] ⋆ L with the same splitting and the same part in L, where g : Δ[m] ⟶ K extends the part of e in K along the retraction joinFiberZeroRetraction.

                                        Every simplex of K ⋆ L either comes from L, or is the image of a simplex of Δ[m] ⋆ L under g ⋆ L for a simplex g : Δ[m] ⟶ K.

                                        @[simp]
                                        theorem SSet.join.objEquiv_map_app {K L K' L' : SSet} (f : K ⟶ K') (g : L ⟶ L') {n : SimplexCategory} (s : (K.join L).obj (Opposite.op n)) :

                                        The join data of the image of a simplex s under f ⋆ g is the composition of the join data of s with f and g.

                                        A simplex of K ⋆ L lies in the image of A ⋆ L for a subcomplex A of K exactly when its part in K lies in A.

                                        A simplex of K ⋆ L lies in the image of K ⋆ B for a subcomplex B of L exactly when its part in L lies in B.

                                        For subcomplexes A of K and B of L, the subcomplex (A ⋆ L) ∪ (K ⋆ B) of K ⋆ L: the domain of the pushout-join of the inclusions of A and B.

                                        Instances For

                                          (A ⋆ L) ∪ (K ⋆ B) is the union of the images of A ⋆ L and K ⋆ B in K ⋆ L.

                                          The image of A ⋆ L in K ⋆ L is contained in (A ⋆ L) ∪ (K ⋆ B).

                                          The image of K ⋆ B in K ⋆ L is contained in (A ⋆ L) ∪ (K ⋆ B).

                                          (A ⋆ L) ∪ (K ⋆ B) is contained in a subcomplex Z of K ⋆ L exactly when the images of A ⋆ L and K ⋆ B are.

                                          A simplex of K ⋆ L lies in (A ⋆ L) ∪ (K ⋆ B) exactly when its part in K lies in A or its part in L lies in B.

                                          The images of A ⋆ L and K ⋆ B in K ⋆ L meet in the image of A ⋆ B.

                                          noncomputable def SSet.Subcomplex.unionJoin.ι₁ {K L : SSet} (A : K.Subcomplex) (B : L.Subcomplex) :

                                          The inclusion A ⋆ L ⟶ (A ⋆ L) ∪ (K ⋆ B).

                                          Instances For
                                            noncomputable def SSet.Subcomplex.unionJoin.ι₂ {K L : SSet} (A : K.Subcomplex) (B : L.Subcomplex) :

                                            The inclusion K ⋆ B ⟶ (A ⋆ L) ∪ (K ⋆ B).

                                            Instances For

                                              In the lattice of subcomplexes of K ⋆ L, the square formed by the images of A ⋆ B, A ⋆ L, K ⋆ B and their union (A ⋆ L) ∪ (K ⋆ B) is bicartesian.

                                              (A ⋆ L) ∪ (K ⋆ B) is the pushout of A ⋆ L and K ⋆ B along A ⋆ B. Hence maps out of the domain of the pushout-join of the inclusions of A and B are glued from compatible maps out of A ⋆ L and K ⋆ B.

                                              theorem SSet.JoinData.exists_precomp_horn_ι_eq {K L : SSet} {n : ℕ} {i : Fin (n + 3)} (h₀ : 0 < i) (hₙ : i < Fin.last (n + 2)) [K.Quasicategory] [L.Quasicategory] (d : (horn (n + 2) i).toSSet.JoinData K L) :
                                              ∃ (D : (stdSimplex.obj { len := n + 2 }).JoinData K L), D.precomp (horn (n + 2) i).ι = d

                                              Inner horn extension for join data: if K and L are quasicategories, join data on an inner horn Λ[n + 2, i] is the restriction of join data on Δ[n + 2].

                                              Joyal: the join of two quasicategories is a quasicategory.