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}