Skip to content

Commit b53dd02

Browse files
committed
feat: port AlgebraicTopology.DoldKan.FunctorGamma (#3566)
1 parent 33a04ca commit b53dd02

File tree

3 files changed

+377
-0
lines changed

3 files changed

+377
-0
lines changed

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ import Mathlib.AlgebraicTopology.DoldKan.Compatibility
302302
import Mathlib.AlgebraicTopology.DoldKan.Decomposition
303303
import Mathlib.AlgebraicTopology.DoldKan.Degeneracies
304304
import Mathlib.AlgebraicTopology.DoldKan.Faces
305+
import Mathlib.AlgebraicTopology.DoldKan.FunctorGamma
305306
import Mathlib.AlgebraicTopology.DoldKan.FunctorN
306307
import Mathlib.AlgebraicTopology.DoldKan.Homotopies
307308
import Mathlib.AlgebraicTopology.DoldKan.NReflectsIso
Lines changed: 371 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,371 @@
1+
/-
2+
Copyright (c) 2022 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
6+
! This file was ported from Lean 3 source module algebraic_topology.dold_kan.functor_gamma
7+
! leanprover-community/mathlib commit 5b8284148e8149728f4b90624888d98c36284454
8+
! Please do not edit these lines, except to modify the commit id
9+
! if you have ported upstream changes.
10+
-/
11+
import Mathlib.AlgebraicTopology.DoldKan.SplitSimplicialObject
12+
13+
/-!
14+
15+
# Construction of the inverse functor of the Dold-Kan equivalence
16+
17+
18+
In this file, we construct the functor `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`
19+
which shall be the inverse functor of the Dold-Kan equivalence in the case of abelian categories,
20+
and more generally pseudoabelian categories.
21+
22+
By definition, when `K` is a chain_complex, `Γ₀.obj K` is a simplicial object which
23+
sends `Δ : SimplexCategoryᵒᵖ` to a certain coproduct indexed by the set
24+
`Splitting.IndexSet Δ` whose elements consists of epimorphisms `e : Δ.unop ⟶ Δ'.unop`
25+
(with `Δ' : SimplexCategoryᵒᵖ`); the summand attached to such an `e` is `K.X Δ'.unop.len`.
26+
By construction, `Γ₀.obj K` is a split simplicial object whose splitting is `Γ₀.splitting K`.
27+
28+
We also construct `Γ₂ : Karoubi (ChainComplex C ℕ) ⥤ Karoubi (SimplicialObject C)`
29+
which shall be an equivalence for any additive category `C`.
30+
31+
-/
32+
33+
34+
noncomputable section
35+
36+
open CategoryTheory CategoryTheory.Category CategoryTheory.Limits SimplexCategory
37+
SimplicialObject Opposite CategoryTheory.Idempotents Simplicial DoldKan
38+
39+
namespace AlgebraicTopology
40+
41+
namespace DoldKan
42+
43+
variable {C : Type _} [Category C] [Preadditive C] (K K' : ChainComplex C ℕ) (f : K ⟶ K')
44+
{Δ Δ' Δ'' : SimplexCategory}
45+
46+
/-- `Isδ₀ i` is a simple condition used to check whether a monomorphism `i` in
47+
`SimplexCategory` identifies to the coface map `δ 0`. -/
48+
@[nolint unusedArguments]
49+
def Isδ₀ {Δ Δ' : SimplexCategory} (i : Δ' ⟶ Δ) [Mono i] : Prop :=
50+
Δ.len = Δ'.len + 1 ∧ i.toOrderHom 00
51+
#align algebraic_topology.dold_kan.is_δ₀ AlgebraicTopology.DoldKan.Isδ₀
52+
53+
namespace Isδ₀
54+
55+
theorem iff {j : ℕ} {i : Fin (j + 2)} : Isδ₀ (SimplexCategory.δ i) ↔ i = 0 := by
56+
constructor
57+
· rintro ⟨_, h₂⟩
58+
by_contra h
59+
exact h₂ (Fin.succAbove_ne_zero_zero h)
60+
· rintro rfl
61+
exact ⟨rfl, by dsimp ; exact Fin.succ_ne_zero 0
62+
#align algebraic_topology.dold_kan.is_δ₀.iff AlgebraicTopology.DoldKan.Isδ₀.iff
63+
64+
theorem eq_δ₀ {n : ℕ} {i : ([n] : SimplexCategory) ⟶ [n + 1]} [Mono i] (hi : Isδ₀ i) :
65+
i = SimplexCategory.δ 0 := by
66+
obtain ⟨j, rfl⟩ := SimplexCategory.eq_δ_of_mono i
67+
rw [iff] at hi
68+
rw [hi]
69+
#align algebraic_topology.dold_kan.is_δ₀.eq_δ₀ AlgebraicTopology.DoldKan.Isδ₀.eq_δ₀
70+
71+
end Isδ₀
72+
73+
namespace Γ₀
74+
75+
namespace Obj
76+
77+
/-- In the definition of `(Γ₀.obj K).obj Δ` as a direct sum indexed by `A : Splitting.IndexSet Δ`,
78+
the summand `summand K Δ A` is `K.X A.1.len`. -/
79+
def summand (Δ : SimplexCategoryᵒᵖ) (A : Splitting.IndexSet Δ) : C :=
80+
K.X A.1.unop.len
81+
#align algebraic_topology.dold_kan.Γ₀.obj.summand AlgebraicTopology.DoldKan.Γ₀.Obj.summand
82+
83+
/-- The functor `Γ₀` sends a chain complex `K` to the simplicial object which
84+
sends `Δ` to the direct sum of the objects `summand K Δ A` for all `A : Splitting.IndexSet Δ` -/
85+
def obj₂ (K : ChainComplex C ℕ) (Δ : SimplexCategoryᵒᵖ) [HasFiniteCoproducts C] : C :=
86+
fun A : Splitting.IndexSet Δ => summand K Δ A
87+
#align algebraic_topology.dold_kan.Γ₀.obj.obj₂ AlgebraicTopology.DoldKan.Γ₀.Obj.obj₂
88+
89+
namespace Termwise
90+
91+
/-- A monomorphism `i : Δ' ⟶ Δ` induces a morphism `K.X Δ.len ⟶ K.X Δ'.len` which
92+
is the identity if `Δ = Δ'`, the differential on the complex `K` if `i = δ 0`, and
93+
zero otherwise. -/
94+
def mapMono (K : ChainComplex C ℕ) {Δ' Δ : SimplexCategory} (i : Δ' ⟶ Δ) [Mono i] :
95+
K.X Δ.len ⟶ K.X Δ'.len := by
96+
by_cases Δ = Δ'
97+
· exact eqToHom (by congr )
98+
· by_cases Isδ₀ i
99+
· exact K.d Δ.len Δ'.len
100+
· exact 0
101+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono
102+
103+
variable (Δ)
104+
105+
theorem mapMono_id : mapMono K (𝟙 Δ) = 𝟙 _ := by
106+
unfold mapMono
107+
simp only [eq_self_iff_true, eqToHom_refl, dite_eq_ite, if_true]
108+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono_id AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono_id
109+
110+
variable {Δ}
111+
112+
theorem mapMono_δ₀' (i : Δ' ⟶ Δ) [Mono i] (hi : Isδ₀ i) : mapMono K i = K.d Δ.len Δ'.len := by
113+
unfold mapMono
114+
suffices Δ ≠ Δ' by
115+
simp only [dif_neg this, dif_pos hi]
116+
rintro rfl
117+
simpa only [self_eq_add_right, Nat.one_ne_zero] using hi.1
118+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono_δ₀' AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono_δ₀'
119+
120+
@[simp]
121+
theorem mapMono_δ₀ {n : ℕ} : mapMono K (δ (0 : Fin (n + 2))) = K.d (n + 1) n :=
122+
mapMono_δ₀' K _ (by rw [Isδ₀.iff])
123+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono_δ₀ AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono_δ₀
124+
125+
theorem mapMono_eq_zero (i : Δ' ⟶ Δ) [Mono i] (h₁ : Δ ≠ Δ') (h₂ : ¬Isδ₀ i) : mapMono K i = 0 := by
126+
unfold mapMono
127+
rw [Ne.def] at h₁
128+
split_ifs
129+
rfl
130+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono_eq_zero AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono_eq_zero
131+
132+
variable {K K'}
133+
134+
@[reassoc (attr := simp)]
135+
theorem mapMono_naturality (i : Δ ⟶ Δ') [Mono i] :
136+
mapMono K i ≫ f.f Δ.len = f.f Δ'.len ≫ mapMono K' i := by
137+
unfold mapMono
138+
split_ifs with h
139+
· subst h
140+
simp only [id_comp, eqToHom_refl, comp_id]
141+
· rw [HomologicalComplex.Hom.comm]
142+
· rw [zero_comp, comp_zero]
143+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono_naturality AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono_naturality
144+
145+
variable (K)
146+
147+
@[reassoc (attr := simp)]
148+
theorem mapMono_comp (i' : Δ'' ⟶ Δ') (i : Δ' ⟶ Δ) [Mono i'] [Mono i] :
149+
mapMono K i ≫ mapMono K i' = mapMono K (i' ≫ i) := by
150+
-- case where i : Δ' ⟶ Δ is the identity
151+
by_cases h₁ : Δ = Δ'
152+
· subst h₁
153+
simp only [SimplexCategory.eq_id_of_mono i, comp_id, id_comp, mapMono_id K, eqToHom_refl]
154+
-- case where i' : Δ'' ⟶ Δ' is the identity
155+
by_cases h₂ : Δ' = Δ''
156+
· subst h₂
157+
simp only [SimplexCategory.eq_id_of_mono i', comp_id, id_comp, mapMono_id K, eqToHom_refl]
158+
-- then the RHS is always zero
159+
obtain ⟨k, hk⟩ := Nat.exists_eq_add_of_lt (len_lt_of_mono i h₁)
160+
obtain ⟨k', hk'⟩ := Nat.exists_eq_add_of_lt (len_lt_of_mono i' h₂)
161+
have eq : Δ.len = Δ''.len + (k + k' + 2) := by linarith
162+
rw [mapMono_eq_zero K (i' ≫ i) _ _]; rotate_left
163+
· by_contra h
164+
simp only [self_eq_add_right, h, add_eq_zero_iff, and_false] at eq
165+
· by_contra h
166+
simp only [h.1, add_right_inj] at eq
167+
linarith
168+
-- in all cases, the LHS is also zero, either by definition, or because d ≫ d = 0
169+
by_cases h₃ : Isδ₀ i
170+
· by_cases h₄ : Isδ₀ i'
171+
· rw [mapMono_δ₀' K i h₃, mapMono_δ₀' K i' h₄, HomologicalComplex.d_comp_d]
172+
· simp only [mapMono_eq_zero K i' h₂ h₄, comp_zero]
173+
· simp only [mapMono_eq_zero K i h₁ h₃, zero_comp]
174+
#align algebraic_topology.dold_kan.Γ₀.obj.termwise.map_mono_comp AlgebraicTopology.DoldKan.Γ₀.Obj.Termwise.mapMono_comp
175+
176+
end Termwise
177+
178+
variable [HasFiniteCoproducts C]
179+
180+
/-- The simplicial morphism on the simplicial object `Γ₀.obj K` induced by
181+
a morphism `Δ' → Δ` in `SimplexCategory` is defined on each summand
182+
associated to an `A : Splitting.IndexSet Δ` in terms of the epi-mono factorisation
183+
of `θ ≫ A.e`. -/
184+
def map (K : ChainComplex C ℕ) {Δ' Δ : SimplexCategoryᵒᵖ} (θ : Δ ⟶ Δ') : obj₂ K Δ ⟶ obj₂ K Δ' :=
185+
Sigma.desc fun A =>
186+
Termwise.mapMono K (image.ι (θ.unop ≫ A.e)) ≫ Sigma.ι (summand K Δ') (A.pull θ)
187+
#align algebraic_topology.dold_kan.Γ₀.obj.map AlgebraicTopology.DoldKan.Γ₀.Obj.map
188+
189+
@[reassoc]
190+
theorem map_on_summand₀ {Δ Δ' : SimplexCategoryᵒᵖ} (A : Splitting.IndexSet Δ) {θ : Δ ⟶ Δ'}
191+
{Δ'' : SimplexCategory} {e : Δ'.unop ⟶ Δ''} {i : Δ'' ⟶ A.1.unop} [Epi e] [Mono i]
192+
(fac : e ≫ i = θ.unop ≫ A.e) :
193+
Sigma.ι (summand K Δ) A ≫ map K θ =
194+
Termwise.mapMono K i ≫ Sigma.ι (summand K Δ') (Splitting.IndexSet.mk e) := by
195+
simp only [map, colimit.ι_desc, Cofan.mk_ι_app]
196+
have h := SimplexCategory.image_eq fac
197+
subst h
198+
congr
199+
· exact SimplexCategory.image_ι_eq fac
200+
· dsimp only [SimplicialObject.Splitting.IndexSet.pull]
201+
congr
202+
exact SimplexCategory.factorThruImage_eq fac
203+
#align algebraic_topology.dold_kan.Γ₀.obj.map_on_summand₀ AlgebraicTopology.DoldKan.Γ₀.Obj.map_on_summand₀
204+
205+
@[reassoc]
206+
theorem map_on_summand₀' {Δ Δ' : SimplexCategoryᵒᵖ} (A : Splitting.IndexSet Δ) (θ : Δ ⟶ Δ') :
207+
Sigma.ι (summand K Δ) A ≫ map K θ =
208+
Termwise.mapMono K (image.ι (θ.unop ≫ A.e)) ≫ Sigma.ι (summand K _) (A.pull θ) :=
209+
map_on_summand₀ K A (A.fac_pull θ)
210+
#align algebraic_topology.dold_kan.Γ₀.obj.map_on_summand₀' AlgebraicTopology.DoldKan.Γ₀.Obj.map_on_summand₀'
211+
212+
end Obj
213+
214+
variable [HasFiniteCoproducts C]
215+
216+
/-- The functor `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`, on objects. -/
217+
@[simps]
218+
def obj (K : ChainComplex C ℕ) : SimplicialObject C where
219+
obj Δ := Obj.obj₂ K Δ
220+
map θ := Obj.map K θ
221+
map_id Δ := colimit.hom_ext (fun ⟨A⟩ => by
222+
dsimp
223+
have fac : A.e ≫ 𝟙 A.1.unop = (𝟙 Δ).unop ≫ A.e := by rw [unop_id, comp_id, id_comp]
224+
erw [Obj.map_on_summand₀ K A fac, Obj.Termwise.mapMono_id, id_comp, comp_id]
225+
rfl)
226+
map_comp {Δ'' Δ' Δ} θ' θ := colimit.hom_ext (fun ⟨A⟩ => by
227+
have fac : θ.unop ≫ θ'.unop ≫ A.e = (θ' ≫ θ).unop ≫ A.e := by rw [unop_comp, assoc]
228+
rw [← image.fac (θ'.unop ≫ A.e), ← assoc, ←
229+
image.fac (θ.unop ≫ factorThruImage (θ'.unop ≫ A.e)), assoc] at fac
230+
simp only [Obj.map_on_summand₀'_assoc K A θ', Obj.map_on_summand₀' K _ θ,
231+
Obj.Termwise.mapMono_comp_assoc, Obj.map_on_summand₀ K A fac]
232+
rfl)
233+
#align algebraic_topology.dold_kan.Γ₀.obj AlgebraicTopology.DoldKan.Γ₀.obj
234+
235+
236+
theorem splitting_map_eq_id (Δ : SimplexCategoryᵒᵖ) :
237+
SimplicialObject.Splitting.map (Γ₀.obj K)
238+
(fun n : ℕ => Sigma.ι (Γ₀.Obj.summand K (op [n])) (Splitting.IndexSet.id (op [n]))) Δ =
239+
𝟙 _ := colimit.hom_ext (fun ⟨A⟩ => by
240+
induction' Δ using Opposite.rec' with Δ
241+
induction' Δ using SimplexCategory.rec with n
242+
dsimp [Splitting.map]
243+
simp only [colimit.ι_desc, Cofan.mk_ι_app, Γ₀.obj_map]
244+
erw [Γ₀.Obj.map_on_summand₀ K (SimplicialObject.Splitting.IndexSet.id A.1)
245+
(show A.e ≫ 𝟙 _ = A.e.op.unop ≫ 𝟙 _ by rfl),
246+
Γ₀.Obj.Termwise.mapMono_id, A.ext', id_comp, comp_id]
247+
rfl)
248+
#align algebraic_topology.dold_kan.Γ₀.splitting_map_eq_id AlgebraicTopology.DoldKan.Γ₀.splitting_map_eq_id
249+
250+
/-- By construction, the simplicial `Γ₀.obj K` is equipped with a splitting. -/
251+
def splitting (K : ChainComplex C ℕ) : SimplicialObject.Splitting (Γ₀.obj K) where
252+
N n := K.X n
253+
ι n := Sigma.ι (Γ₀.Obj.summand K (op [n])) (Splitting.IndexSet.id (op [n]))
254+
map_isIso Δ := by
255+
rw [Γ₀.splitting_map_eq_id]
256+
apply IsIso.id
257+
#align algebraic_topology.dold_kan.Γ₀.splitting AlgebraicTopology.DoldKan.Γ₀.splitting
258+
259+
@[simp 1100]
260+
theorem splitting_iso_hom_eq_id (Δ : SimplexCategoryᵒᵖ) : ((splitting K).iso Δ).hom = 𝟙 _ :=
261+
splitting_map_eq_id K Δ
262+
#align algebraic_topology.dold_kan.Γ₀.splitting_iso_hom_eq_id AlgebraicTopology.DoldKan.Γ₀.splitting_iso_hom_eq_id
263+
264+
@[reassoc]
265+
theorem Obj.map_on_summand {Δ Δ' : SimplexCategoryᵒᵖ} (A : Splitting.IndexSet Δ) (θ : Δ ⟶ Δ')
266+
{Δ'' : SimplexCategory} {e : Δ'.unop ⟶ Δ''} {i : Δ'' ⟶ A.1.unop} [Epi e] [Mono i]
267+
(fac : e ≫ i = θ.unop ≫ A.e) :
268+
(Γ₀.splitting K).ιSummand A ≫ (Γ₀.obj K).map θ =
269+
Γ₀.Obj.Termwise.mapMono K i ≫ (Γ₀.splitting K).ιSummand (Splitting.IndexSet.mk e) := by
270+
dsimp only [SimplicialObject.Splitting.ιSummand, SimplicialObject.Splitting.ιCoprod]
271+
simp only [assoc, Γ₀.splitting_iso_hom_eq_id, id_comp, comp_id]
272+
exact Γ₀.Obj.map_on_summand₀ K A fac
273+
#align algebraic_topology.dold_kan.Γ₀.obj.map_on_summand AlgebraicTopology.DoldKan.Γ₀.Obj.map_on_summand
274+
275+
@[reassoc]
276+
theorem Obj.map_on_summand' {Δ Δ' : SimplexCategoryᵒᵖ} (A : Splitting.IndexSet Δ) (θ : Δ ⟶ Δ') :
277+
(splitting K).ιSummand A ≫ (obj K).map θ =
278+
Obj.Termwise.mapMono K (image.ι (θ.unop ≫ A.e)) ≫ (splitting K).ιSummand (A.pull θ) := by
279+
apply Obj.map_on_summand
280+
apply image.fac
281+
#align algebraic_topology.dold_kan.Γ₀.obj.map_on_summand' AlgebraicTopology.DoldKan.Γ₀.Obj.map_on_summand'
282+
283+
@[reassoc]
284+
theorem Obj.mapMono_on_summand_id {Δ Δ' : SimplexCategory} (i : Δ' ⟶ Δ) [Mono i] :
285+
(splitting K).ιSummand (Splitting.IndexSet.id (op Δ)) ≫ (obj K).map i.op =
286+
Obj.Termwise.mapMono K i ≫ (splitting K).ιSummand (Splitting.IndexSet.id (op Δ')) :=
287+
Obj.map_on_summand K (Splitting.IndexSet.id (op Δ)) i.op (rfl : 𝟙 _ ≫ i = i ≫ 𝟙 _)
288+
#align algebraic_topology.dold_kan.Γ₀.obj.map_mono_on_summand_id AlgebraicTopology.DoldKan.Γ₀.Obj.mapMono_on_summand_id
289+
290+
@[reassoc]
291+
theorem Obj.map_epi_on_summand_id {Δ Δ' : SimplexCategory} (e : Δ' ⟶ Δ) [Epi e] :
292+
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op Δ)) ≫ (Γ₀.obj K).map e.op =
293+
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.mk e) := by
294+
simpa only [Γ₀.Obj.map_on_summand K (Splitting.IndexSet.id (op Δ)) e.op
295+
(rfl : e ≫ 𝟙 Δ = e ≫ 𝟙 Δ),
296+
Γ₀.Obj.Termwise.mapMono_id] using id_comp _
297+
#align algebraic_topology.dold_kan.Γ₀.obj.map_epi_on_summand_id AlgebraicTopology.DoldKan.Γ₀.Obj.map_epi_on_summand_id
298+
299+
/-- The functor `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`, on morphisms. -/
300+
@[simps]
301+
def map {K K' : ChainComplex C ℕ} (f : K ⟶ K') : obj K ⟶ obj K' where
302+
app Δ := (Γ₀.splitting K).desc Δ fun A => f.f A.1.unop.len ≫ (Γ₀.splitting K').ιSummand A
303+
naturality {Δ' Δ} θ := by
304+
apply (Γ₀.splitting K).hom_ext'
305+
intro A
306+
simp only [(splitting K).ι_desc_assoc, Obj.map_on_summand'_assoc K _ θ, (splitting K).ι_desc,
307+
assoc, Obj.map_on_summand' K' _ θ]
308+
apply Obj.Termwise.mapMono_naturality_assoc
309+
#align algebraic_topology.dold_kan.Γ₀.map AlgebraicTopology.DoldKan.Γ₀.map
310+
311+
end Γ₀
312+
313+
variable [HasFiniteCoproducts C]
314+
315+
/-- The functor `Γ₀' : ChainComplex C ℕ ⥤ SimplicialObject.Split C`
316+
that induces `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`, which
317+
shall be the inverse functor of the Dold-Kan equivalence for
318+
abelian or pseudo-abelian categories. -/
319+
@[simps]
320+
def Γ₀' : ChainComplex C ℕ ⥤ SimplicialObject.Split C where
321+
obj K := SimplicialObject.Split.mk' (Γ₀.splitting K)
322+
map {K K'} f :=
323+
{ F := Γ₀.map f
324+
f := f.f
325+
comm := fun n => by
326+
dsimp
327+
simp only [← Splitting.ιSummand_id, (Γ₀.splitting K).ι_desc]
328+
rfl }
329+
#align algebraic_topology.dold_kan.Γ₀' AlgebraicTopology.DoldKan.Γ₀'
330+
331+
/-- The functor `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`, which is
332+
the inverse functor of the Dold-Kan equivalence when `C` is an abelian
333+
category, or more generally a pseudoabelian category. -/
334+
@[simps!]
335+
def Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C :=
336+
Γ₀' ⋙ Split.forget _
337+
#align algebraic_topology.dold_kan.Γ₀ AlgebraicTopology.DoldKan.Γ₀
338+
339+
/-- The extension of `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`
340+
on the idempotent completions. It shall be an equivalence of categories
341+
for any additive category `C`. -/
342+
@[simps!]
343+
def Γ₂ : Karoubi (ChainComplex C ℕ) ⥤ Karoubi (SimplicialObject C) :=
344+
(CategoryTheory.Idempotents.functorExtension₂ _ _).obj Γ₀
345+
#align algebraic_topology.dold_kan.Γ₂ AlgebraicTopology.DoldKan.Γ₂
346+
347+
theorem HigherFacesVanish.on_Γ₀_summand_id (K : ChainComplex C ℕ) (n : ℕ) :
348+
HigherFacesVanish (n + 1) ((Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op [n + 1]))) := by
349+
intro j _
350+
have eq := Γ₀.Obj.mapMono_on_summand_id K (SimplexCategory.δ j.succ)
351+
rw [Γ₀.Obj.Termwise.mapMono_eq_zero K, zero_comp] at eq; rotate_left
352+
· intro h
353+
exact (Nat.succ_ne_self n) (congr_arg SimplexCategory.len h)
354+
· exact fun h => Fin.succ_ne_zero j (by simpa only [Isδ₀.iff] using h)
355+
exact eq
356+
#align algebraic_topology.dold_kan.higher_faces_vanish.on_Γ₀_summand_id AlgebraicTopology.DoldKan.HigherFacesVanish.on_Γ₀_summand_id
357+
358+
@[reassoc (attr := simp)]
359+
theorem PInfty_on_Γ₀_splitting_summand_eq_self (K : ChainComplex C ℕ) {n : ℕ} :
360+
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op [n])) ≫ (PInfty : K[Γ₀.obj K] ⟶ _).f n =
361+
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op [n])) := by
362+
rw [PInfty_f]
363+
rcases n with _|n
364+
· simpa only [P_f_0_eq] using comp_id _
365+
· exact (HigherFacesVanish.on_Γ₀_summand_id K n).comp_P_eq_self
366+
set_option linter.uppercaseLean3 false in
367+
#align algebraic_topology.dold_kan.P_infty_on_Γ₀_splitting_summand_eq_self AlgebraicTopology.DoldKan.PInfty_on_Γ₀_splitting_summand_eq_self
368+
369+
end DoldKan
370+
371+
end AlgebraicTopology

Mathlib/AlgebraicTopology/SplitSimplicialObject.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,11 @@ variable {C}
419419

420420
namespace Split
421421

422+
-- porting note: added as `Hom.ext` is not triggered automatically
423+
@[ext]
424+
theorem hom_ext {S₁ S₂ : Split C} (Φ₁ Φ₂ : S₁ ⟶ S₂) (h : ∀ n : ℕ, Φ₁.f n = Φ₂.f n) : Φ₁ = Φ₂ :=
425+
Hom.ext _ _ h
426+
422427
theorem congr_F {S₁ S₂ : Split C} {Φ₁ Φ₂ : S₁ ⟶ S₂} (h : Φ₁ = Φ₂) : Φ₁.f = Φ₂.f := by rw [h]
423428
set_option linter.uppercaseLean3 false in
424429
#align simplicial_object.split.congr_F SimplicialObject.Split.congr_F

0 commit comments

Comments
 (0)