Skip to content

Commit 9989fd2

Browse files
committed
feat(Algebra/Homology): functoriality of extMk with respect to the injective resolution (leanprover-community#33360)
The dual statement for projective resolutions is also obtained.
1 parent a0ec512 commit 9989fd2

7 files changed

Lines changed: 206 additions & 7 deletions

File tree

Mathlib/Algebra/Homology/HomotopyCategory/HomComplexSingle.lean

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ lemma fromSingleMk_precomp
114114
apply (fromSingleEquiv h).injective
115115
simp [fromSingleEquiv, singleFunctor, singleFunctors, HomologicalComplex.single_map_f_self]
116116

117+
lemma fromSingleMk_postcomp {p q : ℤ} (f : X ⟶ K.X q) {n : ℤ} (h : p + n = q)
118+
{L : CochainComplex C ℤ} (g : K ⟶ L) :
119+
fromSingleMk (f ≫ g.f q) h =
120+
(fromSingleMk f h).comp (.ofHom g) (add_zero n) :=
121+
(fromSingleEquiv h).injective (by simp [fromSingleEquiv, singleFunctor, singleFunctors])
122+
117123
/-- Constructor for cochains to a single complex. -/
118124
@[nolint unusedArguments]
119125
noncomputable def toSingleMk {p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (_ : p + n = q) :
@@ -192,6 +198,13 @@ lemma toSingleMk_postcomp
192198
apply (toSingleEquiv h).injective
193199
simp [toSingleEquiv, singleFunctor, singleFunctors, HomologicalComplex.single_map_f_self]
194200

201+
lemma toSingleMk_precomp
202+
{p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n = q)
203+
{L : CochainComplex C ℤ} (g : L ⟶ K) :
204+
toSingleMk (g.f p ≫ f) h =
205+
(Cochain.ofHom g).comp (toSingleMk f h) (zero_add n) :=
206+
(toSingleEquiv h).injective (by simp [toSingleEquiv, singleFunctor, singleFunctors])
207+
195208
end Cochain
196209

197210
namespace Cocycle
@@ -212,6 +225,14 @@ lemma fromSingleMk_precomp {X' : C} (g : X' ⟶ X) {p q : ℤ} (f : X ⟶ K.X q)
212225
ext : 1
213226
exact (Cochain.fromSingleEquiv h).injective (by simp [Cochain.fromSingleMk_precomp])
214227

228+
lemma fromSingleMk_postcomp {p q : ℤ} (f : X ⟶ K.X q) {n : ℤ} (h : p + n = q)
229+
(q' : ℤ) (hq' : q + 1 = q') (hf : f ≫ K.d q q' = 0) {L : CochainComplex C ℤ}
230+
(g : K ⟶ L) :
231+
fromSingleMk (f ≫ g.f q) h q' hq' (by simp [reassoc_of% hf]) =
232+
(fromSingleMk f h q' hq' hf).postcomp g := by
233+
ext : 1
234+
exact (Cochain.fromSingleEquiv h).injective (by simp [Cochain.fromSingleMk_postcomp])
235+
215236
lemma fromSingleMk_surjective {p n : ℤ} (α : Cocycle ((singleFunctor C p).obj X) K n)
216237
(q : ℤ) (h : p + n = q) (q' : ℤ) (hq' : q + 1 = q') :
217238
∃ (f : X ⟶ K.X q) (hf : f ≫ K.d q q' = 0), fromSingleMk f h q' hq' hf = α := by
@@ -276,6 +297,15 @@ lemma toSingleMk_postcomp {p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n = q
276297
ext : 1
277298
exact (Cochain.toSingleEquiv h).injective (by simp [Cochain.toSingleMk_postcomp])
278299

300+
lemma toSingleMk_precomp
301+
{p q : ℤ} (f : K.X p ⟶ X) {n : ℤ} (h : p + n = q)
302+
(p' : ℤ) (hp' : p' + 1 = p) (hf : K.d p' p ≫ f = 0)
303+
{L : CochainComplex C ℤ} (g : L ⟶ K) :
304+
toSingleMk (g.f p ≫ f) h p' hp' (by simp [← g.comm_assoc, hf]) =
305+
(toSingleMk f h p' hp' hf).precomp g := by
306+
ext : 1
307+
exact (Cochain.toSingleEquiv h).injective (by simp [Cochain.toSingleMk_precomp])
308+
279309
lemma toSingleMk_surjective {q n : ℤ} (α : Cocycle K ((singleFunctor C q).obj X) n)
280310
(p : ℤ) (h : p + n = q) (p' : ℤ) (hp' : p' + 1 = p) :
281311
∃ (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: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,6 @@ Given an injective resolution `R` of an object `Y` in an abelian category `C`,
1919
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
22-
## TODO
23-
* Functoriality in `Y`: this would involve a morphism `Y ⟶ Y'`, injective
24-
resolutions `R` and `R'` of `Y` and `Y'`, a lift of `Y ⟶ Y'` as a morphism
25-
of cochain complexes `R.cocomplex ⟶ R'.cocomplex`; in this context,
26-
we should be able to compute the postcomposition of an element
27-
`R.extMk f m hm hf : Ext X Y n` by `Y ⟶ Y'`.
28-
2922
-/
3023

3124
@[expose] public section
@@ -182,6 +175,19 @@ lemma extMk_zero {n : ℕ} (m : ℕ) (hm : n + 1 = m) :
182175
R.extMk (0 : X ⟶ R.cocomplex.X n) m hm (by simp) = 0 := by
183176
simp [extMk]
184177

178+
lemma extMk_hom
179+
[HasDerivedCategory C] {n : ℕ} (f : X ⟶ R.cocomplex.X n) (m : ℕ) (hm : n + 1 = m)
180+
(hf : f ≫ R.cocomplex.d n m = 0) :
181+
(R.extMk f m hm hf).hom =
182+
(ShiftedHom.mk₀ _ rfl ((DerivedCategory.singleFunctorIsoCompQ C 0).hom.app X)).comp
183+
((ShiftedHom.map (Cocycle.equivHomShift.symm
184+
(Cocycle.fromSingleMk (f ≫ (R.cochainComplexXIso n n rfl).inv) (zero_add _) m
185+
(by lia) (by simp [cochainComplex_d _ _ _ n m rfl rfl, reassoc_of% hf]))) _).comp
186+
(.mk₀ _ rfl (inv (DerivedCategory.Q.map R.ι') ≫
187+
(DerivedCategory.singleFunctorIsoCompQ C 0).inv.app Y))
188+
(zero_add _)) (add_zero _) :=
189+
extEquivCohomologyClass_symm_mk_hom _ _
190+
185191
lemma extMk_eq_zero_iff (f : X ⟶ R.cocomplex.X n) (m : ℕ) (hm : n + 1 = m)
186192
(hf : f ≫ R.cocomplex.d n m = 0)
187193
(p : ℕ) (hp : p + 1 = n) :
@@ -222,4 +228,30 @@ lemma mk₀_comp_extMk {n : ℕ} (f : X ⟶ R.cocomplex.X n) (m : ℕ) (hm : n +
222228
← ShiftedHom.comp_assoc _ _ _ (add_zero _) (add_zero (n : ℤ)) (by simp)]
223229
simp
224230

231+
variable {R} in
232+
lemma extMk_comp_mk₀ {n : ℕ} (f : X ⟶ R.cocomplex.X n) (m : ℕ) (hm : n + 1 = m)
233+
(hf : f ≫ R.cocomplex.d n m = 0)
234+
{Y' : C} {R' : InjectiveResolution Y'} {g : Y ⟶ Y'} (φ : Hom R R' g) :
235+
(R.extMk f m hm hf).comp (Ext.mk₀ g) (add_zero _) =
236+
R'.extMk (f ≫ φ.hom.f n) m hm (by simp [reassoc_of% hf]) := by
237+
have := HasDerivedCategory.standard C
238+
ext
239+
have : (f ≫ φ.hom.f n) ≫ (R'.cochainComplexXIso n n (by lia)).inv =
240+
(f ≫ (R.cochainComplexXIso n n (by lia)).inv) ≫ φ.hom'.f n := by
241+
simp [φ.hom'_f n n rfl]
242+
simp only [Ext.comp_hom, extMk_hom, Ext.mk₀_hom, this]
243+
rw [Cocycle.fromSingleMk_postcomp _ (zero_add _) _ (by lia)
244+
(by simp [R.cochainComplex_d _ _ _ _ rfl rfl, reassoc_of% hf]),
245+
Cocycle.equivHomShift_symm_postcomp,
246+
← ShiftedHom.comp_mk₀ _ 0 rfl, ShiftedHom.map_comp,
247+
ShiftedHom.comp_assoc _ _ _ _ (zero_add _) (by simp),
248+
ShiftedHom.comp_assoc _ _ _ _ (zero_add _) (by simp),
249+
ShiftedHom.comp_assoc _ _ _ _ (zero_add _) (by simp),
250+
ShiftedHom.map_mk₀, ShiftedHom.mk₀_comp_mk₀, ShiftedHom.mk₀_comp_mk₀]
251+
congr 3
252+
rw [Category.assoc, ← NatTrans.naturality, ← Category.assoc, ← Category.assoc]
253+
congr 1
254+
simpa only [IsIso.eq_comp_inv, Category.assoc, IsIso.inv_comp_eq,
255+
Functor.map_comp] using DerivedCategory.Q.congr_map φ.ι'_comp_hom'.symm
256+
225257
end CategoryTheory.InjectiveResolution

Mathlib/CategoryTheory/Abelian/Injective/Extend.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,35 @@ instance : R.cochainComplex.IsLE 0 := by
9191
simp only [← HomologicalComplex.isSupported_iff_of_quasiIso R.ι']
9292
infer_instance
9393

94+
namespace Hom
95+
96+
variable {R} {X' : C} {R' : InjectiveResolution X'} {f : X ⟶ X'}
97+
(φ : Hom R R' f)
98+
99+
/-- The morphism on cochain complexes indexed by `ℤ` that is induced by
100+
an (heterogeneous) morphism of injective resolutions. -/
101+
noncomputable def hom' : R.cochainComplex ⟶ R'.cochainComplex :=
102+
HomologicalComplex.extendMap φ.hom _
103+
104+
@[reassoc]
105+
lemma hom'_f (n : ℤ) (m : ℕ) (h : m = n) :
106+
φ.hom'.f n =
107+
(R.cochainComplexXIso n m h).hom ≫ φ.hom.f m ≫ (R'.cochainComplexXIso n m h).inv := by
108+
simp [hom', HomologicalComplex.extendMap_f _
109+
ComplexShape.embeddingUpNat (i := m) (i' := n) (by simpa),
110+
cochainComplexXIso]
111+
112+
@[reassoc (attr := simp)]
113+
lemma ι'_comp_hom' :
114+
R.ι' ≫ φ.hom' = (CochainComplex.singleFunctor C 0).map f ≫ R'.ι' :=
115+
HomologicalComplex.from_single_hom_ext (by
116+
simp [hom'_f _ 0 0 rfl, ι'_f_zero, CochainComplex.singleFunctor,
117+
CochainComplex.singleFunctors,
118+
HomologicalComplex.single, HomologicalComplex.singleObjXSelf,
119+
HomologicalComplex.singleObjXIsoOfEq])
120+
121+
end Hom
122+
94123
end InjectiveResolution
95124

96125
end CategoryTheory

Mathlib/CategoryTheory/Abelian/Projective/Ext.lean

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,19 @@ lemma extMk_zero {n : ℕ} (m : ℕ) (hm : n + 1 = m) :
182182
R.extMk (0 : R.complex.X n ⟶ Y) m hm (by simp) = 0 := by
183183
simp [extMk]
184184

185+
lemma extMk_hom
186+
[HasDerivedCategory C] {n : ℕ} (f : R.complex.X n ⟶ Y) (m : ℕ) (hm : n + 1 = m)
187+
(hf : R.complex.d m n ≫ f = 0) :
188+
(R.extMk f m hm hf).hom =
189+
(ShiftedHom.mk₀ _ rfl ((DerivedCategory.singleFunctorIsoCompQ C 0).hom.app X ≫
190+
inv (DerivedCategory.Q.map R.π'))).comp
191+
((ShiftedHom.map (Cocycle.equivHomShift.symm
192+
(Cocycle.toSingleMk ((R.cochainComplexXIso (-n) n rfl).hom ≫ f) (by simp) (-m)
193+
(by lia) (by simpa [cochainComplex_d _ _ _ _ _ rfl rfl]))) _).comp
194+
(.mk₀ _ rfl ((DerivedCategory.singleFunctorIsoCompQ C 0).inv.app Y))
195+
(zero_add _)) (add_zero _) :=
196+
extEquivCohomologyClass_symm_mk_hom _ _
197+
185198
lemma extMk_eq_zero_iff (f : R.complex.X n ⟶ Y) (m : ℕ) (hm : n + 1 = m)
186199
(hf : R.complex.d m n ≫ f = 0)
187200
(p : ℕ) (hp : p + 1 = n) :
@@ -227,4 +240,28 @@ lemma extMk_comp_mk₀ {n : ℕ} (f : R.complex.X n ⟶ Y) (m : ℕ) (hm : n + 1
227240
ShiftedHom.mk₀_comp_mk₀, ShiftedHom.mk₀_comp_mk₀, ← NatTrans.naturality]
228241
dsimp
229242

243+
variable {R} in
244+
lemma mk₀_comp_extMk {n : ℕ} (f : R.complex.X n ⟶ Y) (m : ℕ) (hm : n + 1 = m)
245+
(hf : R.complex.d m n ≫ f = 0)
246+
{X' : C} {R' : ProjectiveResolution X'} {g : X' ⟶ X} (φ : Hom R' R g) :
247+
(Ext.mk₀ g).comp (R.extMk f m hm hf) (zero_add _) =
248+
R'.extMk (φ.hom.f n ≫ f) m hm (by simp [← φ.hom.comm_assoc, hf]) := by
249+
have := HasDerivedCategory.standard C
250+
ext
251+
have : (R'.cochainComplexXIso (-n) n (by lia)).hom ≫ φ.hom.f n =
252+
φ.hom'.f (-n) ≫ (R.cochainComplexXIso (-n) n (by lia)).hom := by
253+
simp [φ.hom'_f _ _ rfl]
254+
simp only [Ext.comp_hom, extMk_hom, Ext.mk₀_hom, reassoc_of% this]
255+
rw [Cocycle.toSingleMk_precomp _ _ _ (by lia)
256+
(by simpa [R.cochainComplex_d _ _ _ _ rfl rfl]),
257+
Cocycle.equivHomShift_symm_precomp,
258+
← ShiftedHom.mk₀_comp 0 rfl, ShiftedHom.map_comp,
259+
← ShiftedHom.comp_assoc _ _ _ (zero_add _) _ (by simp),
260+
← ShiftedHom.comp_assoc _ _ _ (add_zero _) _ (by simp),
261+
← ShiftedHom.comp_assoc _ _ _ (add_zero _) _ (by simp),
262+
← ShiftedHom.comp_assoc _ _ _ (zero_add _) _ (by simp),
263+
ShiftedHom.map_mk₀, ShiftedHom.mk₀_comp_mk₀, ShiftedHom.mk₀_comp_mk₀]
264+
congr 3
265+
simp [← Functor.map_comp_assoc, ← Functor.map_comp]
266+
230267
end CategoryTheory.ProjectiveResolution

Mathlib/CategoryTheory/Abelian/Projective/Extend.lean

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,35 @@ instance : R.cochainComplex.IsGE 0 := by
8787
simp only [HomologicalComplex.isSupported_iff_of_quasiIso R.π']
8888
infer_instance
8989

90+
namespace Hom
91+
92+
variable {R} {X' : C} {R' : ProjectiveResolution X'} {f : X ⟶ X'}
93+
(φ : Hom R R' f)
94+
95+
/-- The morphism on cochain complexes indexed by `ℤ` that is induced by
96+
a (heterogeneous) morphism of projective resolutions. -/
97+
noncomputable def hom' : R.cochainComplex ⟶ R'.cochainComplex :=
98+
HomologicalComplex.extendMap φ.hom _
99+
100+
@[reassoc]
101+
lemma hom'_f (n : ℤ) (m : ℕ) (h : -m = n) :
102+
φ.hom'.f n =
103+
(R.cochainComplexXIso n m h).hom ≫ φ.hom.f m ≫ (R'.cochainComplexXIso n m h).inv := by
104+
simp [hom', HomologicalComplex.extendMap_f _
105+
ComplexShape.embeddingDownNat (i := m) (i' := n) (by dsimp; lia),
106+
cochainComplexXIso]
107+
108+
@[reassoc (attr := simp)]
109+
lemma hom'_comp_π' :
110+
φ.hom' ≫ R'.π' = R.π' ≫ (CochainComplex.singleFunctor C 0).map f :=
111+
HomologicalComplex.to_single_hom_ext (by
112+
simp [hom'_f _ 0 0 rfl, π'_f_zero, CochainComplex.singleFunctor,
113+
CochainComplex.singleFunctors,
114+
HomologicalComplex.single, HomologicalComplex.singleObjXSelf,
115+
HomologicalComplex.singleObjXIsoOfEq])
116+
117+
end Hom
118+
90119
end ProjectiveResolution
91120

92121
end CategoryTheory

Mathlib/CategoryTheory/Preadditive/Injective/Resolution.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,27 @@ def self [Injective Z] : InjectiveResolution Z where
138138
apply HomologicalComplex.isZero_single_obj_X
139139
simp
140140

141+
variable {Z} {Z' : C} (I' : InjectiveResolution Z')
142+
143+
/-- Given injective resolutions `I` and `I'` of two objects `Z` and `Z'`,
144+
and a morphism `f : Z ⟶ Z'`, this structure contains the data of a morphism
145+
`I.cocomplex ⟶ I'.cocomplex` which is compatible with `f` -/
146+
structure Hom (f : Z ⟶ Z') where
147+
/-- A morphism between the cocomplexes -/
148+
hom : I.cocomplex ⟶ I'.cocomplex
149+
ι_f_zero_comp_hom_f_zero : I.ι.f 0 ≫ hom.f 0 = ((single₀ C).map f).f 0 ≫ I'.ι.f 0
150+
151+
namespace Hom
152+
153+
attribute [reassoc (attr := simp)] ι_f_zero_comp_hom_f_zero
154+
155+
variable {I I'} in
156+
@[reassoc (attr := simp)]
157+
lemma ι_comp_hom {f : Z ⟶ Z'} (φ : Hom I I' f) :
158+
I.ι ≫ φ.hom = (single₀ C).map f ≫ I'.ι := by cat_disch
159+
160+
end Hom
161+
141162
end InjectiveResolution
142163

143164
end CategoryTheory

Mathlib/CategoryTheory/Preadditive/Projective/Resolution.lean

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,27 @@ noncomputable def self [Projective Z] : ProjectiveResolution Z where
134134
apply HomologicalComplex.isZero_single_obj_X
135135
simp
136136

137+
variable {Z} {Z' : C} (P' : ProjectiveResolution Z')
138+
139+
/-- Given injective resolutions `P` and `P'` of two objects `Z` and `Z'`,
140+
and a morphism `f : Z ⟶ Z'`, this structure contains the data of a morphism
141+
`P.complex ⟶ P'.complex` which is compatible with `f` -/
142+
structure Hom (f : Z ⟶ Z') where
143+
/-- A morphism between the cocomplexes -/
144+
hom : P.complex ⟶ P'.complex
145+
hom_f_zero_comp_π_f_zero : hom.f 0 ≫ P'.π.f 0 = P.π.f 0 ≫ ((single₀ C).map f).f 0
146+
147+
namespace Hom
148+
149+
attribute [reassoc (attr := simp)] hom_f_zero_comp_π_f_zero
150+
151+
variable {I I'} in
152+
@[reassoc (attr := simp)]
153+
lemma hom_comp_π {f : Z ⟶ Z'} (φ : Hom P P' f) :
154+
φ.hom ≫ P'.π = P.π ≫ (single₀ C).map f := by cat_disch
155+
156+
end Hom
157+
137158
end ProjectiveResolution
138159

139160
namespace Functor

0 commit comments

Comments
 (0)