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.

Equations
    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).

      Equations
        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.

          Equations
            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.

              Equations
                Instances For

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

                  Equations
                    Instances For

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

                      Equations
                        Instances For

                          The 2-truncated nerve functor is fully faithful.

                          Equations
                            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.

                              Equations
                                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.

                                  Equations
                                    Instances For

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

                                      Equations
                                        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.