@@ -3,8 +3,8 @@ Copyright (c) 2021 Scott Morrison. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Scott Morrison, Joël Riou
5
5
-/
6
- import algebra.homology.homology
7
6
import algebra.homology.homotopy
7
+ import category_theory.abelian.homology
8
8
9
9
/-!
10
10
# Quasi-isomorphisms
@@ -55,14 +55,158 @@ lemma quasi_iso_of_comp_right (f : C ⟶ D) (g : D ⟶ E) [quasi_iso g] [quasi_i
55
55
quasi_iso f :=
56
56
{ is_iso := λ i, is_iso.of_is_iso_fac_right ((homology_functor V c i).map_comp f g).symm }
57
57
58
+ namespace homotopy_equiv
59
+
60
+ section
61
+ variables {W : Type *} [category W] [preadditive W] [has_cokernels W] [has_images W]
62
+ [has_equalizers W] [has_zero_object W] [has_image_maps W]
63
+
58
64
/-- An homotopy equivalence is a quasi-isomorphism. -/
59
- lemma homotopy_equiv.to_quasi_iso {W : Type *} [category W] [preadditive W]
60
- [has_cokernels W] [has_images W] [has_equalizers W] [has_zero_object W]
61
- [has_image_maps W] {C D : homological_complex W c} (e : homotopy_equiv C D) :
65
+ lemma to_quasi_iso {C D : homological_complex W c} (e : homotopy_equiv C D) :
62
66
quasi_iso e.hom :=
63
67
⟨λ i, begin
64
68
refine ⟨⟨(homology_functor W c i).map e.inv, _⟩⟩,
65
69
simp only [← functor.map_comp, ← (homology_functor W c i).map_id],
66
70
split; apply homology_map_eq_of_homotopy,
67
71
exacts [e.homotopy_hom_inv_id, e.homotopy_inv_hom_id],
68
72
end ⟩
73
+
74
+ lemma to_quasi_iso_inv {C D : homological_complex W c} (e : homotopy_equiv C D) (i : ι) :
75
+ (@as_iso _ _ _ _ _ (e.to_quasi_iso.1 i)).inv = (homology_functor W c i).map e.inv :=
76
+ begin
77
+ symmetry,
78
+ simp only [←iso.hom_comp_eq_id, as_iso_hom, ←functor.map_comp, ←(homology_functor W c i).map_id,
79
+ homology_map_eq_of_homotopy e.homotopy_hom_inv_id _],
80
+ end
81
+
82
+ end
83
+ end homotopy_equiv
84
+ namespace homological_complex.hom
85
+ section to_single₀
86
+ variables {W : Type *} [category W] [abelian W]
87
+
88
+ section
89
+ variables {X : chain_complex W ℕ} {Y : W} (f : X ⟶ ((chain_complex.single₀ _).obj Y))
90
+ [hf : quasi_iso f]
91
+
92
+ /-- If a chain map `f : X ⟶ Y[0]` is a quasi-isomorphism, then the cokernel of the differential
93
+ `d : X₁ → X₀` is isomorphic to `Y.` -/
94
+ noncomputable def to_single₀_cokernel_at_zero_iso : cokernel (X.d 1 0 ) ≅ Y :=
95
+ (X.homology_zero_iso.symm.trans ((@as_iso _ _ _ _ _ (hf.1 0 )).trans
96
+ ((chain_complex.homology_functor_0_single₀ W).app Y)))
97
+
98
+ lemma to_single₀_cokernel_at_zero_iso_hom_eq [hf : quasi_iso f] :
99
+ f.to_single₀_cokernel_at_zero_iso.hom = cokernel.desc (X.d 1 0 ) (f.f 0 )
100
+ (by rw ←f.2 1 0 rfl; exact comp_zero) :=
101
+ begin
102
+ ext,
103
+ dunfold to_single₀_cokernel_at_zero_iso chain_complex.homology_zero_iso homology_of_zero_right
104
+ homology.map_iso chain_complex.homology_functor_0_single₀ cokernel.map,
105
+ dsimp,
106
+ simp only [cokernel.π_desc, category.assoc, homology.map_desc, cokernel.π_desc_assoc],
107
+ simp [homology.desc, iso.refl_inv (X.X 0 )],
108
+ end
109
+
110
+ lemma to_single₀_epi_at_zero [hf : quasi_iso f] :
111
+ epi (f.f 0 ) :=
112
+ begin
113
+ constructor,
114
+ intros Z g h Hgh,
115
+ rw [←cokernel.π_desc (X.d 1 0 ) (f.f 0 ) (by rw ←f.2 1 0 rfl; exact comp_zero),
116
+ ←to_single₀_cokernel_at_zero_iso_hom_eq] at Hgh,
117
+ rw (@cancel_epi _ _ _ _ _ _ (epi_comp _ _) _ _).1 Hgh,
118
+ end
119
+
120
+ lemma to_single₀_exact_d_f_at_zero [hf : quasi_iso f] :
121
+ exact (X.d 1 0 ) (f.f 0 ) :=
122
+ begin
123
+ rw preadditive.exact_iff_homology_zero,
124
+ have h : X.d 1 0 ≫ f.f 0 = 0 ,
125
+ { simp only [← f.2 1 0 rfl, chain_complex.single₀_obj_X_d, comp_zero], },
126
+ refine ⟨h, nonempty.intro (homology_iso_kernel_desc _ _ _ ≪≫ _)⟩,
127
+ { suffices : is_iso (cokernel.desc _ _ h),
128
+ { haveI := this , apply kernel.of_mono, },
129
+ rw ←to_single₀_cokernel_at_zero_iso_hom_eq,
130
+ apply_instance }
131
+ end
132
+
133
+ lemma to_single₀_exact_at_succ [hf : quasi_iso f] (n : ℕ) :
134
+ exact (X.d (n + 2 ) (n + 1 )) (X.d (n + 1 ) n) :=
135
+ (preadditive.exact_iff_homology_zero _ _).2 ⟨X.d_comp_d _ _ _,
136
+ ⟨(chain_complex.homology_succ_iso _ _).symm.trans
137
+ ((@as_iso _ _ _ _ _ (hf.1 (n + 1 ))).trans homology_zero_zero)⟩⟩
138
+
139
+ end
140
+ section
141
+ variables {X : cochain_complex W ℕ} {Y : W}
142
+ (f : (cochain_complex.single₀ _).obj Y ⟶ X)
143
+
144
+ /-- If a cochain map `f : Y[0] ⟶ X` is a quasi-isomorphism, then the kernel of the differential
145
+ `d : X₀ → X₁` is isomorphic to `Y.` -/
146
+ noncomputable def from_single₀_kernel_at_zero_iso [hf : quasi_iso f] : kernel (X.d 0 1 ) ≅ Y :=
147
+ (X.homology_zero_iso.symm.trans ((@as_iso _ _ _ _ _ (hf.1 0 )).symm.trans
148
+ ((cochain_complex.homology_functor_0_single₀ W).app Y)))
149
+
150
+ lemma from_single₀_kernel_at_zero_iso_inv_eq [hf : quasi_iso f] :
151
+ f.from_single₀_kernel_at_zero_iso.inv = kernel.lift (X.d 0 1 ) (f.f 0 )
152
+ (by rw f.2 0 1 rfl; exact zero_comp) :=
153
+ begin
154
+ ext,
155
+ dunfold from_single₀_kernel_at_zero_iso cochain_complex.homology_zero_iso homology_of_zero_left
156
+ homology.map_iso cochain_complex.homology_functor_0_single₀ kernel.map,
157
+ simp only [iso.trans_inv, iso.app_inv, iso.symm_inv, category.assoc,
158
+ equalizer_as_kernel, kernel.lift_ι],
159
+ dsimp,
160
+ simp only [category.assoc, homology.π_map, cokernel_zero_iso_target_hom,
161
+ cokernel_iso_of_eq_hom_comp_desc, kernel_subobject_arrow, homology.π_map_assoc,
162
+ is_iso.inv_comp_eq],
163
+ simp [homology.π, kernel_subobject_map_comp, iso.refl_hom (X.X 0 ), category.comp_id],
164
+ end
165
+
166
+ lemma from_single₀_mono_at_zero [hf : quasi_iso f] :
167
+ mono (f.f 0 ) :=
168
+ begin
169
+ constructor,
170
+ intros Z g h Hgh,
171
+ rw [←kernel.lift_ι (X.d 0 1 ) (f.f 0 ) (by rw f.2 0 1 rfl; exact zero_comp),
172
+ ←from_single₀_kernel_at_zero_iso_inv_eq] at Hgh,
173
+ rw (@cancel_mono _ _ _ _ _ _ (mono_comp _ _) _ _).1 Hgh,
174
+ end
175
+
176
+ lemma from_single₀_exact_f_d_at_zero [hf : quasi_iso f] :
177
+ exact (f.f 0 ) (X.d 0 1 ) :=
178
+ begin
179
+ rw preadditive.exact_iff_homology_zero,
180
+ have h : f.f 0 ≫ X.d 0 1 = 0 ,
181
+ { simp only [homological_complex.hom.comm, cochain_complex.single₀_obj_X_d, zero_comp] },
182
+ refine ⟨h, nonempty.intro (homology_iso_cokernel_lift _ _ _ ≪≫ _)⟩,
183
+ { suffices : is_iso (kernel.lift (X.d 0 1 ) (f.f 0 ) h),
184
+ { haveI := this , apply cokernel.of_epi },
185
+ rw ←from_single₀_kernel_at_zero_iso_inv_eq f,
186
+ apply_instance },
187
+ end
188
+
189
+ lemma from_single₀_exact_at_succ [hf : quasi_iso f] (n : ℕ) :
190
+ exact (X.d n (n + 1 )) (X.d (n + 1 ) (n + 2 )) :=
191
+ (preadditive.exact_iff_homology_zero _ _).2
192
+ ⟨X.d_comp_d _ _ _, ⟨(cochain_complex.homology_succ_iso _ _).symm.trans
193
+ ((@as_iso _ _ _ _ _ (hf.1 (n + 1 ))).symm.trans homology_zero_zero)⟩⟩
194
+
195
+ end
196
+ end to_single₀
197
+ end homological_complex.hom
198
+
199
+ variables {A : Type *} [category A] [abelian A] {B : Type *} [category B] [abelian B]
200
+ (F : A ⥤ B) [functor.additive F] [preserves_finite_limits F] [preserves_finite_colimits F]
201
+ [faithful F]
202
+
203
+ lemma category_theory.functor.quasi_iso_of_map_quasi_iso
204
+ {C D : homological_complex A c} (f : C ⟶ D)
205
+ (hf : quasi_iso ((F.map_homological_complex _).map f)) : quasi_iso f :=
206
+ ⟨λ i, begin
207
+ haveI : is_iso (F.map ((homology_functor A c i).map f)),
208
+ { rw [← functor.comp_map, ← nat_iso.naturality_2 (F.homology_functor_iso i) f,
209
+ functor.comp_map],
210
+ apply_instance, },
211
+ exact is_iso_of_reflects_iso _ F,
212
+ end ⟩
0 commit comments