Ian Ray, 15th January 2025 Edited by Ian Ray, 19th Jun 2025. We will prove some results about cocones of spans. This formalization was inspired by section 23 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) and the development found in the agda-unimath library (https://unimath.github.io/agda-unimath/synthetic-homotopy-theory.cocones-under-spans.html). \begin{code} {-# OPTIONS --safe --without-K #-} open import UF.FunExt module UF.CoconesofSpans (fe : Fun-Ext) where open import MLTT.Spartan open import UF.Base open import UF.Equiv open import UF.EquivalenceExamples open import UF.PropIndexedPiSigma open import UF.Subsingletons open import UF.Yoneda \end{code} A span is a pair of maps C --------> A | | | v B It is possible to complete a span with a commuting square C --------> A | | | | | | v v B --------> X We call such a completion a cocone over the span. We start by defining cocones over a span and characterizing their identity type. \begin{code} module _ {A : 𝓤 ̇} {B : 𝓥 ̇} {C : 𝓦 ̇} (f : C → A) (g : C → B) where cocone : 𝓣 ̇ → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣 ̇ cocone X = Σ i ꞉ (A → X) , Σ j ꞉ (B → X) , (i ∘ f ∼ j ∘ g) cocone-vertical-map : (X : 𝓣 ̇) → cocone X → (A → X) cocone-vertical-map X (i , j , H) = i cocone-horizontal-map : (X : 𝓣 ̇) → cocone X → (B → X) cocone-horizontal-map X (i , j , H) = j cocone-commuting-square : (X : 𝓣 ̇) → ((i , j , H) : cocone X) → i ∘ f ∼ j ∘ g cocone-commuting-square X (i , j , H) = H cocone-family : (X : 𝓣 ̇) → cocone X → cocone X → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣 ̇ cocone-family X (i , j , H) (i' , j' , H') = Σ K ꞉ i ∼ i' , Σ L ꞉ j ∼ j' , ∼-trans (K ∘ f) H' ∼ ∼-trans H (L ∘ g) canonical-map-from-identity-to-cocone-family : (X : 𝓣 ̇) → (u u' : cocone X) → u = u' → cocone-family X u u' canonical-map-from-identity-to-cocone-family X (i , j , H) .(i , j , H) refl = (∼-refl , ∼-refl , λ - → refl-left-neutral) cocone-family-is-identity-system : (X : 𝓣 ̇) → (x : cocone X) → is-contr (Σ y ꞉ cocone X , cocone-family X x y) cocone-family-is-identity-system {𝓣} X (i , j , H) = equiv-to-singleton e 𝟙-is-singleton where e : (Σ y ꞉ cocone X , cocone-family X (i , j , H) y) ≃ 𝟙 {𝓤 ⊔ 𝓣} e = (Σ y ꞉ cocone X , cocone-family X (i , j , H) y) ≃⟨ I ⟩ (Σ i' ꞉ (A → X) , Σ j' ꞉ (B → X) , Σ H' ꞉ (i' ∘ f ∼ j' ∘ g) , Σ K ꞉ i ∼ i' , Σ L ꞉ j ∼ j' , ∼-trans (K ∘ f) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ II ⟩ (Σ i' ꞉ (A → X) , Σ K ꞉ i ∼ i' , Σ j' ꞉ (B → X) , Σ L ꞉ j ∼ j' , Σ H' ꞉ (i' ∘ f ∼ j' ∘ g) , ∼-trans (K ∘ f) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ VII ⟩ (Σ H' ꞉ (i ∘ f ∼ j ∘ g) , H' ∼ H) ≃⟨ XIV ⟩ 𝟙 ■ where I = ≃-comp Σ-assoc (Σ-cong (λ i' → Σ-assoc)) II = Σ-cong (λ _ → ≃-comp (Σ-cong (λ _ → ≃-comp Σ-flip (Σ-cong (λ K → Σ-flip)))) Σ-flip) III = (Σ i' ꞉ (A → X) , i ∼ i') ≃⟨ IV ⟩ (Σ i' ꞉ (A → X) , i = i') ≃⟨ V ⟩ 𝟙 {𝓤 ⊔ 𝓣} ■ where IV = Σ-cong (λ - → ≃-sym (≃-funext fe i -)) V = singleton-≃-𝟙 {_} {𝓤 ⊔ 𝓣} (singleton-types-are-singletons i) VI = ≃-comp {_} {_} {𝓤 ⊔ 𝓣} (Σ-cong (λ - → ≃-sym (≃-funext fe j -))) (singleton-≃-𝟙 (singleton-types-are-singletons j)) VII = (Σ i' ꞉ (A → X) , Σ K ꞉ i ∼ i' , Σ j' ꞉ (B → X) , Σ L ꞉ j ∼ j' , Σ H' ꞉ (i' ∘ f ∼ j' ∘ g) , ∼-trans (K ∘ f) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ VIII ⟩ (Σ (i' , K) ꞉ (Σ i' ꞉ (A → X) , i ∼ i') , Σ j' ꞉ (B → X) , Σ L ꞉ j ∼ j' , Σ H' ꞉ (i' ∘ f ∼ j' ∘ g) , ∼-trans (K ∘ f) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ IX ⟩ (Σ j' ꞉ (B → X) , Σ L ꞉ j ∼ j' , Σ H' ꞉ (i ∘ f ∼ j' ∘ g) , ∼-trans (∼-refl {_} {_} {_} {_} {i} ∘ f) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ XI ⟩ (Σ (j' , L) ꞉ (Σ j' ꞉ (B → X) , j ∼ j') , Σ H' ꞉ (i ∘ f ∼ j' ∘ g) , ∼-trans (∼-refl {_} {_} {_} {_} {i} ∘ f) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ XII ⟩ (Σ H' ꞉ (i ∘ f ∼ j ∘ g) , ∼-trans (∼-refl {_} {_} {_} {_} {i} ∘ f) H' ∼ ∼-trans H (∼-refl {_} {_} {_} {_} {j} ∘ g)) ≃⟨ XIII ⟩ (Σ H' ꞉ (i ∘ f ∼ j ∘ g) , H' ∼ H) ■ where VIII = ≃-sym Σ-assoc IX = prop-indexed-sum (i , ∼-refl) (equiv-to-prop III 𝟙-is-prop) XI = ≃-sym Σ-assoc XII = prop-indexed-sum (j , ∼-refl) (equiv-to-prop VI 𝟙-is-prop) XIII = Σ-cong (λ H' → Π-cong fe fe (λ c → =-cong (refl ∙ H' c) (∼-trans H (λ _ → refl) c) refl-left-neutral (refl-right-neutral (H c) ⁻¹))) XIV = ≃-comp (Σ-cong (λ - → ≃-sym (≃-funext fe - H))) (singleton-≃-𝟙 (equiv-to-singleton (Σ-cong (λ - → =-flip)) (singleton-types-are-singletons H))) cocone-identity-characterization : (X : 𝓣 ̇) → (u u' : cocone X) → (u = u') ≃ (cocone-family X u u') cocone-identity-characterization X u u' = (canonical-map-from-identity-to-cocone-family X u u' , Yoneda-Theorem-forth u (canonical-map-from-identity-to-cocone-family X u) (cocone-family-is-identity-system X u) u') inverse-cocone-map : (X : 𝓣 ̇) → (u u' : cocone X) → cocone-family X u u' → u = u' inverse-cocone-map X u u' = ⌜ (cocone-identity-characterization X u u') ⌝⁻¹ \end{code} We also introduce the notion of a dependent cocone and characterize their identity type. \begin{code} module _ {A : 𝓤 ̇} {B : 𝓥 ̇} {C : 𝓦 ̇} (f : C → A) (g : C → B) (X : 𝓣 ̇) where dependent-cocone : (cocone f g X) → (X → 𝓣' ̇) → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣' ̇ dependent-cocone (l , r , G) P = Σ i ꞉ ((a : A) → P (l a)) , Σ j ꞉ ((b : B) → P (r b)) , ((λ - → transport P (G -) ((i ∘ f) -)) ∼ j ∘ g) dependent-cocone-vertical-map : (t : cocone f g X) (P : X → 𝓣' ̇) → dependent-cocone t P → (a : A) → P (cocone-vertical-map f g X t a) dependent-cocone-vertical-map t P (i , j , H) = i dependent-cocone-horizontal-map : (t : cocone f g X) (P : X → 𝓣' ̇) → dependent-cocone t P → (b : B) → P (cocone-horizontal-map f g X t b) dependent-cocone-horizontal-map t P (i , j , H) = j dependent-cocone-commuting-square : (t : cocone f g X) (P : X → 𝓣' ̇) → ((i , j , H) : dependent-cocone t P) → ((λ - → transport P (cocone-commuting-square f g X t -) ((i ∘ f) -))) ∼ j ∘ g dependent-cocone-commuting-square t P (i , j , H) = H dependent-cocone-family : (t : cocone f g X) (P : X → 𝓣' ̇) → dependent-cocone t P → dependent-cocone t P → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣' ̇ dependent-cocone-family (l , r , G) P (i , j , H) (i' , j' , H') = Σ K ꞉ i ∼ i' , Σ L ꞉ j ∼ j' , ∼-trans (λ - → ap (transport P (G -)) ((K ∘ f) -)) H' ∼ ∼-trans H (L ∘ g) canonical-map-from-identity-to-dependent-cocone-family : (t : cocone f g X) (P : X → 𝓣' ̇) → (u u' : dependent-cocone t P) → u = u' → dependent-cocone-family t P u u' canonical-map-from-identity-to-dependent-cocone-family (l , r , G) P (i , j , H) .(i , j , H) refl = (∼-refl , ∼-refl , λ c → refl-left-neutral {_} {_} {_} {_} {H c}) dependent-cocone-family-is-identity-system : (t : cocone f g X) (P : X → 𝓣' ̇) → (x : dependent-cocone t P) → is-contr (Σ y ꞉ dependent-cocone t P , dependent-cocone-family t P x y) dependent-cocone-family-is-identity-system {𝓣'} (l , r , G) P (i , j , H) = equiv-to-singleton e 𝟙-is-singleton where e : (Σ y ꞉ dependent-cocone (l , r , G) P , dependent-cocone-family (l , r , G) P (i , j , H) y) ≃ 𝟙 {𝓤 ⊔ 𝓣'} e = (Σ y ꞉ dependent-cocone (l , r , G) P , dependent-cocone-family (l , r , G) P (i , j , H) y) ≃⟨ I ⟩ (Σ i' ꞉ ((a : A) → P (l a)) , Σ j' ꞉ ((b : B) → P (r b)) , Σ H' ꞉ ((λ - → transport P (G -) ((i' ∘ f) -)) ∼ j' ∘ g) , Σ K ꞉ i ∼ i' , Σ L ꞉ j ∼ j' , ∼-trans (λ - → ap (transport P (G -)) ((K ∘ f) -)) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ II ⟩ (Σ i' ꞉ ((a : A) → P (l a)) , Σ K ꞉ i ∼ i' , Σ j' ꞉ ((b : B) → P (r b)) , Σ L ꞉ j ∼ j' , Σ H' ꞉ ((λ - → transport P (G -) ((i' ∘ f) -)) ∼ j' ∘ g) , ∼-trans (λ - → ap (transport P (G -)) ((K ∘ f) -)) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ VII ⟩ (Σ H' ꞉ ((λ - → transport P (G -) ((i ∘ f) -)) ∼ j ∘ g) , H' ∼ H) ≃⟨ XIV ⟩ 𝟙 ■ where I = ≃-comp Σ-assoc (Σ-cong (λ i' → Σ-assoc)) II = Σ-cong (λ _ → ≃-comp (Σ-cong (λ _ → ≃-comp Σ-flip (Σ-cong (λ K → Σ-flip)))) Σ-flip) III = (Σ i' ꞉ ((a : A) → P (l a)) , i ∼ i') ≃⟨ IV ⟩ (Σ i' ꞉ ((a : A) → P (l a)) , i = i') ≃⟨ V ⟩ 𝟙 {𝓤 ⊔ 𝓣'} ■ where IV = Σ-cong (λ - → ≃-sym (≃-funext fe i -)) V = singleton-≃-𝟙 {_} {𝓤 ⊔ 𝓣'} (singleton-types-are-singletons i) VI = ≃-comp {_} {_} {𝓤 ⊔ 𝓣'} (Σ-cong (λ - → ≃-sym (≃-funext fe j -))) (singleton-≃-𝟙 (singleton-types-are-singletons j)) VII = (Σ i' ꞉ ((a : A) → P (l a)) , Σ K ꞉ i ∼ i' , Σ j' ꞉ ((b : B) → P (r b)) , Σ L ꞉ j ∼ j' , Σ H' ꞉ ((λ - → transport P (G -) ((i' ∘ f) -)) ∼ j' ∘ g) , ∼-trans (λ - → ap (transport P (G -)) ((K ∘ f) -)) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ VIII ⟩ (Σ (i' , K) ꞉ (Σ i' ꞉ ((a : A) → P (l a)) , i ∼ i') , Σ j' ꞉ ((b : B) → P (r b)) , Σ L ꞉ j ∼ j' , Σ H' ꞉ ((λ - → transport P (G -) ((i' ∘ f) -)) ∼ j' ∘ g) , ∼-trans (λ - → ap (transport P (G -)) ((K ∘ f) -)) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ IX ⟩ (Σ j' ꞉ ((b : B) → P (r b)) , Σ L ꞉ j ∼ j' , Σ H' ꞉ ((λ - → transport P (G -) ((i ∘ f) -)) ∼ j' ∘ g) , ∼-trans (λ - → ap (transport P (G -)) refl) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ XI ⟩ (Σ (j' , L) ꞉ (Σ j' ꞉ ((b : B) → P (r b)) , j ∼ j') , Σ H' ꞉ ((λ - → transport P (G -) ((i ∘ f) -)) ∼ j' ∘ g) , ∼-trans (λ - → ap (transport P (G -)) refl) H' ∼ ∼-trans H (L ∘ g)) ≃⟨ XII ⟩ (Σ H' ꞉ ((λ - → transport P (G -) ((i ∘ f) -)) ∼ j ∘ g) , ∼-trans (λ - → ap (transport P (G -)) refl) H' ∼ ∼-trans H (∼-refl {_} {_} {_} {_} {j} ∘ g)) ≃⟨ XIII ⟩ (Σ H' ꞉ ((λ - → transport P (G -) ((i ∘ f) -)) ∼ j ∘ g) , H' ∼ H) ■ where VIII = ≃-sym Σ-assoc IX = prop-indexed-sum (i , ∼-refl) (equiv-to-prop III 𝟙-is-prop) XI = ≃-sym Σ-assoc XII = prop-indexed-sum (j , ∼-refl) (equiv-to-prop VI 𝟙-is-prop) XIII = Σ-cong (λ H' → Π-cong fe fe (λ c → =-cong (refl ∙ H' c) (∼-trans H (λ _ → refl) c) refl-left-neutral (refl-right-neutral (H c) ⁻¹))) XIV = ≃-comp (Σ-cong (λ - → ≃-sym (≃-funext fe - H))) (singleton-≃-𝟙 (equiv-to-singleton (Σ-cong (λ - → =-flip)) (singleton-types-are-singletons H))) dependent-cocone-identity-characterization : (t : cocone f g X) (P : X → 𝓣' ̇) → (u u' : dependent-cocone t P) → (u = u') ≃ (dependent-cocone-family t P u u') dependent-cocone-identity-characterization t P u u' = (canonical-map-from-identity-to-dependent-cocone-family t P u u' , Yoneda-Theorem-forth u (canonical-map-from-identity-to-dependent-cocone-family t P u) (dependent-cocone-family-is-identity-system t P u) u') inverse-dependent-cocone-map : (t : cocone f g X) (P : X → 𝓣' ̇) → (u u' : dependent-cocone t P) → dependent-cocone-family t P u u' → u = u' inverse-dependent-cocone-map t P u u' = ⌜ (dependent-cocone-identity-characterization t P u u') ⌝⁻¹ \end{code} We now define the type of morphisms between (non-dependent) cocones. We *should* give a characterization of their identity type but fortunately we only need a map in the trivial direction for the purposes of defining pushouts. \begin{code} module _ {A : 𝓤 ̇} {B : 𝓥 ̇} {C : 𝓦 ̇} (f : C → A) (g : C → B) (X : 𝓣 ̇) (P : 𝓣' ̇) where cocone-morphism : cocone f g P → cocone f g X → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣 ⊔ 𝓣' ̇ cocone-morphism (i , j , H) s' = Σ u ꞉ (P → X) , cocone-family f g X (u ∘ i , u ∘ j , ∼-ap-∘ u H) s' cocone-morphism-map : (s : cocone f g P) → (s' : cocone f g X) → cocone-morphism s s' → P → X cocone-morphism-map s s' (u , _) = u cocone-morphism-left-coherence : ((i , j , H) : cocone f g P) → ((i' , j' , H') : cocone f g X) → ((u , K , L , M) : cocone-morphism (i , j , H) (i' , j' , H')) → u ∘ i ∼ i' cocone-morphism-left-coherence s s' (_ , K , _) = K cocone-morphism-right-coherence : ((i , j , H) : cocone f g P) → ((i' , j' , H') : cocone f g X) → ((u , K , L , M) : cocone-morphism (i , j , H) (i' , j' , H')) → u ∘ j ∼ j' cocone-morphism-right-coherence s s' (_ , _ , L , _) = L cocone-morphism-homotopy-coherence : ((i , j , H) : cocone f g P) → ((i' , j' , H') : cocone f g X) → ((u , K , L , M) : cocone-morphism (i , j , H) (i' , j' , H')) → ∼-trans (K ∘ f) H' ∼ ∼-trans (∼-ap-∘ u H) (L ∘ g) cocone-morphism-homotopy-coherence s s' (_ , _ , _ , M) = M Alternative-Path : (s : cocone f g P) → (s' : cocone f g X) → cocone-morphism s s' → cocone-morphism s s' → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣 ⊔ 𝓣' ̇ Alternative-Path (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M') = (θ : (x : P) → u x = u' x) (ϕl : (a : A) → θ (i a) ∙ K' a = K a) (ϕr : (b : B) → θ (j b) ∙ L' b = L b) (c : C) → K (f c) ∙ H' c = ap u (H c) ∙ L (g c) alt-path : (s : cocone f g P) → (s' : cocone f g X) → (m : cocone-morphism s s') → (m' : cocone-morphism s s') → Alternative-Path s s' m m' alt-path (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M') θ ϕl ϕr c = K (f c) ∙ H' c =⟨ I ⟩ (θ (i (f c)) ∙ K' (f c)) ∙ H' c =⟨ II ⟩ θ (i (f c)) ∙ (K' (f c) ∙ H' c) =⟨ III ⟩ θ (i (f c)) ∙ (ap u' (H c) ∙ L' (g c)) =⟨ IV ⟩ (θ (i (f c)) ∙ ap u' (H c)) ∙ L' (g c) =⟨ V ⟩ (ap u (H c) ∙ θ (j (g c))) ∙ L' (g c) =⟨ VI ⟩ ap u (H c) ∙ (θ (j (g c)) ∙ L' (g c)) =⟨ VII ⟩ ap u (H c) ∙ L (g c) ∎ where I = ap (_∙ H' c) (ϕl (f c) ⁻¹) II = ∙assoc (θ (i (f c))) (K' (f c)) (H' c) III = ap (θ (i (f c)) ∙_) (M' c) IV = ∙assoc (θ (i (f c))) (ap u' (H c)) (L' (g c)) ⁻¹ V = ap (_∙ L' (g c)) (homotopies-are-natural u u' θ {_} {_} {H c}) VI = ∙assoc (ap u (H c)) (θ (j (g c))) (L' (g c)) VII = ap (ap u (H c) ∙_) (ϕr (g c)) cocone-morphism-family : (s : cocone f g P) → (s' : cocone f g X) → cocone-morphism s s' → cocone-morphism s s' → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ⊔ 𝓣 ⊔ 𝓣' ̇ cocone-morphism-family (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M') = Σ θ ꞉ ((x : P) → u x = u' x) , Σ ϕl ꞉ ((a : A) → θ (i a) ∙ K' a = K a) , Σ ϕr ꞉ ((b : B) → θ (j b) ∙ L' b = L b) , ((c : C) → M c = alt-path (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M') θ ϕl ϕr c) cocone-morphism-family-homotopy : (s : cocone f g P) → (s' : cocone f g X) → ((u , K , L , M) : cocone-morphism s s') → ((u' , K' , L' , M') : cocone-morphism s s') → cocone-morphism-family s s' (u , K , L , M) (u' , K' , L' , M') → u ∼ u' cocone-morphism-family-homotopy s s' m m' (θ , _) = θ cocone-morphism-family-left-coherence : ((i , j , H) : cocone f g P) → ((i' , j' , H') : cocone f g X) → ((u , K , L , M) : cocone-morphism (i , j , H) (i' , j' , H')) → ((u' , K' , L' , M') : cocone-morphism (i , j , H) (i' , j' , H')) → ((θ , ϕl , ϕr , γ) : cocone-morphism-family (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M')) → (a : A) → θ (i a) ∙ K' a = K a cocone-morphism-family-left-coherence s s' m m' (_ , ϕl , _) = ϕl cocone-morphism-family-right-coherence : ((i , j , H) : cocone f g P) → ((i' , j' , H') : cocone f g X) → ((u , K , L , M) : cocone-morphism (i , j , H) (i' , j' , H')) → ((u' , K' , L' , M') : cocone-morphism (i , j , H) (i' , j' , H')) → ((θ , ϕl , ϕr , γ) : cocone-morphism-family (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M')) → (b : B) → θ (j b) ∙ L' b = L b cocone-morphism-family-right-coherence s s' m m' (_ , _ , ϕr , _) = ϕr cocone-morphism-family-homotopy-coherence : ((i , j , H) : cocone f g P) → ((i' , j' , H') : cocone f g X) → ((u , K , L , M) : cocone-morphism (i , j , H) (i' , j' , H')) → ((u' , K' , L' , M') : cocone-morphism (i , j , H) (i' , j' , H')) → ((θ , ϕl , ϕr , γ) : cocone-morphism-family (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M')) → (c : C) → M c = alt-path (i , j , H) (i' , j' , H') (u , K , L , M) (u' , K' , L' , M') θ ϕl ϕr c cocone-morphism-family-homotopy-coherence s s' m m' (_ , _ , _ , γ) = γ canonical-map-to-cocone-morphism-family : (s : cocone f g P) → (s' : cocone f g X) → (m : cocone-morphism s s') → (m' : cocone-morphism s s') → m = m' → cocone-morphism-family s s' m m' canonical-map-to-cocone-morphism-family (i , j , H) (i' , j' , H') (u , K , L , M) .(u , K , L , M) refl = (∼-refl , (λ - → refl-left-neutral) , (λ - → refl-left-neutral) , II) where I : {Y : 𝓤' ̇} {Z : 𝓥' ̇} {x y : Y} {z' z : Z} (f' : Y → Z) (p : x = y) (q : f' y = z) (p' : f' x = z') (q' : z' = z) (α : p' ∙ q' = (ap f' p) ∙ q) → α = ap (_∙ q') (refl-left-neutral {_} {_} {_} {_} {p'} ⁻¹) ∙ (∙assoc refl p' q' ∙ (ap (refl ∙_) α ∙ (∙assoc refl (ap f' p) q ⁻¹ ∙ (ap (_∙ q) (homotopies-are-natural f' f' ∼-refl {_} {_} {p}) ∙ (∙assoc (ap f' p) (refl {_} {_} {f' y}) q ∙ ap (ap f' p ∙_) (refl-left-neutral {_} {_} {_} {_} {q})))))) I f' refl refl p' refl α = IV where Notice : p' = refl Notice = α III : {Y : 𝓤' ̇} {y : Y} (p : y = y) (α : p = refl) → α = ap (_∙ refl) (refl-left-neutral ⁻¹) ∙ (∙assoc refl p refl ∙ ap (refl ∙_) α) III p refl = refl IV : α = ap (_∙ refl) (refl-left-neutral ⁻¹) ∙ (∙assoc refl p' refl ∙ ap (refl ∙_) α) IV = III p' α II : (c : C) → M c = alt-path (i , j , H) (i' , j' , H') (u , K , L , M) (u , K , L , M) ∼-refl (λ - → refl-left-neutral) (λ - → refl-left-neutral) c II c = I u (H c) (L (g c)) (K (f c)) (H' c) (M c) \end{code}