Ian Ray, 21st Jun 2025. We develop sequential colimits in HoTT/UF. This formalization follows Section 26 of Introduction to Homotopy Type Theory by Egbert Rijke (HoTTEST summer school version: https://github.com/martinescardo/HoTTEST-Summer-School/blob/main/HoTT/hott-intro.pdf). \begin{code} {-# OPTIONS --safe --without-K #-} open import UF.FunExt module UF.SequentialColimits (fe : Fun-Ext) where open import MLTT.Spartan open import UF.Base open import UF.CoconesofSpans fe open import UF.Equiv open import UF.EquivalenceExamples open import UF.PropIndexedPiSigma open import UF.Pushouts fe open import UF.Subsingletons open import UF.Yoneda \end{code} A diagram of the following form a₀ a₁ a₂ A₀ ----> A₁ ----> A₂ ----> ... is a type sequence. We can give a formal specification as follows. \begin{code} type-sequence : (𝓤 : Universe) → (𝓤 ⁺) ̇ type-sequence 𝓤 = Σ A ꞉ (ℕ → 𝓤 ̇) , ((n : ℕ) → A n → A (succ n)) \end{code} A sequential cocone on a type sequence consists of a sequence of maps to a specified type a₀ a₁ a₂ A₀ ----> A₁ ----> A₂ ----> ... \ | / \ | / b₀ \ | b₁ / b₂ ... \ | / \ | / v v v B such that every triangle commutes. Formally we can define this as follows. \begin{code} sequential-cocone : {𝓤 𝓥 : Universe} → type-sequence 𝓤 → 𝓥 ̇ → 𝓤 ⊔ 𝓥 ̇ sequential-cocone (A , a) B = Σ b ꞉ ((n : ℕ) → A n → B) , ((n : ℕ) → b n ∼ b (succ n) ∘ a n) \end{code} We now characterize the identity type of sequential cocones. \begin{code} module _ (𝓐@(A , a) : type-sequence 𝓤) (B : 𝓥 ̇) where sequential-cocone-identity : sequential-cocone 𝓐 B → sequential-cocone 𝓐 B → 𝓤 ⊔ 𝓥 ̇ sequential-cocone-identity (s , S) (r , R) = Σ H ꞉ ((n : ℕ) → s n ∼ r n) , ((n : ℕ) → ∼-trans (S n) (H (succ n) ∘ a n) ∼ ∼-trans (H n) (R n)) id-to-sequential-cocone-family : (𝓑 𝓑' : sequential-cocone 𝓐 B) → 𝓑 = 𝓑' → sequential-cocone-identity 𝓑 𝓑' id-to-sequential-cocone-family 𝓑 𝓑 refl = ((λ - → ∼-refl) , λ - → λ -' → refl-left-neutral ⁻¹) sequential-cocone-identity-is-identity-system : (𝓑 : sequential-cocone 𝓐 B) → is-contr (Σ 𝓑' ꞉ (sequential-cocone 𝓐 B) , sequential-cocone-identity 𝓑 𝓑') sequential-cocone-identity-is-identity-system (b , G) = equiv-to-singleton e 𝟙-is-singleton where e : (Σ 𝓑' ꞉ (sequential-cocone 𝓐 B) , sequential-cocone-identity (b , G) 𝓑') ≃ 𝟙 {𝓤 ⊔ 𝓥} e = (Σ 𝓑' ꞉ (sequential-cocone 𝓐 B) , sequential-cocone-identity (b , G) 𝓑') ≃⟨ I ⟩ (Σ b' ꞉ ((n : ℕ) → A n → B) , Σ G' ꞉ ((n : ℕ) → b' n ∼ b' (succ n) ∘ a n) , Σ H ꞉ ((n : ℕ) → b n ∼ b' n) , ((n : ℕ) → ∼-trans (G n) (H (succ n) ∘ a n) ∼ ∼-trans (H n) (G' n))) ≃⟨ II ⟩ (Σ b' ꞉ ((n : ℕ) → A n → B) , Σ H ꞉ ((n : ℕ) → b n ∼ b' n) , Σ G' ꞉ ((n : ℕ) → b' n ∼ b' (succ n) ∘ a n) , ((n : ℕ) → ∼-trans (G n) (H (succ n) ∘ a n) ∼ ∼-trans (H n) (G' n))) ≃⟨ III ⟩ (Σ G' ꞉ ((n : ℕ) → b n ∼ b (succ n) ∘ a n) , ((n : ℕ) → G n ∼ G' n)) ≃⟨ IV ⟩ 𝟙 ■ where I = Σ-assoc II = Σ-cong (λ - → Σ-flip) III = (Σ b' ꞉ ((n : ℕ) → A n → B) , Σ H ꞉ ((n : ℕ) → b n ∼ b' n) , Σ G' ꞉ ((n : ℕ) → b' n ∼ b' (succ n) ∘ a n) , ((n : ℕ) → ∼-trans (G n) (H (succ n) ∘ a n) ∼ ∼-trans (H n) (G' n))) ≃⟨ V ⟩ (Σ (b' , H) ꞉ (Σ b' ꞉ ((n : ℕ) → A n → B) , ((n : ℕ) → b n ∼ b' n)) , (Σ G' ꞉ ((n : ℕ) → b' n ∼ b' (succ n) ∘ a n) , ((n : ℕ) → ∼-trans (G n) (H (succ n) ∘ a n) ∼ ∼-trans (H n) (G' n)))) ≃⟨ VII ⟩ (Σ G' ꞉ ((n : ℕ) → b n ∼ b (succ n) ∘ a n) , ((n : ℕ) → ∼-trans (G n) ∼-refl ∼ ∼-trans ∼-refl (G' n))) ≃⟨ VIII ⟩ (Σ G' ꞉ ((n : ℕ) → b n ∼ b (succ n) ∘ a n) , ((n : ℕ) → G n ∼ G' n)) ■ where V = ≃-sym Σ-assoc VI = (Σ b' ꞉ ((n : ℕ) → A n → B) , ((n : ℕ) → b n ∼ b' n)) ≃⟨ Σ-cong IX ⟩ (Σ b' ꞉ ((n : ℕ) → A n → B) , b = b') ≃⟨ X ⟩ 𝟙 ■ where IX : (b' : (n : ℕ) → A n → B) → ((n : ℕ) → b n ∼ b' n) ≃ (b = b') IX b' = ((n : ℕ) → b n ∼ b' n) ≃⟨ Π-cong fe fe (λ n → ≃-sym (≃-funext fe (b n) (b' n))) ⟩ ((n : ℕ) → b n = b' n) ≃⟨ ≃-sym (≃-funext fe b b') ⟩ (b = b') ■ X = singleton-≃-𝟙 {𝓤 ⊔ 𝓥} {𝓥} (singleton-types-are-singletons b) VII = prop-indexed-sum (b , (λ n → ∼-refl)) (equiv-to-prop VI 𝟙-is-prop) VIII = Σ-cong (λ G' → Π-cong fe fe (λ n → Π-cong fe fe (λ x → =-cong (G n x) (∼-trans (λ - → refl) (G' n) x) refl refl-left-neutral))) IV = (Σ G' ꞉ ((n : ℕ) → b n ∼ b (succ n) ∘ a n) , ((n : ℕ) → G n ∼ G' n)) ≃⟨ VI ⟩ (Σ G' ꞉ ((n : ℕ) → b n ∼ b (succ n) ∘ a n) , G = G') ≃⟨ VII ⟩ 𝟙 ■ where V : (G' : ((n : ℕ) → b n ∼ b (succ n) ∘ a n)) → ((n : ℕ) → G n ∼ G' n) ≃ (G = G') V G' = ((n : ℕ) → G n ∼ G' n) ≃⟨ Π-cong fe fe (λ n → ≃-sym (≃-funext fe (G n) (G' n))) ⟩ ((n : ℕ) → G n = G' n) ≃⟨ ≃-sym (≃-funext fe G G') ⟩ (G = G') ■ VI = Σ-cong V VII = singleton-≃-𝟙 (singleton-types-are-singletons G) sequential-cocone-identity-characterization : (𝓑 𝓑' : sequential-cocone 𝓐 B) → (𝓑 = 𝓑') ≃ (sequential-cocone-identity 𝓑 𝓑') sequential-cocone-identity-characterization 𝓑 𝓑' = (id-to-sequential-cocone-family 𝓑 𝓑' , Yoneda-Theorem-forth 𝓑 (id-to-sequential-cocone-family 𝓑) (sequential-cocone-identity-is-identity-system 𝓑) 𝓑') sequential-cocone-family-to-id : (𝓑 𝓑' : sequential-cocone 𝓐 B) → (sequential-cocone-identity 𝓑 𝓑') → 𝓑 = 𝓑' sequential-cocone-family-to-id 𝓑 𝓑' = ⌜ sequential-cocone-identity-characterization 𝓑 𝓑' ⌝⁻¹ \end{code} Given a sequential cocone over X and a map X → Y there is a canonical assignment to a sequential cocone over Y. \begin{code} module _ (𝓐 : type-sequence 𝓤) (X : 𝓥 ̇) (Y : 𝓣 ̇) where canonical-map-to-sequential-cocone : sequential-cocone 𝓐 X → (X → Y) → sequential-cocone 𝓐 Y canonical-map-to-sequential-cocone (h , H) u = ((λ n → u ∘ h n) , λ n → ∼-ap-∘ u (H n)) \end{code} A sequential cocone over X is universal if the above map is an equivalence for any Y. Such a sequential cocone is said to be the sequential colimit of a type sequence. \begin{code} Sequential-Colimit-Universal-Property : (𝓧 : sequential-cocone 𝓐 X) → 𝓤 ⊔ 𝓥 ⊔ 𝓣 ̇ Sequential-Colimit-Universal-Property 𝓧 = is-equiv (canonical-map-to-sequential-cocone 𝓧) \end{code} We now give a construction of the sequential colimit in terms of the pushout. This construction follows 26.2 in Introduction to Homotopy Type Theory (link above). The sequential colimit A∞ can be constructed as the pushout of the following diagram [id , σ] Σ A + Σ A ------------> Σ A | | [id , id] | | inrr | | Σ A ----------------> A∞ inll where σ (n , x) = (n + 1 , a n x). \begin{code} module _ (𝓐@(A , a) : type-sequence 𝓤) (X : 𝓣 ̇) where σ : Σ A → Σ A σ (n , x) = (succ n , a n x) f : Σ A + Σ A → Σ A f = cases id id g : Σ A + Σ A → Σ A g = cases id σ private index : Σ A → ℕ index = pr₁ element-at : ((n , x) : Σ A) → A n element-at = pr₂ module _ (push-ex : pushout-exists f g) where open pushout-exists push-ex sequential-colimit : 𝓤 ̇ sequential-colimit = pushout \end{code} We provide the sequential cocone structure for the sequential colimit. \begin{code} ι : (n : ℕ) → A n → sequential-colimit ι n x = inrr (n , x) seq-colim-homotopy : (n : ℕ) → ι n ∼ ι (succ n) ∘ a n seq-colim-homotopy n x = glue (inl (n , x)) ⁻¹ ∙ glue (inr (n , x)) sequential-colimit-is-cocone : sequential-cocone 𝓐 sequential-colimit sequential-colimit-is-cocone = (ι , seq-colim-homotopy) \end{code} We will quickly provide names and a technical lemma that will prove useful later. \begin{code} ap-on-glue : (u : sequential-colimit → X) → ((n , x) : Σ A) → ap u (seq-colim-homotopy n x) = ap u (glue (inl (n , x))) ⁻¹ ∙ ap u (glue (inr (n , x))) ap-on-glue u (n , x) = ap u (seq-colim-homotopy n x) =⟨ I ⟩ ap u (glue (inl (n , x)) ⁻¹) ∙ ap u (glue (inr (n , x))) =⟨ II ⟩ ap u (glue (inl (n , x))) ⁻¹ ∙ ap u (glue (inr (n , x))) ∎ where I = ap-∙ u (glue (inl (n , x)) ⁻¹) (glue (inr (n , x))) II = ap (_∙ ap u (glue (inr (n , x)))) (ap-sym u (glue (inl (n , x)))) ⁻¹ \end{code} We show that cocones over the above pushout diagram are equivalent to sequential cocones over the above type sequence. \begin{code} gluing-from-sequential-cocone : ((b , H) : sequential-cocone 𝓐 X) → (c : Σ A + Σ A) → b (index (f c)) (element-at (f c)) = b (index (g c)) (element-at (g c)) gluing-from-sequential-cocone (b , H) (inl -) = refl gluing-from-sequential-cocone (b , H) (inr (n , x)) = H n x pushout-cocone-to-seq-cocone : cocone f g X → sequential-cocone 𝓐 X pushout-cocone-to-seq-cocone (i , j , H) = (curry j , I) where I : (n : ℕ) → (curry j n) ∼ (λ - → j (succ n , a n -)) I n x = H (inl (n , x)) ⁻¹ ∙ H (inr (n , x)) seq-cocone-to-pushout-cocone : sequential-cocone 𝓐 X → cocone f g X seq-cocone-to-pushout-cocone (b , H) = (uncurry b , uncurry b , gluing-from-sequential-cocone (b , H)) pushout-cocone-to-seq-cocone-is-retraction : pushout-cocone-to-seq-cocone ∘ seq-cocone-to-pushout-cocone ∼ id pushout-cocone-to-seq-cocone-is-retraction (b , H) = sequential-cocone-family-to-id 𝓐 X (pushout-cocone-to-seq-cocone (seq-cocone-to-pushout-cocone (b , H))) (b , H) ((λ n → λ x → refl) , (λ n → λ x → refl)) pushout-cocone-to-seq-cocone-is-section : seq-cocone-to-pushout-cocone ∘ pushout-cocone-to-seq-cocone ∼ id pushout-cocone-to-seq-cocone-is-section (i , j , H) = inverse-cocone-map f g X (seq-cocone-to-pushout-cocone (pushout-cocone-to-seq-cocone (i , j , H))) (i , j , H) ((λ (n , x) → H (inl (n , x)) ⁻¹) , ∼-refl , I) where I : (z : Σ A + Σ A) → H (inl (index (f z) , element-at (f z))) ⁻¹ ∙ H z = gluing-from-sequential-cocone (curry j , λ n → λ x → H (inl (n , x)) ⁻¹ ∙ H (inr (n , x))) z I (inl -) = left-inverse (H (inl -)) I (inr -) = refl pushout-to-seq-cocone-is-equiv : is-equiv pushout-cocone-to-seq-cocone pushout-to-seq-cocone-is-equiv = qinvs-are-equivs pushout-cocone-to-seq-cocone (seq-cocone-to-pushout-cocone , pushout-cocone-to-seq-cocone-is-section , pushout-cocone-to-seq-cocone-is-retraction) \end{code} Additionally, we show that the canonical map to sequential cocones factors through the canonical map to pushout cocones and the above map that translates between them. \begin{code} canonical-maps-commute : canonical-map-to-sequential-cocone 𝓐 sequential-colimit X sequential-colimit-is-cocone ∼ pushout-cocone-to-seq-cocone ∘ canonical-map-to-cocone sequential-colimit f g pushout-cocone X canonical-maps-commute u = sequential-cocone-family-to-id 𝓐 X (canonical-map-to-sequential-cocone 𝓐 sequential-colimit X sequential-colimit-is-cocone u) (pushout-cocone-to-seq-cocone (canonical-map-to-cocone sequential-colimit f g pushout-cocone X u)) (I , II) where I : (n : ℕ) → u ∘ ι n ∼ curry (u ∘ inrr) n I n x = refl II : (n : ℕ) (x : A n) → ap u (seq-colim-homotopy n x) = refl ∙ (ap u (glue (inl (n , x))) ⁻¹ ∙ ap u (glue (inr (n , x)))) II n x = ap u (seq-colim-homotopy n x) =⟨ III ⟩ ap u (glue (inl (n , x)) ⁻¹) ∙ ap u (glue (inr (n , x))) =⟨ IV ⟩ ap u (glue (inl (n , x))) ⁻¹ ∙ ap u (glue (inr (n , x))) =⟨ V ⟩ refl ∙ (ap u (glue (inl (n , x))) ⁻¹ ∙ ap u (glue (inr (n , x)))) ∎ where III = ap-∙ u (glue (inl (n , x)) ⁻¹) (glue (inr (n , x))) IV = ap (_∙ ap u (glue (inr (n , x)))) (ap-sym u (glue (inl (n , x))) ⁻¹) V = refl-left-neutral ⁻¹ \end{code} Using the above results we prove that the pushout constructed above satisfies the universal property of the sequential colimit. \begin{code} sequential-colimit-universal-property : Sequential-Colimit-Universal-Property 𝓐 sequential-colimit X sequential-colimit-is-cocone sequential-colimit-universal-property = transport is-equiv (dfunext fe (∼-sym canonical-maps-commute)) (∘-is-equiv pushout-universal-property pushout-to-seq-cocone-is-equiv) \end{code} We unpack some useful results from the from the universal property. \begin{code} module _ (𝓧@(h , H) : sequential-cocone 𝓐 X) where canonical-map-seq-cocone-fiber-contr : is-contr (fiber (canonical-map-to-sequential-cocone 𝓐 sequential-colimit X sequential-colimit-is-cocone) 𝓧) canonical-map-seq-cocone-fiber-contr = equivs-are-vv-equivs (canonical-map-to-sequential-cocone 𝓐 sequential-colimit X sequential-colimit-is-cocone) sequential-colimit-universal-property 𝓧 canonical-map-seq-cocone-fiber-contr' : is-contr (Σ u ꞉ (sequential-colimit → X) , sequential-cocone-identity 𝓐 X ((λ n → u ∘ ι n) , λ n → ∼-ap-∘ u (seq-colim-homotopy n)) 𝓧) canonical-map-seq-cocone-fiber-contr' = equiv-to-singleton' (Σ-cong (λ - → sequential-cocone-identity-characterization 𝓐 X ((λ n → - ∘ ι n) , λ n → ∼-ap-∘ - (seq-colim-homotopy n)) 𝓧)) (canonical-map-seq-cocone-fiber-contr) sequential-colimit-unique-map : Σ u ꞉ (sequential-colimit → X) , sequential-cocone-identity 𝓐 X ((λ n → u ∘ ι n) , λ n → ∼-ap-∘ u (seq-colim-homotopy n)) 𝓧 → sequential-colimit → X sequential-colimit-unique-map (u , _ , _) = u sequential-colimit-homotopy : (z : Σ u ꞉ (sequential-colimit → X) , sequential-cocone-identity 𝓐 X ((λ n → u ∘ ι n) , λ n → ∼-ap-∘ u (seq-colim-homotopy n)) 𝓧) → (n : ℕ) → sequential-colimit-unique-map z ∘ ι n ∼ h n sequential-colimit-homotopy (_ , G , _) = G sequential-colimit-glue : ((u , G , M) : Σ u ꞉ (sequential-colimit → X) , sequential-cocone-identity 𝓐 X ((λ n → u ∘ ι n) , λ n → ∼-ap-∘ u (seq-colim-homotopy n)) 𝓧) → (n : ℕ) → ∼-trans (∼-ap-∘ u (seq-colim-homotopy n)) (λ x → G (succ n) (a n x)) ∼ ∼-trans (G n) (H n) sequential-colimit-glue (_ , _ , M) = M \end{code} From the universal property we derive the recursion principle and computation rules for sequential colimits. \begin{code} sequential-colimit-recursion : sequential-cocone 𝓐 X → sequential-colimit → X sequential-colimit-recursion 𝓧 = sequential-colimit-unique-map 𝓧 (center (canonical-map-seq-cocone-fiber-contr' 𝓧)) sequential-colimit-recursion-computation : ((h , H) : sequential-cocone 𝓐 X) → (n : ℕ) → (x : A n) → sequential-colimit-recursion (h , H) (ι n x) = h n x sequential-colimit-recursion-computation 𝓧 = sequential-colimit-homotopy 𝓧 (center (canonical-map-seq-cocone-fiber-contr' 𝓧)) sequential-colimit-recursion-glue : ((h , H) : sequential-cocone 𝓐 X) → (n : ℕ) → (x : A n) → ap (sequential-colimit-recursion (h , H)) (seq-colim-homotopy n x) ∙ sequential-colimit-recursion-computation (h , H) (succ n) (a n x) = sequential-colimit-recursion-computation (h , H) n x ∙ H n x sequential-colimit-recursion-glue 𝓧 = sequential-colimit-glue 𝓧 (center (canonical-map-seq-cocone-fiber-contr' 𝓧)) \end{code} Finally, we prove the uniqueness principle for sequential colimits. \begin{code} sequential-colimit-uniqueness : (u u' : sequential-colimit → X) → (G : (n : ℕ) → u ∘ (ι n) ∼ u' ∘ (ι n)) → (M : (n : ℕ) (x : A n) → ap u (seq-colim-homotopy n x) ∙ G (succ n) (a n x) = G n x ∙ ap u' (seq-colim-homotopy n x)) → u ∼ u' sequential-colimit-uniqueness u u' G M = pushout-uniqueness u u' I II III where I : (z : Σ A) → u (inll z) = u' (inll z) I (n , x) = ap u (glue (inl (n , x))) ∙ G n x ∙ ap u' (glue (inl (n , x))) ⁻¹ II : (z : Σ A) → u (inrr z) = u' (inrr z) II (n , x) = G n x III : (c : Σ A + Σ A) → ap u (glue c) ∙ II (g c) = I (f c) ∙ ap u' (glue c) III (inl (n , x)) = p ∙ G n x =⟨ IV ⟩ p ∙ G n x ∙ (p' ⁻¹ ∙ p') =⟨ V ⟩ I (n , x) ∙ p' ∎ where p = ap u (glue (inl (n , x))) p' = ap u' (glue (inl (n , x))) IV = ap (p ∙ G n x ∙_) (sym-is-inverse p') V = ∙assoc (p ∙ G n x) (p' ⁻¹) p' ⁻¹ III (inr (n , x)) = q ∙ G (succ n) (a n x) =⟨ IV ⟩ (p ∙ p ⁻¹) ∙ (q ∙ G (succ n) (a n x)) =⟨ V ⟩ p ∙ (p ⁻¹ ∙ (q ∙ G (succ n) (a n x))) =⟨ VI ⟩ p ∙ (p ⁻¹ ∙ q ∙ G (succ n) (a n x)) =⟨ VII ⟩ p ∙ (ap u (seq-colim-homotopy n x) ∙ G (succ n) (a n x)) =⟨ VIII ⟩ p ∙ (G n x ∙ ap u' (seq-colim-homotopy n x)) =⟨ IX ⟩ p ∙ G n x ∙ ap u' (seq-colim-homotopy n x) =⟨ X' ⟩ I (n , x) ∙ q' ∎ where p = ap u (glue (inl (n , x))) q = ap u (glue (inr (n , x))) p' = ap u' (glue (inl (n , x))) q' = ap u' (glue (inr (n , x))) IV = refl-left-neutral ⁻¹ ∙ ap (_∙ (q ∙ G (succ n) (a n x))) (sym-is-inverse' p) V = ∙assoc p (p ⁻¹) (q ∙ G (succ n) (a n x)) VI = ap (p ∙_) (∙assoc (p ⁻¹) q (G (succ n) (a n x)) ⁻¹) VII = ap (p ∙_) (ap (_∙ G (succ n) (a n x)) (ap-on-glue u (n , x) ⁻¹)) VIII = ap (p ∙_) (M n x) IX = ∙assoc p (G n x) (ap u' (seq-colim-homotopy n x)) ⁻¹ X' = ap (p ∙ G n x ∙_ ) (ap-on-glue u' (n , x)) ∙ (∙assoc (p ∙ G n x) (p' ⁻¹) q') ⁻¹ \end{code} TODO. Derive the dependent universal property and induction principle for sequential colimits.