Jon Sterling and Mike Shulman, September 2023.
Arguments due to Mike Shulman, typed into Agda by Jon Sterling.
The results of this module are as follows:
1. Let P : Δ I → Id[C] be an incoherent cone over the identity functor on a
wild category C. If the “generic point” P[I] : I → I is the identity map,
then I is an initial object of C.
2. Let P : Δ I → Id[C] be a incoherent cone over the identity functor on a
wild category C. If the generic point p[I] : I → I admits a splitting
I → J → I, then J is the initial object of C.
3. Let P : Δ I → Id[C] be a “semicoherent cone”. Then the generic point
p[I] : I → I has the structure of a quasi-idempotent in the sense of Shulman.
It follows therefore that a wild category in which all quasi-idempotents split
has an initial object when it possesses a semicoherent cone over the identity
functor.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module WildCategories.Cones where
open import MLTT.Spartan
open import UF.Base
open import WildCategories.Base
open import WildCategories.Idempotents
module _ {𝓤 𝓥} (C : WildCategory 𝓤 𝓥) where
open WildCategory C
record IncohIdnCone : 𝓤 ⊔ 𝓥 ̇ where
field
apex : ob
cone : (x : ob) → hom apex x
nat
: {x y : ob} (f : hom x y)
→ f << cone x = cone y
gen : hom apex apex
gen = cone apex
gen# : (gen << cone apex) = cone apex
gen# = nat gen
has-coherent-generic-point : 𝓥 ̇
has-coherent-generic-point = gen = idn apex
record SemicohIdnCone : 𝓤 ⊔ 𝓥 ̇ where
field
apex : ob
cone : (x : ob) → hom apex x
nat
: {x y : ob} (f : hom x y)
→ f << cone x = cone y
coh
: {x y z : ob} (f : hom x y) (g : hom y z) (h : hom x z)
→ (K : g << f = h)
→ ap (_<< cone x) K ∙ nat h
= assoc (cone x) f g ⁻¹ ∙ ap (g <<_) (nat f) ∙ nat g
underlying-incoh-cone : IncohIdnCone
underlying-incoh-cone = record { apex = apex ; cone = cone ; nat = nat}
open IncohIdnCone underlying-incoh-cone public hiding (apex; cone; nat)
module _ (P : IncohIdnCone) where
private
module P = IncohIdnCone P
apex-is-initial : P.has-coherent-generic-point → is-initial-object C P.apex
pr₁ (apex-is-initial coh x) = P.cone x
pr₂ (apex-is-initial coh x) f =
P.cone x =⟨ P.nat f ⁻¹ ⟩
f << P.gen =⟨ ap (f <<_) coh ⟩
f << idn P.apex =⟨ lunit f ⟩
f ∎
module _ (P : IncohIdnCone) where
private
module P = IncohIdnCone P
module _ (gen-split : Splitting C _ P.gen) where
private
module gen-split = Splitting gen-split
S : IncohIdnCone
IncohIdnCone.apex S = gen-split.mid
IncohIdnCone.cone S x = P.cone x << gen-split.sec
IncohIdnCone.nat S f =
assoc gen-split.sec (P.cone _) f
∙ ap (_<< gen-split.sec) (P.nat f)
private
module S = IncohIdnCone S
coh : S.has-coherent-generic-point
coh = ap (_<< gen-split.sec) H ∙ gen-split.sec-is-section
where
H : P.cone gen-split.mid = gen-split.ret
H =
P.cone gen-split.mid
=⟨ P.nat gen-split.ret ⁻¹ ⟩
gen-split.ret << P.gen
=⟨ ap (gen-split.ret <<_) (gen-split.splitting ⁻¹) ⟩
gen-split.ret << (gen-split.sec << gen-split.ret)
=⟨ assoc gen-split.ret gen-split.sec gen-split.ret ⟩
(gen-split.ret << gen-split.sec) << gen-split.ret
=⟨ ap (_<< gen-split.ret) gen-split.sec-is-section ⟩
idn _ << gen-split.ret
=⟨ runit gen-split.ret ⟩
gen-split.ret ∎
initiality : has-initial-object C
pr₁ initiality = S.apex
pr₂ initiality = apex-is-initial S coh
module _ (P : SemicohIdnCone) where
private
module P = SemicohIdnCone P
gen-gen# = ap (P.gen <<_) P.gen#
gen#-gen = ap (_<< P.gen) P.gen#
open QuasiIdempotence
gen-qidem : QuasiIdempotence C P.apex P.gen
Q0 gen-qidem = P.gen#
Q1 gen-qidem = cancel-right _ _ P.gen# H2
where
H0 : gen#-gen ∙ P.gen# = assoc P.gen P.gen P.gen ⁻¹ ∙ gen-gen# ∙ P.gen#
H0 = P.coh P.gen P.gen P.gen P.gen#
H1 : assoc P.gen P.gen P.gen ∙ (gen#-gen ∙ P.gen#) = gen-gen# ∙ P.gen#
H1 =
assoc P.gen P.gen P.gen ∙ (gen#-gen ∙ P.gen#)
=⟨ ap (assoc P.gen P.gen P.gen ∙_) H0 ⟩
assoc P.gen P.gen P.gen ∙ (assoc P.gen P.gen P.gen ⁻¹ ∙ gen-gen# ∙ P.gen#)
=⟨ ap (assoc P.gen P.gen P.gen ∙_) (∙assoc (assoc P.gen P.gen P.gen ⁻¹) (gen-gen#) P.gen#) ⟩
assoc P.gen P.gen P.gen ∙ (assoc P.gen P.gen P.gen ⁻¹ ∙ (gen-gen# ∙ P.gen#))
=⟨ ∙assoc (assoc P.gen P.gen P.gen) (assoc P.gen P.gen P.gen ⁻¹) (gen-gen# ∙ P.gen#) ⁻¹ ⟩
(assoc P.gen P.gen P.gen ∙ assoc P.gen P.gen P.gen ⁻¹) ∙ (gen-gen# ∙ P.gen#)
=⟨ ap (_∙ (gen-gen# ∙ P.gen#)) (right-inverse (assoc P.gen P.gen P.gen) ⁻¹) ⟩
refl ∙ (gen-gen# ∙ P.gen#)
=⟨ refl-left-neutral ⟩
gen-gen# ∙ P.gen# ∎
H2 : assoc _ _ _ ∙ gen#-gen ∙ P.gen# = gen-gen# ∙ P.gen#
H2 = ∙assoc (assoc _ _ _) (gen#-gen) P.gen# ∙ H1
\end{code}