Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - refactor(AlgebraicTopology): using the cofan API for SplitSimplicialObject #8531

Closed
wants to merge 15 commits into from
Closed
72 changes: 33 additions & 39 deletions Mathlib/AlgebraicTopology/DoldKan/FunctorGamma.lean
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Loading