module Cat.Abelian.Limits {o β} {C : Precategory o β} (A : is-pre-abelian C) where open is-pre-abelian A
Limitsπ
Recall that every pre-abelian admits kernels and cokernels, and is also additive, so it additionally has products and coproducts1. It sounds like weβre missing some finite limits (dually, missing some finite colimits), but it turns out that this is enough: We can construct the equaliser of as β whence the name difference kernel!
The calculation is straightforward: To map out of , we must have , but this is immediate assuming that β an assumption we have to map out of . Similarly, to show that , we calculate
difference-kernel : β {A B} {f g : Hom A B} β is-equaliser f g (Ker.kernel (f - g)) difference-kernel {f = f} {g} = equ where open is-equaliser equ : is-equaliser f g (Ker.kernel (f - g)) equ .equal = zero-diff $ (f β Ker.kernel (f - g)) - (g β Ker.kernel (f - g)) β‘β¨ β-minus-l f g (Ker.kernel (f - g)) β©β‘ (f - g) β Ker.kernel (f - g) β‘β¨ Ker.equal (f - g) β©β‘ β .zeroβ β Ker.kernel (f - g) β‘β¨ β .zero-βr _ β 0m-unique β©β‘ 0m β equ .limiting {eβ² = eβ²} p = Ker.limiting (f - g) {eβ² = eβ²} $ (f - g) β eβ² β‘Λβ¨ β-minus-l _ _ _ β©β‘Λ f β eβ² - g β eβ² β‘β¨ ap (f β eβ² -_) (sym p) β©β‘ f β eβ² - f β eβ² β‘β¨ Hom.inverser β©β‘ 0m β‘Λβ¨ β .zero-βr _ β 0m-unique β©β‘Λ Zero.zeroβ β β eβ² β equ .universal = Ker.universal _ equ .unique = Ker.unique (f - g)
By a standard characterisation of finite limits in terms of finite products and binary equalisers, the construction of βdifference kernelsβ above implies that any pre-abelian category is finitely complete.
finitely-complete : Finitely-complete C finitely-complete = with-equalisers C has-terminal has-prods Ξ» f g β record { has-is-eq = difference-kernel }
actually, theyβre the same thing!β©οΈ