module Cat.Diagram.Coequaliser.RegularEpi where
Regular epimorphisms🔗
Dually to regular monomorphisms, which behave as embeddings, regular epimorphisms behave like covers: A regular epimorphism expresses as “a union of parts of possibly glued together”.
The definition is also precisely dual: A map is a regular epimorphism if it is the coequaliser of some pair of arrows
record is-regular-epi (f : Hom a b) : Type (o ⊔ ℓ) where
no-eta-equality
constructor reg-epi
field
{r} : Ob
{arr₁} {arr₂} : Hom r a
: is-coequaliser C arr₁ arr₂ f
has-is-coeq
open is-coequaliser has-is-coeq public
From the definition we can directly conclude that regular epis are in fact epic:
: is-epic f
is-regular-epi→is-epic = is-coequaliser→is-epic _ has-is-coeq
is-regular-epi→is-epic
open is-regular-epi using (is-regular-epi→is-epic) public
Effective epis🔗
Again by duality, we have a pair of canonical choices of maps which may coequalise: Its kernel pair, that is, the pullback of along itself. An epimorphism which coequalises its kernel pair is called an effective epi, and effective epis are immediately seen to be regular epis:
record is-effective-epi (f : Hom a b) : Type (o ⊔ ℓ) where
no-eta-equality
field
{kernel} : Ob
: Hom kernel a
p₁ p₂ : is-kernel-pair C p₁ p₂ f
has-kernel-pair : is-coequaliser C p₁ p₂ f
has-is-coeq
: is-regular-epi f
is-effective-epi→is-regular-epi = re where
is-effective-epi→is-regular-epi open is-regular-epi hiding (has-is-coeq)
: is-regular-epi f
re .r = _
re .arr₁ = _
re .arr₂ = _
re .is-regular-epi.has-is-coeq = has-is-coeq re
If a regular epimorphism (a coequaliser) has a kernel pair, then it is also the coequaliser of its kernel pair. That is: If the pullback of exists, then is also an effective epimorphism.
is-regular-epi→is-effective-epi: ∀ {a b} {f : Hom a b}
→ Pullback C f f
→ is-regular-epi C f
→ is-effective-epi C f
{f = f} kp reg = epi where
is-regular-epi→is-effective-epi module reg = is-regular-epi reg
module kp = Pullback kp
open is-effective-epi
open is-coequaliser
: is-effective-epi C f
epi .kernel = kp.apex
epi .p₁ = kp.p₁
epi .p₂ = kp.p₂
epi .has-kernel-pair = kp.has-is-pb
epi .has-is-coeq .coequal = kp.square
epi .has-is-coeq .universal {F = F} {e'} p = reg.universal q where
epi : e' ∘ reg.arr₁ ≡ e' ∘ reg.arr₂
q =
q .arr₁ ≡⟨ ap (e' ∘_) (sym kp.p₂∘universal) ⟩
e' ∘ reg.p₂ ∘ kp.universal (sym reg.coequal) ≡⟨ pulll (sym p) ⟩
e' ∘ kp(e' ∘ kp.p₁) ∘ kp.universal _ ≡⟨ pullr kp.p₁∘universal ⟩
.arr₂ ∎
e' ∘ reg.has-is-coeq .factors = reg.factors
epi .has-is-coeq .unique = reg.unique epi
Existence of regular epis🔗
Let be a categories such that has coproducts indexed by the objects and arrows of and let be a functor with a colimit in The canonical map is a regular epimorphism
module _ {o ℓ oj ℓj}
{C : Precategory o ℓ} {J : Precategory oj ℓj}
{F : Functor J C}
(∐Ob : has-coproducts-indexed-by C ⌞ J ⌟)
(∐Hom : has-coproducts-indexed-by C (Arrows J))
(∐F : Colimit F)
where
: is-regular-epi C (∐Ob.match F.₀ ∐F.ψ) indexed-coproduct→regular-epi
We start by constructing a pair of maps via the universal property of
.r = ∐Hom.ΣF λ (i , j , f) → F.₀ i
indexed-coproduct→regular-epi .arr₁ = ∐Hom.match _ λ (i , j , f) → ∐Ob.ι F.₀ j C.∘ F.₁ f
indexed-coproduct→regular-epi .arr₂ = ∐Hom.match _ λ (i , j , f) → ∐Ob.ι F.₀ i indexed-coproduct→regular-epi
By some rather tedious calculations, we can show that and coequalize
.has-is-coeq .coequal =
indexed-coproduct→regular-epi .unique₂ _ λ (i , j , f) →
∐Hom(∐Ob.match F.₀ ∐F.ψ C.∘ ∐Hom.match _ _) C.∘ ∐Hom.ι _ (i , j , f) ≡⟨ C.pullr (∐Hom.commute _) ⟩
.match F.₀ ∐F.ψ C.∘ ∐Ob.ι _ j C.∘ F.₁ f ≡⟨ C.pulll (∐Ob.commute _) ⟩
∐Ob.ψ j C.∘ F.₁ f ≡⟨ ∐F.commutes f ⟩
∐F.ψ i ≡˘⟨ ∐Ob.commute _ ⟩
∐F.match F.₀ ∐F.ψ C.∘ ∐Ob.ι _ i ≡˘⟨ C.pullr (∐Hom.commute _) ⟩
∐Ob(∐Ob.match F.₀ ∐F.ψ C.∘ ∐Hom.match _ _) C.∘ ∐Hom.ι _ (i , j , f) ∎
Moreover, and form the universal such coequalizing pair. This follows by yet more brute-force calculation.
.has-is-coeq .universal {e' = e'} p =
indexed-coproduct→regular-epi .universal (λ j → e' C.∘ ∐Ob.ι F.₀ j) comm
∐Fwhere abstract
comm: ∀ {i j} (f : J.Hom i j)
→ (e' C.∘ ∐Ob.ι F.₀ j) C.∘ F.₁ f ≡ e' C.∘ ∐Ob.ι F.₀ i
{i} {j} f =
comm (e' C.∘ ∐Ob.ι F.₀ j) C.∘ F.₁ f ≡⟨ C.pullr (sym (∐Hom.commute _)) ⟩
.∘ (∐Hom.match _ _ C.∘ ∐Hom.ι _ (i , j , f)) ≡⟨ C.extendl p ⟩
e' C.∘ (∐Hom.match _ _ C.∘ ∐Hom.ι _ (i , j , f)) ≡⟨ ap₂ C._∘_ refl (∐Hom.commute _) ⟩
e' C.∘ ∐Ob.ι F.₀ i ∎
e' C.has-is-coeq .factors {e' = e'} {p = p} =
indexed-coproduct→regular-epi .unique₂ F.₀ λ j →
∐Ob(∐F.universal _ _ C.∘ ∐Ob.match F.₀ ∐F.ψ) C.∘ ∐Ob.ι F.₀ j ≡⟨ C.pullr (∐Ob.commute _) ⟩
.universal _ _ C.∘ ∐F.ψ j ≡⟨ ∐F.factors _ _ ⟩
∐F.∘ ∐Ob.ι F.₀ j ∎
e' C.has-is-coeq .unique {e' = e'} {other = h} p =
indexed-coproduct→regular-epi .unique _ _ _ λ j →
∐F.∘ ∐F.ψ j ≡˘⟨ ap₂ C._∘_ refl (∐Ob.commute _) ⟩
h C.∘ (∐Ob.match F.₀ ∐F.ψ C.∘ ∐Ob.ι F.₀ j) ≡⟨ C.pulll p ⟩
h C.∘ ∐Ob.ι F.₀ j ∎ e' C