@@ -48,16 +48,53 @@ structure StrictSegal where
4848
4949/-- For an `n + 1`-truncated simplicial set `X`, `IsStrictSegal X` asserts the
5050mere existence of an inverse to `spine X m` for all `m ≤ n + 1`. -/
51- class IsStrictSegal : Prop where
52- segal (m : ℕ) (h : m ≤ n + 1 := by omega) : Function.Bijective (X.spine m)
51+ class IsStrictSegal (X : SSet.Truncated.{u} (n + 1 )) : Prop where
52+ spine_bijective (X) (m : ℕ) (h : m ≤ n + 1 := by grind) : Function.Bijective (X.spine m)
53+
54+ export IsStrictSegal (spine_bijective)
55+
56+ @[deprecated (since := "2025-11-04")] alias IsStrictSegal.segal := spine_bijective
57+
58+ lemma spine_injective (X : SSet.Truncated.{u} (n + 1 )) [X.IsStrictSegal]
59+ {m : ℕ} {h : m ≤ n + 1 } :
60+ Function.Injective (X.spine m) :=
61+ (spine_bijective X m).injective
62+
63+ lemma spine_surjective (X : SSet.Truncated.{u} (n + 1 )) [X.IsStrictSegal]
64+ {m : ℕ} (p : X.Path m) (h : m ≤ n + 1 := by grind) :
65+ ∃ (x : X _⦋m⦌ₙ₊₁), X.spine m _ x = p :=
66+ (spine_bijective X m).surjective p
67+
68+ variable {X} in
69+ lemma IsStrictSegal.ext [X.IsStrictSegal] {d : ℕ} {hd} {x y : X _⦋d + 1 ⦌ₙ₊₁}
70+ (h : ∀ (i : Fin (d + 1 )),
71+ X.map (SimplexCategory.Truncated.Hom.tr (mkOfSucc i)).op x =
72+ X.map (SimplexCategory.Truncated.Hom.tr (mkOfSucc i)).op y) :
73+ x = y :=
74+ X.spine_injective (by ext i; apply h)
75+
76+ variable {X} in
77+ lemma IsStrictSegal.hom_ext {Y : SSet.Truncated.{u} (n + 1 )} [Y.IsStrictSegal]
78+ {f g : X ⟶ Y} (h : ∀ (x : X _⦋1 ⦌ₙ₊₁), f.app _ x = g.app _ x) : f = g := by
79+ ext ⟨⟨m, hm⟩⟩ x
80+ induction m using SimplexCategory.rec with | _ m
81+ obtain _ | m := m
82+ · have fac := δ_comp_σ_self (i := (0 : Fin 1 ))
83+ dsimp at fac
84+ simpa [← FunctorToTypes.naturality,
85+ ← FunctorToTypes.map_comp_apply, ← op_comp,
86+ ← SimplexCategory.Truncated.Hom.tr_comp, fac] using
87+ congr_arg (Y.map (SimplexCategory.Truncated.Hom.tr (SimplexCategory.δ 0 )).op)
88+ (h (X.map (SimplexCategory.Truncated.Hom.tr (SimplexCategory.σ 0 )).op x))
89+ · exact IsStrictSegal.ext (fun i ↦ by simp only [← FunctorToTypes.naturality, h])
5390
5491namespace StrictSegal
5592
5693/-- Given `IsStrictSegal X`, a choice of inverse to `spine X m` for all
5794`m ≤ n + 1` determines an inhabitant of `StrictSegal X`. -/
5895noncomputable def ofIsStrictSegal [IsStrictSegal X] : StrictSegal X where
5996 spineToSimplex m h :=
60- Equiv.ofBijective (X.spine m) (IsStrictSegal.segal m h) |>.invFun
97+ Equiv.ofBijective (X.spine m) (X.spine_bijective m h) |>.invFun
6198 spine_spineToSimplex m _ :=
6299 funext <| Equiv.ofBijective (X.spine m) _ |>.right_inv
63100 spineToSimplex_spine m _ :=
@@ -102,7 +139,7 @@ end autoParam
102139/-- The unique existence of an inverse to `spine X m` for all `m ≤ n + 1`
103140implies the mere existence of such an inverse. -/
104141lemma isStrictSegal (sx : StrictSegal X) : IsStrictSegal X where
105- segal m h := sx.spineEquiv m h |>.bijective
142+ spine_bijective m h := sx.spineEquiv m h |>.bijective
106143
107144variable (m : ℕ) (h : m ≤ n + 1 )
108145
@@ -245,11 +282,15 @@ variable {X} (sx : StrictSegal X)
245282
246283/-- A `StrictSegal` structure on a simplicial set `X` restricts to a
247284`Truncated.StrictSegal` structure on the `n + 1`-truncation of `X`. -/
248- def truncation (n : ℕ) : truncation (n + 1 ) |>.obj X |>.StrictSegal where
285+ protected def truncation (n : ℕ) : truncation (n + 1 ) |>.obj X |>.StrictSegal where
249286 spineToSimplex _ _ := sx.spineToSimplex
250287 spine_spineToSimplex m _ := sx.spine_spineToSimplex m
251288 spineToSimplex_spine m _ := sx.spineToSimplex_spine m
252289
290+ instance [X.IsStrictSegal] (n : ℕ) :
291+ ((truncation (n + 1 )).obj X).IsStrictSegal :=
292+ ((ofIsStrictSegal X).truncation n).isStrictSegal
293+
253294@[simp]
254295lemma spine_spineToSimplex_apply {n : ℕ} (f : Path X n) :
255296 X.spine n (sx.spineToSimplex f) = f :=
@@ -386,6 +427,79 @@ lemma spine_δ_arrow_eq (h : j = i.succ.castSucc) :
386427 rw [mkOfSucc_δ_eq h, spineToSimplex_edge]
387428
388429end StrictSegal
430+
431+ /-- Helper structure in order to show that a simplicial set is strict Segal. -/
432+ structure StrictSegalCore (n : ℕ) where
433+ /-- Map which produces a `n + 1`-simplex from a `1`-simplex and a `n`-simplex when
434+ the target vertex of the `1`-simplex equals the zeroth simplex of the `n`-simplex. -/
435+ concat (x : X _⦋1 ⦌) (s : X _⦋n⦌) (h : X.δ 0 x = X.map (SimplexCategory.const _ _ 0 ).op s) :
436+ X _⦋n + 1 ⦌
437+ map_mkOfSucc_zero_concat x s h : X.map (mkOfSucc 0 ).op (concat x s h) = x
438+ δ₀_concat x s h : X.δ 0 (concat x s h) = s
439+ injective {x y : X _⦋n + 1 ⦌} (h : X.map (mkOfSucc 0 ).op x = X.map (mkOfSucc 0 ).op y)
440+ (h₀ : X.δ 0 x = X.δ 0 y) : x = y
441+
442+ namespace StrictSegalCore
443+
444+ variable {X} (h : ∀ n, X.StrictSegalCore n) {n : ℕ} (p : X.Path n)
445+
446+ /-- Auxiliary definition for `StrictSegalCore.spineToSimplex`. -/
447+ def spineToSimplexAux : { s : X _⦋n⦌ // X.spine _ s = p } := by
448+ induction n with
449+ | zero => exact ⟨p.vertex 0 , by aesop⟩
450+ | succ n hn =>
451+ refine ⟨(h n).concat (p.arrow 0 ) (hn (p.interval 1 n)).val ?_, ?_⟩
452+ · rw [p.arrow_tgt 0 ]
453+ exact Path.congr_vertex (hn (p.interval 1 n)).prop.symm 0
454+ · ext i
455+ obtain rfl | ⟨i, rfl⟩ := i.eq_zero_or_eq_succ
456+ · dsimp
457+ rw [map_mkOfSucc_zero_concat]
458+ · simpa [spine_arrow, ← SimplexCategory.mkOfSucc_δ_gt (j := 0 ) (i := i) (by simp),
459+ op_comp, FunctorToTypes.map_comp_apply, ← SimplicialObject.δ_def, δ₀_concat,
460+ ← p.arrow_interval 1 n i i.succ (by grind) (by grind [Fin.val_succ])] using
461+ Path.congr_arrow (hn (p.interval 1 n)).prop i
462+
463+ /-- Auxiliary definition for `StrictSegal.ofCore`. -/
464+ def spineToSimplex : X _⦋n⦌ := (spineToSimplexAux h p).val
465+
466+ @[simp]
467+ lemma spine_spineToSimplex : X.spine n (spineToSimplex h p) = p := (spineToSimplexAux h p).prop
468+
469+ lemma spineToSimplex_zero (p : X.Path 0 ) : spineToSimplex h p = p.vertex 0 := rfl
470+
471+ lemma spineToSimplex_succ (p : X.Path (n + 1 )) :
472+ spineToSimplex h p = (h n).concat (p.arrow 0 ) (spineToSimplex h (p.interval 1 n)) (by
473+ rw [p.arrow_tgt 0 ]
474+ exact Path.congr_vertex (spine_spineToSimplex h (p.interval 1 n)).symm 0 ) :=
475+ rfl
476+
477+ lemma map_mkOfSucc_zero_spineToSimplex (p : X.Path (n + 1 )) :
478+ X.map (mkOfSucc 0 ).op (spineToSimplex h p) = p.arrow 0 := by
479+ rw [spineToSimplex_succ, map_mkOfSucc_zero_concat]
480+
481+ lemma δ₀_spineToSimplex (p : X.Path (n + 1 )) :
482+ X.δ 0 (spineToSimplex h p) = spineToSimplex h (p.interval 1 n) := by
483+ rw [spineToSimplex_succ, δ₀_concat]
484+
485+ @[simp]
486+ lemma spineToSimplex_spine (s : X _⦋n⦌) : spineToSimplex h (X.spine _ s) = s := by
487+ induction n with
488+ | zero => simp [spineToSimplex_zero]
489+ | succ n hn =>
490+ exact (h n).injective (map_mkOfSucc_zero_spineToSimplex _ _)
491+ (by rw [δ₀_spineToSimplex, ← hn (X.δ 0 s), spine_δ₀])
492+
493+ end StrictSegalCore
494+
495+ variable {X} in
496+ /-- Given a simplicial set `X`, this constructs a `StrictSegal` structure for `X` from
497+ `StrictSegalCore` structures for all `n : ℕ`. -/
498+ def StrictSegal.ofCore (h : ∀ n, X.StrictSegalCore n) : X.StrictSegal where
499+ spineToSimplex := StrictSegalCore.spineToSimplex h
500+ spine_spineToSimplex := by aesop
501+ spineToSimplex_spine n := by aesop
502+
389503end SSet
390504
391505namespace CategoryTheory.Nerve
@@ -396,27 +510,16 @@ variable (C : Type u) [Category.{v} C]
396510
397511/-- Simplices in the nerve of categories are uniquely determined by their spine.
398512Indeed, this property describes the essential image of the nerve functor. -/
399- noncomputable def strictSegal : StrictSegal (nerve C) where
400- spineToSimplex {n} F :=
401- ComposableArrows.mkOfObjOfMapSucc (fun i ↦ (F.vertex i).obj 0 )
402- (fun i ↦ eqToHom (Functor.congr_obj (F.arrow_src i).symm 0 ) ≫
403- (F.arrow i).map' 0 1 ≫ eqToHom (Functor.congr_obj (F.arrow_tgt i) 0 ))
404- spine_spineToSimplex n := by
405- ext F i
406- · exact ComposableArrows.ext₀ rfl
407- · refine ComposableArrows.ext₁ ?_ ?_ ?_
408- · exact Functor.congr_obj (F.arrow_src i).symm 0
409- · exact Functor.congr_obj (F.arrow_tgt i).symm 0
410- · dsimp
411- apply ComposableArrows.mkOfObjOfMapSucc_map_succ
412- spineToSimplex_spine n := by
413- ext F
414- fapply ComposableArrows.ext
415- · intro i
416- rfl
417- · intro i hi
418- dsimp
419- exact ComposableArrows.mkOfObjOfMapSucc_map_succ _ _ i hi
513+ def strictSegal : StrictSegal (nerve C) :=
514+ StrictSegal.ofCore (fun n ↦
515+ { concat f s h := s.precomp (f.hom ≫ eqToHom (Functor.congr_obj h 0 ))
516+ map_mkOfSucc_zero_concat f s h :=
517+ ComposableArrows.ext₁ rfl (Functor.congr_obj h 0 ).symm (by cat_disch)
518+ δ₀_concat f s h := rfl
519+ injective {f g} h h₀ :=
520+ ComposableArrows.ext_succ (Functor.congr_obj h 0 ) h₀
521+ ((Arrow.mk_eq_mk_iff _ _).1
522+ (DFunLike.congr_arg ComposableArrows.arrowEquiv h)).2 .2 })
420523
421524instance isStrictSegal : IsStrictSegal (nerve C) :=
422525 strictSegal C |>.isStrictSegal
0 commit comments