# Cocones under spans ```agda module synthetic-homotopy-theory.cocones-under-spans where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.fundamental-theorem-of-identity-types open import foundation.homotopies open import foundation.homotopy-induction open import foundation.morphisms-arrows open import foundation.span-diagrams open import foundation.structure-identity-principle open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.commuting-squares-of-maps open import foundation-core.contractible-types open import foundation-core.equality-dependent-pair-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.functoriality-dependent-pair-types open import foundation-core.identity-types open import foundation-core.torsorial-type-families ``` </details> ## Idea A **cocone under a [span](foundation.spans.md)** `A <-f- S -g-> B` with codomain `X` consists of two maps `i : A → X` and `j : B → X` equipped with a [homotopy](foundation.homotopies.md) witnessing that the square ```text g S -----> B | | f | | j ∨ ∨ A -----> X i ``` [commutes](foundation.commuting-squares-of-maps.md). ## Definitions ### Cocones ```agda cocone : {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) → UU l4 → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) cocone {A = A} {B = B} f g X = Σ (A → X) (λ i → Σ (B → X) (λ j → coherence-square-maps g f j i)) cocone-span-diagram : {l1 l2 l3 l4 : Level} → span-diagram l1 l2 l3 → UU l4 → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) cocone-span-diagram 𝒮 X = cocone (left-map-span-diagram 𝒮) (right-map-span-diagram 𝒮) X module _ {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} (f : S → A) (g : S → B) (c : cocone f g X) where horizontal-map-cocone : A → X horizontal-map-cocone = pr1 c vertical-map-cocone : B → X vertical-map-cocone = pr1 (pr2 c) coherence-square-cocone : coherence-square-maps g f vertical-map-cocone horizontal-map-cocone coherence-square-cocone = pr2 (pr2 c) ``` ### Homotopies of cocones ```agda module _ {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) {X : UU l4} where statement-coherence-htpy-cocone : (c c' : cocone f g X) → (K : horizontal-map-cocone f g c ~ horizontal-map-cocone f g c') (L : vertical-map-cocone f g c ~ vertical-map-cocone f g c') → UU (l1 ⊔ l4) statement-coherence-htpy-cocone c c' K L = (coherence-square-cocone f g c ∙h (L ·r g)) ~ ((K ·r f) ∙h coherence-square-cocone f g c') htpy-cocone : (c c' : cocone f g X) → UU (l1 ⊔ l2 ⊔ l3 ⊔ l4) htpy-cocone c c' = Σ ( horizontal-map-cocone f g c ~ horizontal-map-cocone f g c') ( λ K → Σ ( vertical-map-cocone f g c ~ vertical-map-cocone f g c') ( statement-coherence-htpy-cocone c c' K)) module _ (c c' : cocone f g X) (H : htpy-cocone c c') where horizontal-htpy-cocone : horizontal-map-cocone f g c ~ horizontal-map-cocone f g c' horizontal-htpy-cocone = pr1 H vertical-htpy-cocone : vertical-map-cocone f g c ~ vertical-map-cocone f g c' vertical-htpy-cocone = pr1 (pr2 H) coherence-htpy-cocone : statement-coherence-htpy-cocone c c' ( horizontal-htpy-cocone) ( vertical-htpy-cocone) coherence-htpy-cocone = pr2 (pr2 H) refl-htpy-cocone : (c : cocone f g X) → htpy-cocone c c pr1 (refl-htpy-cocone (i , j , H)) = refl-htpy pr1 (pr2 (refl-htpy-cocone (i , j , H))) = refl-htpy pr2 (pr2 (refl-htpy-cocone (i , j , H))) = right-unit-htpy htpy-eq-cocone : (c c' : cocone f g X) → c = c' → htpy-cocone c c' htpy-eq-cocone c .c refl = refl-htpy-cocone c module _ (c c' : cocone f g X) (p : c = c') where horizontal-htpy-eq-cocone : horizontal-map-cocone f g c ~ horizontal-map-cocone f g c' horizontal-htpy-eq-cocone = horizontal-htpy-cocone c c' (htpy-eq-cocone c c' p) vertical-htpy-eq-cocone : vertical-map-cocone f g c ~ vertical-map-cocone f g c' vertical-htpy-eq-cocone = vertical-htpy-cocone c c' (htpy-eq-cocone c c' p) coherence-square-htpy-eq-cocone : statement-coherence-htpy-cocone c c' ( horizontal-htpy-eq-cocone) ( vertical-htpy-eq-cocone) coherence-square-htpy-eq-cocone = coherence-htpy-cocone c c' (htpy-eq-cocone c c' p) is-torsorial-htpy-cocone : (c : cocone f g X) → is-torsorial (htpy-cocone c) is-torsorial-htpy-cocone c = is-torsorial-Eq-structure ( is-torsorial-htpy (horizontal-map-cocone f g c)) ( horizontal-map-cocone f g c , refl-htpy) ( is-torsorial-Eq-structure ( is-torsorial-htpy (vertical-map-cocone f g c)) ( vertical-map-cocone f g c , refl-htpy) ( is-contr-is-equiv' ( Σ ( horizontal-map-cocone f g c ∘ f ~ vertical-map-cocone f g c ∘ g) ( λ H' → coherence-square-cocone f g c ~ H')) ( tot (λ H' M → right-unit-htpy ∙h M)) ( is-equiv-tot-is-fiberwise-equiv (λ H' → is-equiv-concat-htpy _ _)) ( is-torsorial-htpy (coherence-square-cocone f g c)))) is-equiv-htpy-eq-cocone : (c c' : cocone f g X) → is-equiv (htpy-eq-cocone c c') is-equiv-htpy-eq-cocone c = fundamental-theorem-id ( is-torsorial-htpy-cocone c) ( htpy-eq-cocone c) extensionality-cocone : (c c' : cocone f g X) → (c = c') ≃ htpy-cocone c c' pr1 (extensionality-cocone c c') = htpy-eq-cocone c c' pr2 (extensionality-cocone c c') = is-equiv-htpy-eq-cocone c c' eq-htpy-cocone : (c c' : cocone f g X) → htpy-cocone c c' → c = c' eq-htpy-cocone c c' = map-inv-is-equiv (is-equiv-htpy-eq-cocone c c') ``` ### Postcomposing cocones under spans with maps ```agda cocone-map : {l1 l2 l3 l4 l5 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) {X : UU l4} {Y : UU l5} → cocone f g X → (X → Y) → cocone f g Y pr1 (cocone-map f g c h) = h ∘ horizontal-map-cocone f g c pr1 (pr2 (cocone-map f g c h)) = h ∘ vertical-map-cocone f g c pr2 (pr2 (cocone-map f g c h)) = h ·l coherence-square-cocone f g c cocone-map-span-diagram : {l1 l2 l3 l4 : Level} {𝒮 : span-diagram l1 l2 l3} {X : UU l4} (c : cocone-span-diagram 𝒮 X) → {l5 : Level} {Y : UU l5} → (X → Y) → cocone-span-diagram 𝒮 Y cocone-map-span-diagram {𝒮 = 𝒮} c = cocone-map (left-map-span-diagram 𝒮) (right-map-span-diagram 𝒮) c cocone-map-id : {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) {X : UU l4} (c : cocone f g X) → Id (cocone-map f g c id) c cocone-map-id f g c = eq-pair-eq-fiber ( eq-pair-eq-fiber (eq-htpy (ap-id ∘ coherence-square-cocone f g c))) cocone-map-comp : {l1 l2 l3 l4 l5 l6 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) {X : UU l4} (c : cocone f g X) {Y : UU l5} (h : X → Y) {Z : UU l6} (k : Y → Z) → cocone-map f g c (k ∘ h) = cocone-map f g (cocone-map f g c h) k cocone-map-comp f g (i , j , H) h k = eq-pair-eq-fiber (eq-pair-eq-fiber (eq-htpy (ap-comp k h ∘ H))) ``` ### Horizontal composition of cocones ```text i k A ----> B ----> C | | | f | | | ∨ ∨ ∨ X ----> Y ----> Z ``` ```agda cocone-comp-horizontal : { l1 l2 l3 l4 l5 l6 : Level} { A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6} ( f : A → X) (i : A → B) (k : B → C) ( c : cocone f i Y) → cocone (vertical-map-cocone f i c) k Z → cocone f (k ∘ i) Z pr1 (cocone-comp-horizontal f i k c d) = ( horizontal-map-cocone (vertical-map-cocone f i c) k d) ∘ ( horizontal-map-cocone f i c) pr1 (pr2 (cocone-comp-horizontal f i k c d)) = vertical-map-cocone (vertical-map-cocone f i c) k d pr2 (pr2 (cocone-comp-horizontal f i k c d)) = pasting-horizontal-coherence-square-maps ( i) ( k) ( f) ( vertical-map-cocone f i c) ( vertical-map-cocone (vertical-map-cocone f i c) k d) ( horizontal-map-cocone f i c) ( horizontal-map-cocone (vertical-map-cocone f i c) k d) ( coherence-square-cocone f i c) ( coherence-square-cocone (vertical-map-cocone f i c) k d) ``` A variation on the above: ```text i k A ----> B ----> C | | | f | g | | ∨ ∨ ∨ X ----> Y ----> Z j ``` ```agda cocone-comp-horizontal' : { l1 l2 l3 l4 l5 l6 : Level} { A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6} ( f : A → X) (i : A → B) (k : B → C) (g : B → Y) (j : X → Y) → cocone g k Z → coherence-square-maps i f g j → cocone f (k ∘ i) Z cocone-comp-horizontal' f i k g j c coh = cocone-comp-horizontal f i k (j , g , coh) c ``` ### Vertical composition of cocones ```text i A -----> X | | f | | ∨ ∨ B -----> Y | | k | | ∨ ∨ C -----> Z ``` ```agda cocone-comp-vertical : { l1 l2 l3 l4 l5 l6 : Level} { A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6} ( f : A → B) (i : A → X) (k : B → C) ( c : cocone f i Y) → cocone k (horizontal-map-cocone f i c) Z → cocone (k ∘ f) i Z pr1 (cocone-comp-vertical f i k c d) = horizontal-map-cocone k (horizontal-map-cocone f i c) d pr1 (pr2 (cocone-comp-vertical f i k c d)) = vertical-map-cocone k (horizontal-map-cocone f i c) d ∘ vertical-map-cocone f i c pr2 (pr2 (cocone-comp-vertical f i k c d)) = pasting-vertical-coherence-square-maps ( i) ( f) ( vertical-map-cocone f i c) ( horizontal-map-cocone f i c) ( k) ( vertical-map-cocone k (horizontal-map-cocone f i c) d) ( horizontal-map-cocone k (horizontal-map-cocone f i c) d) ( coherence-square-cocone f i c) ( coherence-square-cocone k (horizontal-map-cocone f i c) d) ``` A variation on the above: ```text i A -----> X | | f | | g ∨ j ∨ B -----> Y | | k | | ∨ ∨ C -----> Z ``` ```agda cocone-comp-vertical' : { l1 l2 l3 l4 l5 l6 : Level} { A : UU l1} {B : UU l2} {C : UU l3} {X : UU l4} {Y : UU l5} {Z : UU l6} ( f : A → B) (i : A → X) (g : X → Y) (j : B → Y) (k : B → C) → cocone k j Z → coherence-square-maps i f g j → cocone (k ∘ f) i Z cocone-comp-vertical' f i g j k c coh = cocone-comp-vertical f i k (j , g , coh) c ``` Given a commutative diagram like this, ```text g' S' ---> B' / \ \ f' / \ k \ j / ∨ g ∨ A' S ----> B \ | | i \ | f | \ ∨ ∨ > A ----> X ``` we can compose both vertically and horizontally to get the following cocone: ```text S' ---> B' | | | | ∨ ∨ A' ---> X ``` Notice that the triple `(i,j,k)` is really a morphism of spans. So the resulting cocone arises as a composition of the original cocone with this morphism of spans. ```agda comp-cocone-hom-span : { l1 l2 l3 l4 l5 l6 l7 : Level} { S : UU l1} {A : UU l2} {B : UU l3} {X : UU l4} { S' : UU l5} {A' : UU l6} {B' : UU l7} ( f : S → A) (g : S → B) (f' : S' → A') (g' : S' → B') ( i : A' → A) (j : B' → B) (k : S' → S) → cocone f g X → coherence-square-maps k f' f i → coherence-square-maps g' k j g → cocone f' g' X comp-cocone-hom-span f g f' g' i j k c coh-l coh-r = cocone-comp-vertical ( id) ( g') ( f') ( (g ∘ k , j , coh-r)) ( cocone-comp-horizontal f' k g (i , f , coh-l) c) ``` ### The diagonal cocone on a span of identical maps ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f : A → B) (X : UU l3) where diagonal-into-cocone : (B → X) → cocone f f X pr1 (diagonal-into-cocone g) = g pr1 (pr2 (diagonal-into-cocone g)) = g pr2 (pr2 (diagonal-into-cocone g)) = refl-htpy ``` ### Cocones obtained from morphisms of arrows ```agda module _ {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4} (f : A → B) (g : X → Y) (h : hom-arrow f g) where cocone-hom-arrow : cocone f (map-domain-hom-arrow f g h) Y pr1 cocone-hom-arrow = map-codomain-hom-arrow f g h pr1 (pr2 cocone-hom-arrow) = g pr2 (pr2 cocone-hom-arrow) = coh-hom-arrow f g h ``` ### The swapping function on cocones over spans ```agda module _ {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) (X : UU l4) where swap-cocone : cocone f g X → cocone g f X pr1 (swap-cocone c) = vertical-map-cocone f g c pr1 (pr2 (swap-cocone c)) = horizontal-map-cocone f g c pr2 (pr2 (swap-cocone c)) = inv-htpy (coherence-square-cocone f g c) module _ {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) (X : UU l4) where is-involution-swap-cocone : swap-cocone g f X ∘ swap-cocone f g X ~ id is-involution-swap-cocone c = eq-htpy-cocone f g ( swap-cocone g f X (swap-cocone f g X c)) ( c) ( ( refl-htpy) , ( refl-htpy) , ( λ s → concat ( right-unit) ( coherence-square-cocone f g c s) ( inv-inv (coherence-square-cocone f g c s)))) module _ {l1 l2 l3 l4 : Level} {S : UU l1} {A : UU l2} {B : UU l3} (f : S → A) (g : S → B) (X : UU l4) where is-equiv-swap-cocone : is-equiv (swap-cocone f g X) is-equiv-swap-cocone = is-equiv-is-invertible ( swap-cocone g f X) ( is-involution-swap-cocone g f X) ( is-involution-swap-cocone f g X) equiv-swap-cocone : cocone f g X ≃ cocone g f X pr1 equiv-swap-cocone = swap-cocone f g X pr2 equiv-swap-cocone = is-equiv-swap-cocone ```