Skip to content

Commit

Permalink
refactor(AlgebraicTopology): using the cofan API for SplitSimplicialO…
Browse files Browse the repository at this point in the history
…bject (#8531)

This PR changes the definition of a splitting of simplicial objects. The new definition makes a better use of the cofan API. As a result, it is no longer necessary to assume that the category has finite coproducts.
  • Loading branch information
joelriou committed Dec 27, 2023
1 parent c7483a3 commit f9e2c2c
Show file tree
Hide file tree
Showing 5 changed files with 136 additions and 188 deletions.
72 changes: 33 additions & 39 deletions Mathlib/AlgebraicTopology/DoldKan/FunctorGamma.lean
Expand Up @@ -231,65 +231,56 @@ def obj (K : ChainComplex C ℕ) : SimplicialObject C where
rfl)
#align algebraic_topology.dold_kan.Γ₀.obj AlgebraicTopology.DoldKan.Γ₀.obj


theorem splitting_map_eq_id (Δ : SimplexCategoryᵒᵖ) :
SimplicialObject.Splitting.map (Γ₀.obj K)
(fun n : ℕ => Sigma.ι (Γ₀.Obj.summand K (op [n])) (Splitting.IndexSet.id (op [n]))) Δ =
𝟙 _ := colimit.hom_ext (fun ⟨A⟩ => by
induction' Δ using Opposite.rec' with Δ
induction' Δ using SimplexCategory.rec with n
dsimp [Splitting.map]
simp only [colimit.ι_desc, Cofan.mk_ι_app, Γ₀.obj_map]
erw [Γ₀.Obj.map_on_summand₀ K (SimplicialObject.Splitting.IndexSet.id A.1)
(show A.e ≫ 𝟙 _ = A.e.op.unop ≫ 𝟙 _ by rfl),
Γ₀.Obj.Termwise.mapMono_id, A.ext', id_comp, comp_id]
rfl)
#align algebraic_topology.dold_kan.Γ₀.splitting_map_eq_id AlgebraicTopology.DoldKan.Γ₀.splitting_map_eq_id

/-- By construction, the simplicial `Γ₀.obj K` is equipped with a splitting. -/
def splitting (K : ChainComplex C ℕ) : SimplicialObject.Splitting (Γ₀.obj K) where
N n := K.X n
ι n := Sigma.ι (Γ₀.Obj.summand K (op [n])) (Splitting.IndexSet.id (op [n]))
map_isIso Δ := by
rw [Γ₀.splitting_map_eq_id]
apply IsIso.id
isColimit' Δ := IsColimit.ofIsoColimit (colimit.isColimit _) (Cofan.ext (Iso.refl _) (by
intro A
dsimp [Splitting.cofan']
rw [comp_id, Γ₀.Obj.map_on_summand₀ K (SimplicialObject.Splitting.IndexSet.id A.1)
(show A.e ≫ 𝟙 _ = A.e.op.unop ≫ 𝟙 _ by rfl), Γ₀.Obj.Termwise.mapMono_id]
dsimp
rw [id_comp]
rfl))
#align algebraic_topology.dold_kan.Γ₀.splitting AlgebraicTopology.DoldKan.Γ₀.splitting

@[simp 1100]
theorem splitting_iso_hom_eq_id (Δ : SimplexCategoryᵒᵖ) : ((splitting K).iso Δ).hom = 𝟙 _ :=
splitting_map_eq_id K Δ
#align algebraic_topology.dold_kan.Γ₀.splitting_iso_hom_eq_id AlgebraicTopology.DoldKan.Γ₀.splitting_iso_hom_eq_id

@[reassoc]
theorem Obj.map_on_summand {Δ Δ' : SimplexCategoryᵒᵖ} (A : Splitting.IndexSet Δ) (θ : Δ ⟶ Δ')
{Δ'' : SimplexCategory} {e : Δ'.unop ⟶ Δ''} {i : Δ'' ⟶ A.1.unop} [Epi e] [Mono i]
(fac : e ≫ i = θ.unop ≫ A.e) :
(Γ₀.splitting K).ιSummand A ≫ (Γ₀.obj K).map θ =
Γ₀.Obj.Termwise.mapMono K i ≫ (Γ₀.splitting K).ιSummand (Splitting.IndexSet.mk e) := by
dsimp only [SimplicialObject.Splitting.ιSummand, SimplicialObject.Splitting.ιCoprod]
simp only [assoc, Γ₀.splitting_iso_hom_eq_id, id_comp, comp_id]
exact Γ₀.Obj.map_on_summand₀ K A fac
((Γ₀.splitting K).cofan Δ).inj A ≫ (Γ₀.obj K).map θ =
Γ₀.Obj.Termwise.mapMono K i ≫ ((Γ₀.splitting K).cofan Δ').inj (Splitting.IndexSet.mk e) := by
dsimp [Splitting.cofan]
change (_ ≫ (Γ₀.obj K).map A.e.op) ≫ (Γ₀.obj K).map θ = _
rw [assoc, ← Functor.map_comp]
dsimp [splitting]
erw [Γ₀.Obj.map_on_summand₀ K (Splitting.IndexSet.id A.1)
(show e ≫ i = ((Splitting.IndexSet.e A).op ≫ θ).unop ≫ 𝟙 _ by rw [comp_id, fac]; rfl),
Γ₀.Obj.map_on_summand₀ K (Splitting.IndexSet.id (op Δ''))
(show e ≫ 𝟙 Δ'' = e.op.unop ≫ 𝟙 _ by simp), Termwise.mapMono_id, id_comp]
#align algebraic_topology.dold_kan.Γ₀.obj.map_on_summand AlgebraicTopology.DoldKan.Γ₀.Obj.map_on_summand

@[reassoc]
theorem Obj.map_on_summand' {Δ Δ' : SimplexCategoryᵒᵖ} (A : Splitting.IndexSet Δ) (θ : Δ ⟶ Δ') :
(splitting K).ιSummand A ≫ (obj K).map θ =
Obj.Termwise.mapMono K (image.ι (θ.unop ≫ A.e)) ≫ (splitting K).ιSummand (A.pull θ) := by
((splitting K).cofan Δ).inj A ≫ (obj K).map θ =
Obj.Termwise.mapMono K (image.ι (θ.unop ≫ A.e)) ≫
((splitting K).cofan Δ').inj (A.pull θ) := by
apply Obj.map_on_summand
apply image.fac
#align algebraic_topology.dold_kan.Γ₀.obj.map_on_summand' AlgebraicTopology.DoldKan.Γ₀.Obj.map_on_summand'

@[reassoc]
theorem Obj.mapMono_on_summand_id {Δ Δ' : SimplexCategory} (i : Δ' ⟶ Δ) [Mono i] :
(splitting K).ιSummand (Splitting.IndexSet.id (op Δ)) ≫ (obj K).map i.op =
Obj.Termwise.mapMono K i ≫ (splitting K).ιSummand (Splitting.IndexSet.id (op Δ')) :=
((splitting K).cofan _).inj (Splitting.IndexSet.id (op Δ)) ≫ (obj K).map i.op =
Obj.Termwise.mapMono K i ≫ ((splitting K).cofan _).inj (Splitting.IndexSet.id (op Δ')) :=
Obj.map_on_summand K (Splitting.IndexSet.id (op Δ)) i.op (rfl : 𝟙 _ ≫ i = i ≫ 𝟙 _)
#align algebraic_topology.dold_kan.Γ₀.obj.map_mono_on_summand_id AlgebraicTopology.DoldKan.Γ₀.Obj.mapMono_on_summand_id

@[reassoc]
theorem Obj.map_epi_on_summand_id {Δ Δ' : SimplexCategory} (e : Δ' ⟶ Δ) [Epi e] :
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op Δ)) ≫ (Γ₀.obj K).map e.op =
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.mk e) := by
((Γ₀.splitting K).cofan _).inj (Splitting.IndexSet.id (op Δ)) ≫ (Γ₀.obj K).map e.op =
((Γ₀.splitting K).cofan _).inj (Splitting.IndexSet.mk e) := by
simpa only [Γ₀.Obj.map_on_summand K (Splitting.IndexSet.id (op Δ)) e.op
(rfl : e ≫ 𝟙 Δ = e ≫ 𝟙 Δ),
Γ₀.Obj.Termwise.mapMono_id] using id_comp _
Expand All @@ -298,7 +289,8 @@ theorem Obj.map_epi_on_summand_id {Δ Δ' : SimplexCategory} (e : Δ' ⟶ Δ) [E
/-- The functor `Γ₀ : ChainComplex C ℕ ⥤ SimplicialObject C`, on morphisms. -/
@[simps]
def map {K K' : ChainComplex C ℕ} (f : K ⟶ K') : obj K ⟶ obj K' where
app Δ := (Γ₀.splitting K).desc Δ fun A => f.f A.1.unop.len ≫ (Γ₀.splitting K').ιSummand A
app Δ := (Γ₀.splitting K).desc Δ fun A => f.f A.1.unop.len ≫
((Γ₀.splitting K').cofan _).inj A
naturality {Δ' Δ} θ := by
apply (Γ₀.splitting K).hom_ext'
intro A
Expand All @@ -323,7 +315,7 @@ def Γ₀' : ChainComplex C ℕ ⥤ SimplicialObject.Split C where
f := f.f
comm := fun n => by
dsimp
simp only [← Splitting.ιSummand_id, (Γ₀.splitting K).ι_desc]
simp only [← Splitting.cofan_inj_id, (Γ₀.splitting K).ι_desc]
rfl }
#align algebraic_topology.dold_kan.Γ₀' AlgebraicTopology.DoldKan.Γ₀'

Expand All @@ -344,7 +336,8 @@ def Γ₂ : Karoubi (ChainComplex C ℕ) ⥤ Karoubi (SimplicialObject C) :=
#align algebraic_topology.dold_kan.Γ₂ AlgebraicTopology.DoldKan.Γ₂

theorem HigherFacesVanish.on_Γ₀_summand_id (K : ChainComplex C ℕ) (n : ℕ) :
HigherFacesVanish (n + 1) ((Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op [n + 1]))) := by
@HigherFacesVanish C _ _ (Γ₀.obj K) _ n (n + 1)
(((Γ₀.splitting K).cofan _).inj (Splitting.IndexSet.id (op [n + 1]))) := by
intro j _
have eq := Γ₀.Obj.mapMono_on_summand_id K (SimplexCategory.δ j.succ)
rw [Γ₀.Obj.Termwise.mapMono_eq_zero K, zero_comp] at eq; rotate_left
Expand All @@ -356,8 +349,9 @@ theorem HigherFacesVanish.on_Γ₀_summand_id (K : ChainComplex C ℕ) (n : ℕ)

@[reassoc (attr := simp)]
theorem PInfty_on_Γ₀_splitting_summand_eq_self (K : ChainComplex C ℕ) {n : ℕ} :
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op [n])) ≫ (PInfty : K[Γ₀.obj K] ⟶ _).f n =
(Γ₀.splitting K).ιSummand (Splitting.IndexSet.id (op [n])) := by
((Γ₀.splitting K).cofan _).inj (Splitting.IndexSet.id (op [n])) ≫
(PInfty : K[Γ₀.obj K] ⟶ _).f n =
((Γ₀.splitting K).cofan _).inj (Splitting.IndexSet.id (op [n])) := by
rw [PInfty_f]
rcases n with _|n
· simpa only [P_f_0_eq] using comp_id _
Expand Down
4 changes: 2 additions & 2 deletions Mathlib/AlgebraicTopology/DoldKan/GammaCompN.lean
Expand Up @@ -42,7 +42,7 @@ def Γ₀NondegComplexIso (K : ChainComplex C ℕ) : (Γ₀.splitting K).nondegC
rw [Fintype.sum_eq_single (0 : Fin (n + 2))]
· simp only [Fin.val_zero, pow_zero, one_zsmul]
erw [Γ₀.Obj.mapMono_on_summand_id_assoc, Γ₀.Obj.Termwise.mapMono_δ₀,
Splitting.ι_πSummand_eq_id, comp_id]
Splitting.cofan_inj_πSummand_eq_id, comp_id]
· intro i hi
dsimp
simp only [Preadditive.zsmul_comp, Preadditive.comp_zsmul, assoc]
Expand Down Expand Up @@ -172,7 +172,7 @@ set_option linter.uppercaseLean3 false in
@[simp]
theorem N₂Γ₂_inv_app_f_f (X : Karoubi (ChainComplex C ℕ)) (n : ℕ) :
(N₂Γ₂.inv.app X).f.f n =
X.p.f n ≫ (Γ₀.splitting X.X).ιSummand (Splitting.IndexSet.id (op [n])) := by
X.p.f n ≫ ((Γ₀.splitting X.X).cofan _).inj (Splitting.IndexSet.id (op [n])) := by
dsimp [N₂Γ₂]
simp only [whiskeringLeft_obj_preimage_app, NatTrans.comp_app, Functor.comp_map,
Karoubi.comp_f, N₂Γ₂ToKaroubiIso_inv_app, HomologicalComplex.comp_f,
Expand Down
10 changes: 5 additions & 5 deletions Mathlib/AlgebraicTopology/DoldKan/NCompGamma.lean
Expand Up @@ -12,7 +12,7 @@ import Mathlib.AlgebraicTopology.DoldKan.NReflectsIso
In order to construct the unit isomorphism of the Dold-Kan equivalence,
we first construct natural transformations
`Γ₂N₁.natTrans : N₁ ⋙ Γ₂ ⟶ toKaroubi (simplicial_object C)` and
`Γ₂N₁.natTrans : N₁ ⋙ Γ₂ ⟶ toKaroubi (SimplicialObject C)` and
`Γ₂N₂.natTrans : N₂ ⋙ Γ₂ ⟶ 𝟭 (SimplicialObject C)`.
It is then shown that `Γ₂N₂.natTrans` is an isomorphism by using
that it becomes an isomorphism after the application of the functor
Expand Down Expand Up @@ -151,14 +151,14 @@ def natTrans : (N₁ : SimplicialObject C ⥤ _) ⋙ Γ₂ ⟶ toKaroubi _ where
apply (Γ₀.splitting K[X]).hom_ext
intro n
dsimp [N₁]
simp only [← Splitting.ιSummand_id, Splitting.ι_desc, comp_id, Splitting.ι_desc_assoc,
simp only [← Splitting.cofan_inj_id, Splitting.ι_desc, comp_id, Splitting.ι_desc_assoc,
assoc, PInfty_f_idem_assoc] }
naturality {X Y} f := by
ext1
apply (Γ₀.splitting K[X]).hom_ext
intro n
dsimp [N₁, toKaroubi]
simp only [← Splitting.ιSummand_id, Splitting.ι_desc, Splitting.ι_desc_assoc, assoc,
simp only [← Splitting.cofan_inj_id, Splitting.ι_desc, Splitting.ι_desc_assoc, assoc,
PInfty_f_idem_assoc, Karoubi.comp_f, NatTrans.comp_app, Γ₂_map_f_app,
HomologicalComplex.comp_f, AlternatingFaceMapComplex.map_f, PInfty_f_naturality_assoc,
NatTrans.naturality, Splitting.IndexSet.id_fst, unop_op, len_mk]
Expand Down Expand Up @@ -230,9 +230,9 @@ theorem identity_N₂_objectwise (P : Karoubi (SimplicialObject C)) :
N₂.map (Γ₂N₂.natTrans.app P) = 𝟙 (N₂.obj P) := by
ext n
have eq₁ : (N₂Γ₂.inv.app (N₂.obj P)).f.f n = PInfty.f n ≫ P.p.app (op [n]) ≫
(Γ₀.splitting (N₂.obj P).X).ιSummand (Splitting.IndexSet.id (op [n])) := by
((Γ₀.splitting (N₂.obj P).X).cofan _).inj (Splitting.IndexSet.id (op [n])) := by
simp only [N₂Γ₂_inv_app_f_f, N₂_obj_p_f, assoc]
have eq₂ : (Γ₀.splitting (N₂.obj P).X).ιSummand (Splitting.IndexSet.id (op [n])) ≫
have eq₂ : ((Γ₀.splitting (N₂.obj P).X).cofan _).inj (Splitting.IndexSet.id (op [n])) ≫
(N₂.map (Γ₂N₂.natTrans.app P)).f.f n = PInfty.f n ≫ P.p.app (op [n]) := by
dsimp
rw [PInfty_on_Γ₀_splitting_summand_eq_self_assoc, Γ₂N₂.natTrans_app_f_app]
Expand Down

0 comments on commit f9e2c2c

Please sign in to comment.