# Morphisms of descent data for pushouts ```agda module synthetic-homotopy-theory.morphisms-descent-data-pushouts where ``` <details><summary>Imports</summary> ```agda open import foundation.commuting-squares-of-homotopies open import foundation.commuting-squares-of-maps open import foundation.dependent-pair-types open import foundation.equality-dependent-function-types open import foundation.equivalences open import foundation.function-types open import foundation.fundamental-theorem-of-identity-types open import foundation.homotopies open import foundation.homotopy-induction open import foundation.identity-types open import foundation.span-diagrams open import foundation.structure-identity-principle open import foundation.torsorial-type-families open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import synthetic-homotopy-theory.descent-data-pushouts ``` </details> ## Idea Given [descent data](synthetic-homotopy-theory.descent-data-pushouts.md) for [pushouts](synthetic-homotopy-theory.pushouts.md) `(PA, PB, PS)` and `(QA, QB, QS)`, a {{#concept "morphism" Disambiguation="descent data for pushouts" Agda=hom-descent-data-pushout}} between them is a pair of fiberwise maps ```text hA : (a : A) → PA a → QA a hB : (b : B) → PB b → QB b ``` equipped with a family of [homotopies](foundation-core.homotopies.md) making ```text hA(fs) PA(fs) --------> QA(fs) | | PS s | | QS s | | ∨ ∨ PB(gs) --------> QB(gs) hB(gs) ``` [commute](foundation-core.commuting-squares-of-maps.md) for every `s : S`. For any two morphisms `(hA, hB, hS)` and `(kA, kB, kS)`, we can define the type of {{#concept "homotopies" Disambiguation="morphisms of descent data for pushouts" Agda=htpy-hom-descent-data-pushout}} between them as the type of triples `(HA, HB, HS)`, where `HA` and `HB` are fiberwise homotopies ```text HA : (a : A) → hA a ~ kA a HB : (b : B) → hB b ~ kB b, ``` and `HS` is a coherence datum showing that for all `s : S`, the square of homotopies ```text HB(gs) ·r PS s hB(gs) ∘ PS s ---------------> kB(gs) ∘ PS s | | hS s | | tS s | | ∨ ∨ QS s ∘ hA(fs) ---------------> QS s ∘ kA(fs) QS s ·l HA(fs) ``` [commutes](foundation-core.commuting-squares-of-homotopies.md). This coherence datum may be seen as a filler of the diagram one gets by gluing the squares `hS` and `tS` along the common vertical maps ```text tA(fs) ________ / ∨ PA(fs) QA(fs) | \________∧ | | hA(fs) | | | PS s | | QS s | tB(gs) | | ________ | ∨ / ∨ ∨ PB(gs) QB(gs). \________∧ hB(gs) ``` The front and back faces are `hS s` and `tS s`, and the top and bottom faces are `HA(fs)` and `HB(gs)`, respectively. `HS` then expresses that going along the front face and then the top face is homotopic to first going along the bottom face and then the back face. We then show that homotopies characterize the [identity types](foundation-core.identity-types.md) of morphisms of descent data. ## Definitions ### Morphisms of descent data for pushouts Note that the descent data arguments cannot be inferred when calling `left-map-hom-descent-data-pushout` and the like, since Agda cannot infer the proofs of `is-equiv` of their gluing maps. ```agda module _ {l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3} (P : descent-data-pushout 𝒮 l4) (Q : descent-data-pushout 𝒮 l5) where hom-descent-data-pushout : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l5) hom-descent-data-pushout = Σ ( (a : domain-span-diagram 𝒮) → left-family-descent-data-pushout P a → left-family-descent-data-pushout Q a) ( λ hA → Σ ( (b : codomain-span-diagram 𝒮) → right-family-descent-data-pushout P b → right-family-descent-data-pushout Q b) ( λ hB → (s : spanning-type-span-diagram 𝒮) → coherence-square-maps ( hA (left-map-span-diagram 𝒮 s)) ( map-family-descent-data-pushout P s) ( map-family-descent-data-pushout Q s) ( hB (right-map-span-diagram 𝒮 s)))) module _ (h : hom-descent-data-pushout) where left-map-hom-descent-data-pushout : (a : domain-span-diagram 𝒮) → left-family-descent-data-pushout P a → left-family-descent-data-pushout Q a left-map-hom-descent-data-pushout = pr1 h right-map-hom-descent-data-pushout : (b : codomain-span-diagram 𝒮) → right-family-descent-data-pushout P b → right-family-descent-data-pushout Q b right-map-hom-descent-data-pushout = pr1 (pr2 h) coherence-hom-descent-data-pushout : (s : spanning-type-span-diagram 𝒮) → coherence-square-maps ( left-map-hom-descent-data-pushout (left-map-span-diagram 𝒮 s)) ( map-family-descent-data-pushout P s) ( map-family-descent-data-pushout Q s) ( right-map-hom-descent-data-pushout (right-map-span-diagram 𝒮 s)) coherence-hom-descent-data-pushout = pr2 (pr2 h) ``` ### The identity morphism of descent data for pushouts ```agda module _ {l1 l2 l3 l4 : Level} {𝒮 : span-diagram l1 l2 l3} (P : descent-data-pushout 𝒮 l4) where id-hom-descent-data-pushout : hom-descent-data-pushout P P pr1 id-hom-descent-data-pushout a = id pr1 (pr2 id-hom-descent-data-pushout) b = id pr2 (pr2 id-hom-descent-data-pushout) s = refl-htpy ``` ### Composition of morphisms of descent data for pushouts ```agda module _ {l1 l2 l3 l4 l5 l6 : Level} {𝒮 : span-diagram l1 l2 l3} (P : descent-data-pushout 𝒮 l4) (Q : descent-data-pushout 𝒮 l5) (R : descent-data-pushout 𝒮 l6) (g : hom-descent-data-pushout Q R) (f : hom-descent-data-pushout P Q) where comp-hom-descent-data-pushout : hom-descent-data-pushout P R pr1 comp-hom-descent-data-pushout a = left-map-hom-descent-data-pushout Q R g a ∘ left-map-hom-descent-data-pushout P Q f a pr1 (pr2 comp-hom-descent-data-pushout) b = right-map-hom-descent-data-pushout Q R g b ∘ right-map-hom-descent-data-pushout P Q f b pr2 (pr2 comp-hom-descent-data-pushout) s = pasting-horizontal-coherence-square-maps ( left-map-hom-descent-data-pushout P Q f ( left-map-span-diagram 𝒮 s)) ( left-map-hom-descent-data-pushout Q R g ( left-map-span-diagram 𝒮 s)) ( map-family-descent-data-pushout P s) ( map-family-descent-data-pushout Q s) ( map-family-descent-data-pushout R s) ( right-map-hom-descent-data-pushout P Q f ( right-map-span-diagram 𝒮 s)) ( right-map-hom-descent-data-pushout Q R g ( right-map-span-diagram 𝒮 s)) ( coherence-hom-descent-data-pushout P Q f s) ( coherence-hom-descent-data-pushout Q R g s) ``` ### Homotopies between morphisms of descent data for pushouts ```agda module _ {l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3} (P : descent-data-pushout 𝒮 l4) (Q : descent-data-pushout 𝒮 l5) (f g : hom-descent-data-pushout P Q) where htpy-hom-descent-data-pushout : UU (l1 ⊔ l2 ⊔ l3 ⊔ l4 ⊔ l5) htpy-hom-descent-data-pushout = Σ ( (a : domain-span-diagram 𝒮) → left-map-hom-descent-data-pushout P Q f a ~ left-map-hom-descent-data-pushout P Q g a) ( λ HA → Σ ( (b : codomain-span-diagram 𝒮) → right-map-hom-descent-data-pushout P Q f b ~ right-map-hom-descent-data-pushout P Q g b) ( λ HB → (s : spanning-type-span-diagram 𝒮) → coherence-square-homotopies ( ( HB (right-map-span-diagram 𝒮 s)) ·r ( map-family-descent-data-pushout P s)) ( coherence-hom-descent-data-pushout P Q f s) ( coherence-hom-descent-data-pushout P Q g s) ( ( map-family-descent-data-pushout Q s) ·l ( HA (left-map-span-diagram 𝒮 s))))) ``` ### The reflexive homotopy between morphisms of descent data for pushouts ```agda module _ {l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3} (P : descent-data-pushout 𝒮 l4) (Q : descent-data-pushout 𝒮 l5) (f : hom-descent-data-pushout P Q) where refl-htpy-hom-descent-data-pushout : htpy-hom-descent-data-pushout P Q f f pr1 refl-htpy-hom-descent-data-pushout a = refl-htpy pr1 (pr2 refl-htpy-hom-descent-data-pushout) b = refl-htpy pr2 (pr2 refl-htpy-hom-descent-data-pushout) s = right-unit-htpy ``` ## Properties ### Characterizing the identity type of morphisms of descent data for pushouts ```agda module _ {l1 l2 l3 l4 l5 : Level} {𝒮 : span-diagram l1 l2 l3} (P : descent-data-pushout 𝒮 l4) (Q : descent-data-pushout 𝒮 l5) (f : hom-descent-data-pushout P Q) where htpy-eq-hom-descent-data-pushout : (g : hom-descent-data-pushout P Q) → (f = g) → htpy-hom-descent-data-pushout P Q f g htpy-eq-hom-descent-data-pushout .f refl = refl-htpy-hom-descent-data-pushout P Q f abstract is-torsorial-htpy-hom-descent-data-pushout : is-torsorial (htpy-hom-descent-data-pushout P Q f) is-torsorial-htpy-hom-descent-data-pushout = is-torsorial-Eq-structure ( is-torsorial-Eq-Π ( λ a → is-torsorial-htpy (left-map-hom-descent-data-pushout P Q f a))) ( left-map-hom-descent-data-pushout P Q f , λ a → refl-htpy) ( is-torsorial-Eq-structure ( is-torsorial-Eq-Π ( λ b → is-torsorial-htpy (right-map-hom-descent-data-pushout P Q f b))) ( right-map-hom-descent-data-pushout P Q f , λ b → refl-htpy) ( is-torsorial-Eq-Π ( λ s → is-torsorial-htpy ( coherence-hom-descent-data-pushout P Q f s ∙h refl-htpy)))) is-equiv-htpy-eq-hom-descent-data-pushout : (g : hom-descent-data-pushout P Q) → is-equiv (htpy-eq-hom-descent-data-pushout g) is-equiv-htpy-eq-hom-descent-data-pushout = fundamental-theorem-id ( is-torsorial-htpy-hom-descent-data-pushout) ( htpy-eq-hom-descent-data-pushout) extensionality-hom-descent-data-pushout : (g : hom-descent-data-pushout P Q) → (f = g) ≃ htpy-hom-descent-data-pushout P Q f g pr1 (extensionality-hom-descent-data-pushout g) = htpy-eq-hom-descent-data-pushout g pr2 (extensionality-hom-descent-data-pushout g) = is-equiv-htpy-eq-hom-descent-data-pushout g eq-htpy-hom-descent-data-pushout : (g : hom-descent-data-pushout P Q) → htpy-hom-descent-data-pushout P Q f g → f = g eq-htpy-hom-descent-data-pushout g = map-inv-equiv (extensionality-hom-descent-data-pushout g) ```