Shapes of homological complexes #
We define a structure complex_shape ι
for describing the shapes of homological complexes
indexed by a type ι
.
This is intended to capture chain complexes and cochain complexes, indexed by either ℕ
or ℤ
,
as well as more exotic examples.
Rather than insisting that the indexing type has a succ
function
specifying where differentials should go,
inside c : complex_shape
we have c.rel : ι → ι → Prop
,
and when we define homological_complex
we only allow nonzero differentials d i j
from i
to j
if c.rel i j
.
Further, we require that { j // c.rel i j }
and { i // c.rel i j }
are subsingletons.
This means that the shape consists of some union of lines, rays, intervals, and circles.
Convenience functions c.next
and c.prev
provide, as an option
, these related elements
when they exist.
This design aims to avoid certain problems arising from dependent type theory.
In particular we never have to ensure morphisms d i : X i ⟶ X (succ i)
compose as
expected (which would often require rewriting by equations in the indexing type).
Instead such identities become separate proof obligations when verifying that a
complex we've constructed is of the desired shape.
If α
is an add_right_cancel_semigroup
, then we define up α : complex_shape α
,
the shape appropriate for cohomology,so d : X i ⟶ X j
is nonzero only when j = i + 1
,
as well as down α : complex_shape α
, appropriate for homology,
so d : X i ⟶ X j
is nonzero only when i = j + 1
.
(Later we'll introduce cochain_complex
and chain_complex
as abbreviations for
homological_complex
with one of these shapes baked in.)
- rel : ι → ι → Prop
- next_eq : ∀ {i j j' : ι}, self.rel i j → self.rel i j' → j = j'
- prev_eq : ∀ {i i' j : ι}, self.rel i j → self.rel i' j → i = i'
A c : complex_shape ι
describes the shape of a chain complex,
with chain groups indexed by ι
.
Typically ι
will be ℕ
, ℤ
, or fin n
.
There is a relation rel : ι → ι → Prop
,
and we will only allow a non-zero differential from i
to j
when rel i j
.
There are axioms which imply { j // c.rel i j }
and { i // c.rel i j }
are subsingletons.
This means that the shape consists of some union of lines, rays, intervals, and circles.
Below we define c.next
and c.prev
which provide, as an option
, these related elements.
The complex shape where only differentials from each X.i
to itself are allowed.
This is mostly only useful so we can describe the relation of "related in k
steps" below.
The reverse of a complex_shape
.
An option-valued arbitary choice of index j
such that rel i j
, if such exists.
Equations
- c.next i = option.choice {j // c.rel i j}
An option-valued arbitary choice of index i
such that rel i j
, if such exists.
Equations
- c.prev j = option.choice {i // c.rel i j}
The complex_shape
allowing differentials from X i
to X (i+a)
.
(For example when a = 1
, a cohomology theory indexed by ℕ
or ℤ
)
The complex_shape
allowing differentials from X (j+a)
to X j
.
(For example when a = 1
, a homology theory indexed by ℕ
or ℤ
)
The complex_shape
appropriate for cohomology, so d : X i ⟶ X j
only when j = i + 1
.
Equations
The complex_shape
appropriate for homology, so d : X i ⟶ X j
only when i = j + 1
.