|
| 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 0 ≠ 0 |
| 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 |
0 commit comments