Chain homotopies #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
We define chain homotopies, and prove that homotopic chain maps induce the same map on homology.
The composition of C.d i i' ≫ f i' i
if there is some i'
coming after i
,
and 0
otherwise.
f i' i
if i'
comes after i
, and 0 if there's no such i'
.
Hopefully there won't be much need for this, except in d_next_eq_d_from_from_next
to see that d_next
factors through C.d_from i
.
The composition of f j j' ≫ D.d j' j
if there is some j'
coming before j
,
and 0
otherwise.
f j j'
if j'
comes after j
, and 0 if there's no such j'
.
Hopefully there won't be much need for this, except in d_next_eq_d_from_from_next
to see that d_next
factors through C.d_from i
.
- hom : Π (i j : ι), C.X i ⟶ D.X j
- zero' : (∀ (i j : ι), ¬c.rel j i → self.hom i j = 0) . "obviously"
- comm : (∀ (i : ι), f.f i = ⇑(d_next i) self.hom + ⇑(prev_d i) self.hom + g.f i) . "obviously'"
A homotopy h
between chain maps f
and g
consists of components h i j : C.X i ⟶ D.X j
which are zero unless c.rel j i
, satisfying the homotopy condition.
Instances for homotopy
- homotopy.has_sizeof_inst
f
is homotopic to g
iff f - g
is homotopic to 0
.
Equal chain maps are homotopic.
Every chain map is homotopic to itself.
Equations
f
is homotopic to g
iff g
is homotopic to f
.
homotopy is a transitive relation.
the sum of two homotopies is a homotopy between the sum of the respective morphisms.
homotopy is closed under composition (on the right)
homotopy is closed under composition (on the left)
homotopy is closed under composition
Equations
- h₁.comp h₂ = (h₁.comp_right f₂).trans (h₂.comp_left g₁)
a variant of homotopy.comp_right
useful for dealing with homotopy equivalences.
Equations
- h.comp_right_id g = (h.comp_right g).trans (homotopy.of_eq _)
a variant of homotopy.comp_left
useful for dealing with homotopy equivalences.
Equations
- h.comp_left_id g = (h.comp_left g).trans (homotopy.of_eq _)
Null homotopic maps can be constructed using the formula hd+dh
. We show that
these morphisms are homotopic to 0
and provide some convenient simplification
lemmas that give a degreewise description of hd+dh
, depending on whether we have
two differentials going to and from a certain degree, only one, or none.
The null homotopic map associated to a family hom
of morphisms C_i ⟶ D_j
.
This is the same datum as for the field hom
in the structure homotopy
. For
this definition, we do not need the field zero
of that structure
as this definition uses only the maps C_i ⟶ C_j
when c.rel j i
.
Variant of null_homotopic_map
where the input consists only of the
relevant maps C_i ⟶ D_j
such that c.rel j i
.
Equations
- homotopy.null_homotopic_map' h = homotopy.null_homotopic_map (λ (i j : ι), dite (c.rel j i) (h i j) (λ (_x : ¬c.rel j i), 0))
Compatibility of null_homotopic_map
with the postcomposition by a morphism
of complexes.
Compatibility of null_homotopic_map'
with the postcomposition by a morphism
of complexes.
Compatibility of null_homotopic_map
with the precomposition by a morphism
of complexes.
Compatibility of null_homotopic_map'
with the precomposition by a morphism
of complexes.
Compatibility of null_homotopic_map
with the application of additive functors
Compatibility of null_homotopic_map'
with the application of additive functors
Tautological construction of the homotopy
to zero for maps constructed by
null_homotopic_map
, at least when we have the zero'
condition.
Homotopy to zero for maps constructed with null_homotopic_map'
Equations
- homotopy.null_homotopy' h = homotopy.null_homotopy (λ (i j : ι), dite (c.rel j i) (h i j) (λ (_x : ¬c.rel j i), 0)) _
This lemma and the following ones can be used in order to compute
the degreewise morphisms induced by the null homotopic maps constructed
with null_homotopic_map
or null_homotopic_map'
homotopy.mk_inductive
allows us to build a homotopy of chain complexes inductively,
so that as we construct each component, we have available the previous two components,
and the fact that they satisfy the homotopy condition.
To simplify the situation, we only construct homotopies of the form homotopy e 0
.
homotopy.equiv_sub_zero
can provide the general case.
Notice however, that this construction does not have particularly good definitional properties:
we have to insert eq_to_hom
in several places.
Hopefully this is okay in most applications, where we only need to have the existence of some
homotopy.
An auxiliary construction for mk_inductive
.
Here we build by induction a family of diagrams,
but don't require at the type level that these successive diagrams actually agree.
They do in fact agree, and we then capture that at the type level (i.e. by constructing a homotopy)
in mk_inductive
.
At this stage, we don't check the homotopy condition in degree 0,
because it "falls off the end", and is easier to treat using X_next
and X_prev
,
which we do in mk_inductive_aux₂
.
Equations
- homotopy.mk_inductive_aux₁ e zero comm_zero one comm_one succ (n + 2) = ⟨(homotopy.mk_inductive_aux₁ e zero comm_zero one comm_one succ n.succ).snd.fst, ⟨(succ (n + 1) (homotopy.mk_inductive_aux₁ e zero comm_zero one comm_one succ n.succ)).fst, _⟩⟩
- homotopy.mk_inductive_aux₁ e zero comm_zero one comm_one succ 1 = ⟨one, ⟨(succ 0 ⟨zero, ⟨one, comm_one⟩⟩).fst, _⟩⟩
- homotopy.mk_inductive_aux₁ e zero comm_zero one comm_one succ 0 = ⟨zero, ⟨one, comm_one⟩⟩
An auxiliary construction for mk_inductive
.
Equations
- homotopy.mk_inductive_aux₂ e zero comm_zero one comm_one succ (n + 1) = let I : Σ' (f : P.X n ⟶ Q.X (n + 1)) (f' : P.X (n + 1) ⟶ Q.X (n + 2)), e.f (n + 1) = P.d (n + 1) n ≫ f + f' ≫ Q.d (n + 2) (n + 1) := homotopy.mk_inductive_aux₁ e zero comm_zero one comm_one succ n in ⟨(homological_complex.X_next_iso P _).hom ≫ I.fst, ⟨I.snd.fst ≫ (homological_complex.X_prev_iso Q _).inv, _⟩⟩
- homotopy.mk_inductive_aux₂ e zero comm_zero one comm_one succ 0 = ⟨0, ⟨zero ≫ (homological_complex.X_prev_iso Q homotopy.mk_inductive_aux₂._main._proof_1).inv, _⟩⟩
A constructor for a homotopy e 0
, for e
a chain map between ℕ
-indexed chain complexes,
working by induction.
You need to provide the components of the homotopy in degrees 0 and 1, show that these satisfy the homotopy condition, and then give a construction of each component, and the fact that it satisfies the homotopy condition, using as an inductive hypothesis the data and homotopy condition for the previous two components.
homotopy.mk_coinductive
allows us to build a homotopy of cochain complexes inductively,
so that as we construct each component, we have available the previous two components,
and the fact that they satisfy the homotopy condition.
An auxiliary construction for mk_coinductive
.
Here we build by induction a family of diagrams,
but don't require at the type level that these successive diagrams actually agree.
They do in fact agree, and we then capture that at the type level (i.e. by constructing a homotopy)
in mk_coinductive
.
At this stage, we don't check the homotopy condition in degree 0,
because it "falls off the end", and is easier to treat using X_next
and X_prev
,
which we do in mk_inductive_aux₂
.
Equations
- homotopy.mk_coinductive_aux₁ e zero comm_zero one comm_one succ (n + 2) = ⟨(homotopy.mk_coinductive_aux₁ e zero comm_zero one comm_one succ n.succ).snd.fst, ⟨(succ (n + 1) (homotopy.mk_coinductive_aux₁ e zero comm_zero one comm_one succ n.succ)).fst, _⟩⟩
- homotopy.mk_coinductive_aux₁ e zero comm_zero one comm_one succ 1 = ⟨one, ⟨(succ 0 ⟨zero, ⟨one, comm_one⟩⟩).fst, _⟩⟩
- homotopy.mk_coinductive_aux₁ e zero comm_zero one comm_one succ 0 = ⟨zero, ⟨one, comm_one⟩⟩
An auxiliary construction for mk_inductive
.
Equations
- homotopy.mk_coinductive_aux₂ e zero comm_zero one comm_one succ (n + 1) = let I : Σ' (f : P.X (n + 1) ⟶ Q.X n) (f' : P.X (n + 2) ⟶ Q.X (n + 1)), e.f (n + 1) = f ≫ Q.d n (n + 1) + P.d (n + 1) (n + 2) ≫ f' := homotopy.mk_coinductive_aux₁ e zero comm_zero one comm_one succ n in ⟨I.fst ≫ (homological_complex.X_prev_iso Q _).inv, ⟨(homological_complex.X_next_iso P _).hom ≫ I.snd.fst, _⟩⟩
- homotopy.mk_coinductive_aux₂ e zero comm_zero one comm_one succ 0 = ⟨0, ⟨(homological_complex.X_next_iso P homotopy.mk_coinductive_aux₂._main._proof_1).hom ≫ zero, _⟩⟩
A constructor for a homotopy e 0
, for e
a chain map between ℕ
-indexed cochain complexes,
working by induction.
You need to provide the components of the homotopy in degrees 0 and 1, show that these satisfy the homotopy condition, and then give a construction of each component, and the fact that it satisfies the homotopy condition, using as an inductive hypothesis the data and homotopy condition for the previous two components.
- hom : C ⟶ D
- inv : D ⟶ C
- homotopy_hom_inv_id : homotopy (self.hom ≫ self.inv) (𝟙 C)
- homotopy_inv_hom_id : homotopy (self.inv ≫ self.hom) (𝟙 D)
A homotopy equivalence between two chain complexes consists of a chain map each way, and homotopies from the compositions to the identity chain maps.
Note that this contains data; arguably it might be more useful for many applications if we truncated it to a Prop.
Instances for homotopy_equiv
- homotopy_equiv.has_sizeof_inst
- homotopy_equiv.inhabited
Any complex is homotopy equivalent to itself.
Equations
- homotopy_equiv.refl C = {hom := 𝟙 C, inv := 𝟙 C, homotopy_hom_inv_id := _.mpr (homotopy.refl (𝟙 C)), homotopy_inv_hom_id := _.mpr (homotopy.refl (𝟙 C))}
Equations
Being homotopy equivalent is a symmetric relation.
Equations
- f.symm = {hom := f.inv, inv := f.hom, homotopy_hom_inv_id := f.homotopy_inv_hom_id, homotopy_inv_hom_id := f.homotopy_hom_inv_id}
Homotopy equivalence is a transitive relation.
Equations
- f.trans g = {hom := f.hom ≫ g.hom, inv := g.inv ≫ f.inv, homotopy_hom_inv_id := _.mpr (_.mp (((g.homotopy_hom_inv_id.comp_right_id f.inv).comp_left f.hom).trans f.homotopy_hom_inv_id)), homotopy_inv_hom_id := _.mpr (_.mp (((f.homotopy_inv_hom_id.comp_right_id g.hom).comp_left g.inv).trans g.homotopy_inv_hom_id))}
An isomorphism of complexes induces a homotopy equivalence.
Equations
- homotopy_equiv.of_iso f = {hom := f.hom, inv := f.inv, homotopy_hom_inv_id := homotopy.of_eq _, homotopy_inv_hom_id := homotopy.of_eq _}
Homotopic maps induce the same map on homology.
Homotopy equivalent complexes have isomorphic homologies.
Equations
- homology_obj_iso_of_homotopy_equiv f i = {hom := (homology_functor V c i).map f.hom, inv := (homology_functor V c i).map f.inv, hom_inv_id' := _, inv_hom_id' := _}
An additive functor takes homotopies to homotopies.
An additive functor preserves homotopy equivalences.
Equations
- F.map_homotopy_equiv h = {hom := (F.map_homological_complex c).map h.hom, inv := (F.map_homological_complex c).map h.inv, homotopy_hom_inv_id := _.mpr (_.mpr (F.map_homotopy h.homotopy_hom_inv_id)), homotopy_inv_hom_id := _.mpr (_.mpr (F.map_homotopy h.homotopy_inv_hom_id))}