Documentation

Mathlib.AlgebraicTopology.SimplicialSet.NerveAdjunction

The adjunction between the nerve and the homotopy category functor #

We define an adjunction nerveAdjunction : hoFunctor ⊣ nerveFunctor between the functor that takes a simplicial set to its homotopy category and the functor that takes a category to its nerve.

Up to natural isomorphism, this is constructed as the composite of two other adjunctions, namely nerve₂Adj : hoFunctor₂ ⊣ nerveFunctor₂ between analogously-defined functors involving the category of 2-truncated simplicial sets and coskAdj 2 : truncation 2 ⊣ Truncated.cosk 2. The aforementioned natural isomorphism

cosk₂Iso : nerveFunctor ≅ nerveFunctor₂ ⋙ Truncated.cosk 2

exists because nerves of categories are 2-coskeletal.

We also prove that nerveFunctor is fully faithful, demonstrating that nerveAdjunction is reflective. Since the category of simplicial sets is cocomplete, we conclude in Mathlib/CategoryTheory/Category/Cat/Colimit.lean that the category of categories has colimits.

Finally we show that hoFunctor : SSet.{u} ⥤ Cat.{u, u} preserves finite cartesian products; note that it fails to preserve infinite products.

The goal of this section is to define SSet.Truncated.liftOfStrictSegal which allows to construct of morphism X ⟶ Y of 2-truncated simplicial sets from the data of maps on 0- and 1-simplices when Y is strict Segal.

theorem SSet.Truncated.liftOfStrictSegal.hδ'₁ {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) (H : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝ })) (y : Y.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝¹ })), f₁ (X.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁴ _proof_15✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁵ _proof_15✝¹).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁶ _proof_15✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁷ _proof_15✝³).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁸ _proof_15✝⁴).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁹ _proof_15✝⁵).op y) (hY : Y.StrictSegal) (x : X.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝² })) :
theorem SSet.Truncated.liftOfStrictSegal.hσ'₀ {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) ( : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁶ })), f₁ (X.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁴ _proof_11✝⁷).op x) = Y.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁵ _proof_11✝⁸).op (f₀ x)) (hY : Y.StrictSegal) (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝⁴ })) :
theorem SSet.Truncated.liftOfStrictSegal.hσ'₁ {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) ( : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁶ })), f₁ (X.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁴ _proof_11✝⁷).op x) = Y.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁵ _proof_11✝⁸).op (f₀ x)) (hY : Y.StrictSegal) (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝⁴ })) :
theorem SSet.Truncated.liftOfStrictSegal.naturalityProperty_eq_top {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) (H : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝ })) (y : Y.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝¹ })), f₁ (X.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁴ _proof_15✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁵ _proof_15✝¹).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁶ _proof_15✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁷ _proof_15✝³).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁸ _proof_15✝⁴).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁹ _proof_15✝⁵).op y) ( : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁶ })), f₁ (X.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁴ _proof_11✝⁷).op x) = Y.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁵ _proof_11✝⁸).op (f₀ x)) (hY : Y.StrictSegal) :
naturalityProperty f₀ f₁ hδ₁ hδ₀ hY =
def SSet.Truncated.liftOfStrictSegal {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) (H : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝ })) (y : Y.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝¹ })), f₁ (X.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁴ _proof_15✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁵ _proof_15✝¹).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁶ _proof_15✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁷ _proof_15✝³).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁸ _proof_15✝⁴).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁹ _proof_15✝⁵).op y) ( : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁶ })), f₁ (X.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁴ _proof_11✝⁷).op x) = Y.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁵ _proof_11✝⁸).op (f₀ x)) (hY : Y.StrictSegal) :
X Y

Constructor for morphisms X ⟶ Y between 2-truncated simplicial sets from the data of maps on 0- and 1-simplices when Y is strict Segal.

Instances For
    @[simp]
    theorem SSet.Truncated.liftOfStrictSegal_app_0 {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) (H : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝ })) (y : Y.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝¹ })), f₁ (X.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁴ _proof_15✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁵ _proof_15✝¹).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁶ _proof_15✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁷ _proof_15✝³).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁸ _proof_15✝⁴).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁹ _proof_15✝⁵).op y) ( : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁶ })), f₁ (X.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁴ _proof_11✝⁷).op x) = Y.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁵ _proof_11✝⁸).op (f₀ x)) (hY : Y.StrictSegal) :
    (liftOfStrictSegal f₀ f₁ hδ₁ hδ₀ H hY).app (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁹ }) = f₀
    @[simp]
    theorem SSet.Truncated.liftOfStrictSegal_app_1 {X Y : Truncated 2} (f₀ : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝¹ })) (f₁ : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝ })Y.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹ })) (hδ₁ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝² })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝² _proof_13✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_11✝³ _proof_13✝¹).op (f₁ x)) (hδ₀ : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝³ })), f₀ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁴ _proof_13✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_11✝⁵ _proof_13✝³).op (f₁ x)) (H : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝ })) (y : Y.obj (Opposite.op { obj := SimplexCategory.mk 2, property := _proof_14✝¹ })), f₁ (X.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁴ _proof_15✝).op x) = Y.map (SimplexCategory.Truncated.δ₂ 2 _proof_12✝⁵ _proof_15✝¹).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁶ _proof_15✝²).op x) = Y.map (SimplexCategory.Truncated.δ₂ 0 _proof_12✝⁷ _proof_15✝³).op yf₁ (X.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁸ _proof_15✝⁴).op x) = Y.map (SimplexCategory.Truncated.δ₂ 1 _proof_12✝⁹ _proof_15✝⁵).op y) ( : ∀ (x : X.obj (Opposite.op { obj := SimplexCategory.mk 0, property := _proof_11✝⁶ })), f₁ (X.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁴ _proof_11✝⁷).op x) = Y.map (SimplexCategory.Truncated.σ₂ 0 _proof_13✝⁵ _proof_11✝⁸).op (f₀ x)) (hY : Y.StrictSegal) :
    (liftOfStrictSegal f₀ f₁ hδ₁ hδ₀ H hY).app (Opposite.op { obj := SimplexCategory.mk 1, property := _proof_12✝¹⁰ }) = f₁

    Given a 2-truncated simplicial set X and a category C, this is the functor X.HomotopyCategory ⥤ C corresponding to a morphism X ⟶ (truncation 2).obj (nerve C).

    Instances For

      Given a 2-truncated simplicial set X and a category C, this is the morphism X ⟶ (truncation 2).obj (nerve C) corresponding to a functor X.HomotopyCategory ⥤ C.

      Instances For

        Given a 2-truncated simplicial set X and a category C, this is the bijection between morphism X.HomotopyCategory ⥤ C and X ⟶ (truncation 2).obj (nerve C) which is part of the adjunction SSet.Truncated.nerve₂Adj.

        Instances For

          The adjunction between the 2-truncated homotopy category functor and the 2-truncated nerve functor.

          Instances For

            The functor C ⥤ D that is reconstructed for a morphism between the 2-truncated nerves.

            Instances For

              The 2-truncated nerve functor is fully faithful.

              Instances For

                The adjunction between the nerve functor and the homotopy category functor is, up to isomorphism, the composite of the adjunctions SSet.coskAdj 2 and nerve₂Adj.

                Instances For

                  Repleteness exists for full and faithful functors but not fully faithful functors, which is why we do this inefficiently.

                  The nerve functor is both full and faithful and thus is fully faithful.

                  Instances For

                    The counit map of nerveAdjunction is an isomorphism since the nerve functor is fully faithful.

                    Instances For

                      The functor hoFunctor : SSet ⥤ Cat preserves binary products of simplicial sets X and Y.

                      The functor hoFunctor : SSet ⥤ Cat preserves limits of functors out of Discrete WalkingPair.

                      The functor hoFunctor : SSet ⥤ Cat preserves finite products of simplicial sets.