Skip to content

Commit 0c94ad3

Browse files
committed
feat(Algebra/Homology): functoriality of ProjectiveResolution.extMk (leanprover-community#33358)
Given a fixed projective (resp. injective) resolution `R`, we obtain the functoriality of the constructor `R.extMk`.
1 parent 7acaa1e commit 0c94ad3

5 files changed

Lines changed: 126 additions & 8 deletions

File tree

Mathlib/Algebra/Homology/HomotopyCategory/HomComplex.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,16 @@ lemma δ_ofHom_comp {n : ℤ} (f : F ⟶ G) (z : Cochain G K n) (m : ℤ) :
758758
(Cochain.ofHom f).comp (δ n m z) (zero_add m) := by
759759
rw [← Cocycle.ofHom_coe, δ_zero_cocycle_comp]
760760

761+
/-- The precomposition of a cocycle with a morphism of cochain complexes. -/
762+
@[simps!]
763+
def Cocycle.precomp {n : ℤ} (z : Cocycle G K n) (f : F ⟶ G) : Cocycle F K n :=
764+
Cocycle.mk ((Cochain.ofHom f).comp z (zero_add n)) _ rfl (by simp)
765+
766+
/-- The postcomposition of a cocycle with a morphism of cochain complexes. -/
767+
@[simps!]
768+
def Cocycle.postcomp {n : ℤ} (z : Cocycle F G n) (f : G ⟶ K) : Cocycle F K n :=
769+
Cocycle.mk (z.1.comp (Cochain.ofHom f) (add_zero n)) _ rfl (by simp)
770+
761771
namespace Cochain
762772

763773
/-- Given two morphisms of complexes `φ₁ φ₂ : F ⟶ G`, the datum of a homotopy between `φ₁` and

Mathlib/Algebra/Homology/HomotopyCategory/HomComplexShift.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,27 @@ def equivHomShift :
556556
(K ⟶ L⟦n⟧) ≃+ Cocycle K L n :=
557557
(equivHom _ _).trans (rightShiftAddEquiv _ _ _ (zero_add n)).symm
558558

559+
lemma equivHomShift_comp {K' : CochainComplex C ℤ}
560+
(g : K' ⟶ K) (f : K ⟶ L⟦n⟧) :
561+
equivHomShift (g ≫ f) = Cocycle.precomp (equivHomShift f) g := by
562+
ext p q hpq
563+
simp [equivHomShift_apply, Cochain.rightUnshift_v _ _ _ _ _ _ _ (add_zero p)]
564+
565+
lemma equivHomShift_symm_precomp
566+
(z : Cocycle K L n) {K' : CochainComplex C ℤ} (g : K' ⟶ K) :
567+
equivHomShift.symm (z.precomp g) = g ≫ equivHomShift.symm z :=
568+
equivHomShift.injective (by simp [equivHomShift_comp])
569+
570+
lemma equivHomShift_comp_shift (f : K ⟶ L⟦n⟧) {L' : CochainComplex C ℤ} (g : L ⟶ L') :
571+
equivHomShift (f ≫ g⟦n⟧') = Cocycle.postcomp (equivHomShift f) g := by
572+
ext p q rfl
573+
simp [equivHomShift_apply, Cochain.rightUnshift_v _ _ _ _ _ _ _ (add_zero p)]
574+
575+
lemma equivHomShift_symm_postcomp
576+
(z : Cocycle K L n) {L' : CochainComplex C ℤ} (g : L ⟶ L') :
577+
equivHomShift.symm (z.postcomp g) = equivHomShift.symm z ≫ g⟦n⟧' :=
578+
equivHomShift.injective (by simp [equivHomShift_comp_shift])
579+
559580
/-- The additive equivalence `Cocycle K L n ≃+ Cocycle K⟦a⟧ L n'` when `n + a = n'`. -/
560581
@[simps]
561582
def leftShiftAddEquiv (n a n' : ℤ) (hn' : n + a = n') :

Mathlib/Algebra/Homology/HomotopyCategory/HomComplexSingle.lean

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@ noncomputable def fromSingleEquiv {p q n : ℤ} (h : p + n = q) :
8282
right_inv f := by simp
8383
map_add' := by simp
8484

85+
@[simp]
86+
lemma fromSingleEquiv_fromSingleMk {p q : ℤ} (f : X ⟶ K.X q) {n : ℤ} (h : p + n = q) :
87+
fromSingleEquiv h (fromSingleMk f h) = f := by
88+
simp [fromSingleEquiv]
89+
8590
@[simp]
8691
lemma fromSingleMk_add {p q : ℤ} (f g : X ⟶ K.X q) {n : ℤ} (h : p + n = q) :
8792
fromSingleMk (f + g) h = fromSingleMk f h + fromSingleMk g h :=
@@ -102,6 +107,13 @@ lemma fromSingleMk_surjective {p n : ℤ} (α : Cochain ((singleFunctor C p).obj
102107
∃ (f : X ⟶ K.X q), fromSingleMk f h = α :=
103108
(fromSingleEquiv h).symm.surjective α
104109

110+
lemma fromSingleMk_precomp
111+
{X' : C} (g : X' ⟶ X) {p q : ℤ} (f : X ⟶ K.X q) {n : ℤ} (h : p + n = q) :
112+
fromSingleMk (g ≫ f) h =
113+
(Cochain.ofHom ((singleFunctor C p).map g)).comp (fromSingleMk f h) (zero_add n) := by
114+
apply (fromSingleEquiv h).injective
115+
simp [fromSingleEquiv, singleFunctor, singleFunctors, HomologicalComplex.single_map_f_self]
116+
105117
/-- Constructor for cochains to a single complex. -/
106118
@[nolint unusedArguments]
107119
noncomputable def toSingleMk {p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (_ : p + n = q) :
@@ -148,6 +160,11 @@ noncomputable def toSingleEquiv {p q n : ℤ} (h : p + n = q) :
148160
right_inv f := by simp
149161
map_add' := by simp
150162

163+
@[simp]
164+
lemma toSingleEquiv_toSingleMk {p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n = q) :
165+
toSingleEquiv h (toSingleMk f h) = f := by
166+
simp [toSingleEquiv]
167+
151168
@[simp]
152169
lemma toSingleMk_add {p q : ℤ} (f g : K.X p ⟶ X) {n : ℤ} (h : p + n = q) :
153170
toSingleMk (f + g) h = toSingleMk f h + toSingleMk g h :=
@@ -168,6 +185,13 @@ lemma toSingleMk_surjective {q n : ℤ} (α : Cochain K ((singleFunctor C q).obj
168185
∃ (f : K.X p ⟶ X), toSingleMk f h = α :=
169186
(toSingleEquiv h).symm.surjective α
170187

188+
lemma toSingleMk_postcomp
189+
{p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n = q) {X' : C} (g : X ⟶ X') :
190+
toSingleMk (f ≫ g) h =
191+
(toSingleMk f h).comp (.ofHom ((singleFunctor C q).map g)) (add_zero n) := by
192+
apply (toSingleEquiv h).injective
193+
simp [toSingleEquiv, singleFunctor, singleFunctors, HomologicalComplex.single_map_f_self]
194+
171195
end Cochain
172196

173197
namespace Cocycle
@@ -181,6 +205,13 @@ noncomputable def fromSingleMk {p q : ℤ} (f : X ⟶ K.X q) {n : ℤ} (h : p +
181205
rw [Cochain.δ_fromSingleMk _ _ _ q' (by lia), hf]
182206
simp)
183207

208+
lemma fromSingleMk_precomp {X' : C} (g : X' ⟶ X) {p q : ℤ} (f : X ⟶ K.X q) {n : ℤ} (h : p + n = q)
209+
(q' : ℤ) (hq' : q + 1 = q') (hf : f ≫ K.d q q' = 0) :
210+
fromSingleMk (g ≫ f) h q' hq' (by simp [hf]) =
211+
(fromSingleMk f h q' hq' hf).precomp ((singleFunctor C p).map g) := by
212+
ext : 1
213+
exact (Cochain.fromSingleEquiv h).injective (by simp [Cochain.fromSingleMk_precomp])
214+
184215
lemma fromSingleMk_surjective {p n : ℤ} (α : Cocycle ((singleFunctor C p).obj X) K n)
185216
(q : ℤ) (h : p + n = q) (q' : ℤ) (hq' : q + 1 = q') :
186217
∃ (f : X ⟶ K.X q) (hf : f ≫ K.d q q' = 0), fromSingleMk f h q' hq' hf = α := by
@@ -238,6 +269,13 @@ noncomputable def toSingleMk {p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n
238269
rw [Cochain.δ_toSingleMk _ _ _ p' (by lia), hf]
239270
simp)
240271

272+
lemma toSingleMk_postcomp {p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n = q)
273+
(p' : ℤ) (hp' : p' + 1 = p) (hf : K.d p' p ≫ f = 0) {X' : C} (g : X ⟶ X') :
274+
toSingleMk (f ≫ g) h p' hp' (by simp [reassoc_of% hf]) =
275+
(toSingleMk f h p' hp' hf).postcomp ((singleFunctor C q).map g) := by
276+
ext : 1
277+
exact (Cochain.toSingleEquiv h).injective (by simp [Cochain.toSingleMk_postcomp])
278+
241279
lemma toSingleMk_surjective {q n : ℤ} (α : Cocycle K ((singleFunctor C q).obj X) n)
242280
(p : ℤ) (h : p + n = q) (p' : ℤ) (hp' : p' + 1 = p) :
243281
∃ (f : K.X p ⟶ X) (hf : K.d p' p ≫ f = 0), toSingleMk f h p' hp' hf = α := by

Mathlib/CategoryTheory/Abelian/Injective/Ext.lean

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ we provide an API in order to construct elements in `Ext X Y n` in terms
2020
of the complex `R.cocomplex` and to make computations in the `Ext`-group.
2121
2222
## TODO
23-
* Functoriality in `X` for a given injective resolution `R`
2423
* Functoriality in `Y`: this would involve a morphism `Y ⟶ Y'`, injective
2524
resolutions `R` and `R'` of `Y` and `Y'`, a lift of `Y ⟶ Y'` as a morphism
2625
of cochain complexes `R.cocomplex ⟶ R'.cocomplex`; in this context,
@@ -54,10 +53,17 @@ noncomputable def extEquivCohomologyClass :
5453
lemma extEquivCohomologyClass_symm_mk_hom [HasDerivedCategory C]
5554
(x : Cocycle ((singleFunctor C 0).obj X) R.cochainComplex n) :
5655
(R.extEquivCohomologyClass.symm (.mk x)).hom =
57-
(ShiftedHom.map (Cocycle.equivHomShift.symm x) DerivedCategory.Q).comp
58-
(.mk₀ _ rfl (inv (DerivedCategory.Q.map R.ι'))) (zero_add _) := by
56+
(ShiftedHom.mk₀ _ rfl ((DerivedCategory.singleFunctorIsoCompQ C 0).hom.app X)).comp
57+
((ShiftedHom.map (Cocycle.equivHomShift.symm x) DerivedCategory.Q).comp
58+
(.mk₀ _ rfl (inv (DerivedCategory.Q.map R.ι') ≫
59+
(DerivedCategory.singleFunctorIsoCompQ C 0).inv.app Y)) (zero_add _)) (add_zero _) := by
5960
change SmallShiftedHom.equiv _ _ ((CohomologyClass.mk x).toSmallShiftedHom.comp _ _) = _
60-
simp [SmallShiftedHom.equiv_comp, isoOfHom]
61+
simp only [SmallShiftedHom.equiv_comp, CohomologyClass.equiv_toSmallShiftedHom_mk,
62+
SmallShiftedHom.equiv_mk₀Inv, isoOfHom, asIso_inv, Functor.comp_obj,
63+
DerivedCategory.singleFunctorIsoCompQ, Iso.refl_hom, NatTrans.id_app, Iso.refl_inv,
64+
ShiftedHom.mk₀_id_comp]
65+
congr
66+
cat_disch
6167

6268
@[simp]
6369
lemma extEquivCohomologyClass_symm_add
@@ -200,4 +206,20 @@ lemma extMk_surjective (α : Ext X Y n) (m : ℕ) (hm : n + 1 = m) :
200206
by simpa [R.cochainComplex_d _ _ _ _ rfl rfl,
201207
← cancel_mono (R.cochainComplexXIso m m rfl).inv] using hf, by simp [extMk]⟩
202208

209+
lemma mk₀_comp_extMk {n : ℕ} (f : X ⟶ R.cocomplex.X n) (m : ℕ) (hm : n + 1 = m)
210+
(hf : f ≫ R.cocomplex.d n m = 0) {X' : C} (g : X' ⟶ X) :
211+
(Ext.mk₀ g).comp (R.extMk f m hm hf) (zero_add _) =
212+
R.extMk (g ≫ f) m hm (by simp [hf]) := by
213+
have := HasDerivedCategory.standard C
214+
ext
215+
simp only [extMk, Ext.comp_hom, Int.cast_ofNat_Int, Ext.mk₀_hom,
216+
extEquivCohomologyClass_symm_mk_hom, Category.assoc]
217+
rw [Cocycle.fromSingleMk_precomp g _ (zero_add _) _ (by lia) (by
218+
simp [cochainComplex_d _ _ _ n m rfl rfl, reassoc_of% hf]),
219+
Cocycle.equivHomShift_symm_precomp, ← ShiftedHom.mk₀_comp 0 rfl,
220+
ShiftedHom.map_comp,
221+
ShiftedHom.comp_assoc _ _ _ (add_zero _) (zero_add _) (by simp),
222+
← ShiftedHom.comp_assoc _ _ _ (add_zero _) (add_zero (n : ℤ)) (by simp)]
223+
simp
224+
203225
end CategoryTheory.InjectiveResolution

Mathlib/CategoryTheory/Abelian/Projective/Ext.lean

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ we provide an API in order to construct elements in `Ext X Y n` in terms
2020
of the complex `R.complex` and to make computations in the `Ext`-group.
2121
2222
## TODO
23-
* Functoriality in `Y` for a given projective resolution `R`
2423
* Functoriality in `X`: this would involve a morphism `X ⟶ X'`, projective
2524
resolutions `R` and `R'` of `X` and `X'`, a lift of `X ⟶ X'` as a morphism
2625
of cochain complexes `R.complex ⟶ R'.complex`; in this context,
@@ -54,10 +53,18 @@ noncomputable def extEquivCohomologyClass :
5453
lemma extEquivCohomologyClass_symm_mk_hom [HasDerivedCategory C]
5554
(x : Cocycle R.cochainComplex ((singleFunctor C 0).obj Y) n) :
5655
(R.extEquivCohomologyClass.symm (.mk x)).hom =
57-
(ShiftedHom.mk₀ _ rfl (inv (DerivedCategory.Q.map R.π'))).comp
58-
(ShiftedHom.map (Cocycle.equivHomShift.symm x) DerivedCategory.Q) (add_zero _) := by
56+
(ShiftedHom.mk₀ _ rfl ((DerivedCategory.singleFunctorIsoCompQ C 0).hom.app X ≫
57+
inv (DerivedCategory.Q.map R.π'))).comp
58+
((ShiftedHom.map (Cocycle.equivHomShift.symm x) DerivedCategory.Q).comp
59+
(.mk₀ _ rfl ((DerivedCategory.singleFunctorIsoCompQ C 0).inv.app Y))
60+
(zero_add _)) (add_zero _) := by
5961
change SmallShiftedHom.equiv _ _ (.comp _ (CohomologyClass.mk x).toSmallShiftedHom _) = _
60-
simp [SmallShiftedHom.equiv_comp, isoOfHom]
62+
simp only [SmallShiftedHom.equiv_comp, SmallShiftedHom.equiv_mk₀Inv, isoOfHom, asIso_inv,
63+
CohomologyClass.equiv_toSmallShiftedHom_mk, Functor.comp_obj,
64+
DerivedCategory.singleFunctorIsoCompQ, Iso.refl_hom, NatTrans.id_app, Category.id_comp,
65+
Iso.refl_inv]
66+
congr
67+
exact (ShiftedHom.comp_mk₀_id ..).symm
6168

6269
@[simp]
6370
lemma extEquivCohomologyClass_symm_add
@@ -200,4 +207,24 @@ lemma extMk_surjective (α : Ext X Y n) (m : ℕ) (hm : n + 1 = m) :
200207
rw [← cancel_epi (R.cochainComplexXIso (-m) m rfl).hom]
201208
simpa [R.cochainComplex_d _ _ _ _ rfl rfl] using hf
202209

210+
lemma extMk_comp_mk₀ {n : ℕ} (f : R.complex.X n ⟶ Y) (m : ℕ) (hm : n + 1 = m)
211+
(hf : R.complex.d m n ≫ f = 0) {Y' : C} (g : Y ⟶ Y') :
212+
(R.extMk f m hm hf).comp (Ext.mk₀ g) (add_zero _) =
213+
R.extMk (f ≫ g) m hm (by simp [reassoc_of% hf]) := by
214+
have := HasDerivedCategory.standard C
215+
ext
216+
simp only [extMk, Ext.comp_hom, Int.cast_ofNat_Int, Ext.mk₀_hom,
217+
extEquivCohomologyClass_symm_mk_hom]
218+
simp only [← Category.assoc]
219+
rw [Cocycle.toSingleMk_postcomp _ _ _ _
220+
(by simpa [cochainComplex_d _ _ _ m n rfl rfl]) g,
221+
Cocycle.equivHomShift_symm_postcomp,
222+
← ShiftedHom.comp_mk₀ _ 0 rfl,
223+
ShiftedHom.map_comp, ShiftedHom.map_mk₀,
224+
ShiftedHom.comp_assoc _ _ _ (add_zero _) (zero_add _) (by simp),
225+
ShiftedHom.comp_assoc _ _ _ (zero_add _) (zero_add _) (by simp),
226+
ShiftedHom.comp_assoc _ _ _ (zero_add _) (zero_add _) (by simp),
227+
ShiftedHom.mk₀_comp_mk₀, ShiftedHom.mk₀_comp_mk₀, ← NatTrans.naturality]
228+
dsimp
229+
203230
end CategoryTheory.ProjectiveResolution

0 commit comments

Comments
 (0)