# Suspensions of types ```agda module synthetic-homotopy-theory.suspensions-of-types where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-dependent-functions open import foundation.action-on-identifications-functions open import foundation.commuting-squares-of-identifications open import foundation.connected-types open import foundation.constant-maps open import foundation.contractible-types open import foundation.dependent-identifications open import foundation.dependent-pair-types open import foundation.diagonal-maps-of-types open import foundation.equivalence-extensionality open import foundation.equivalences open import foundation.function-extensionality open import foundation.function-types open import foundation.functoriality-dependent-function-types open import foundation.functoriality-dependent-pair-types open import foundation.homotopies open import foundation.identity-types open import foundation.path-algebra open import foundation.retractions open import foundation.sections open import foundation.torsorial-type-families open import foundation.transport-along-identifications open import foundation.truncated-types open import foundation.truncation-levels open import foundation.type-arithmetic-dependent-pair-types open import foundation.unit-type open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import synthetic-homotopy-theory.cocones-under-spans open import synthetic-homotopy-theory.dependent-cocones-under-spans open import synthetic-homotopy-theory.dependent-suspension-structures open import synthetic-homotopy-theory.dependent-universal-property-suspensions open import synthetic-homotopy-theory.pushouts open import synthetic-homotopy-theory.suspension-structures open import synthetic-homotopy-theory.universal-property-pushouts open import synthetic-homotopy-theory.universal-property-suspensions ``` </details> ## Idea The **suspension** of a type `X` is the [pushout](synthetic-homotopy-theory.pushouts.md) of the [span](foundation.spans.md) ```text unit <-- X --> unit ``` Suspensions play an important role in synthetic homotopy theory. For example, they star in the freudenthal suspension theorem and give us a definition of [the spheres](synthetic-homotopy-theory.spheres.md). ## Definitions ### The suspension of a type ```agda suspension : {l : Level} → UU l → UU l suspension X = pushout (terminal-map X) (terminal-map X) north-suspension : {l : Level} {X : UU l} → suspension X north-suspension {X = X} = inl-pushout (terminal-map X) (terminal-map X) star south-suspension : {l : Level} {X : UU l} → suspension X south-suspension {X = X} = inr-pushout (terminal-map X) (terminal-map X) star meridian-suspension : {l : Level} {X : UU l} → X → north-suspension {X = X} = south-suspension {X = X} meridian-suspension {X = X} = glue-pushout (terminal-map X) (terminal-map X) suspension-structure-suspension : {l : Level} (X : UU l) → suspension-structure X (suspension X) pr1 (suspension-structure-suspension X) = north-suspension pr1 (pr2 (suspension-structure-suspension X)) = south-suspension pr2 (pr2 (suspension-structure-suspension X)) = meridian-suspension cocone-suspension : {l : Level} (X : UU l) → cocone (terminal-map X) (terminal-map X) (suspension X) cocone-suspension X = cocone-pushout (terminal-map X) (terminal-map X) cogap-suspension' : {l1 l2 : Level} {X : UU l1} {Y : UU l2} → cocone (terminal-map X) (terminal-map X) Y → suspension X → Y cogap-suspension' {X = X} = cogap (terminal-map X) (terminal-map X) up-suspension' : {l1 : Level} (X : UU l1) → universal-property-pushout ( terminal-map X) ( terminal-map X) ( cocone-suspension X) up-suspension' X = up-pushout (terminal-map X) (terminal-map X) ``` ### The cogap map of a suspension structure ```agda module _ {l1 l2 : Level} {X : UU l1} {Y : UU l2} (s : suspension-structure X Y) where cogap-suspension : suspension X → Y cogap-suspension = cogap-suspension' (suspension-cocone-suspension-structure s) ``` ### The property of being a suspension The [proposition](foundation-core.propositions.md) `is-suspension` is the assertion that the cogap map is an [equivalence](foundation-core.equivalences.md). Note that this proposition is [small](foundation-core.small-types.md), whereas [the universal property](foundation-core.universal-property-pullbacks.md) is a large proposition. ```agda is-suspension : {l1 l2 : Level} {X : UU l1} {Y : UU l2} → suspension-structure X Y → UU (l1 ⊔ l2) is-suspension s = is-equiv (cogap-suspension s) ``` ## Properties ### The suspension of `X` has the universal property of suspensions ```agda module _ {l1 l2 : Level} {X : UU l1} {Z : UU l2} where is-section-cogap-suspension : is-section ( ev-suspension (suspension-structure-suspension X) Z) ( cogap-suspension) is-section-cogap-suspension = ( suspension-structure-suspension-cocone) ·l ( is-section-cogap (terminal-map X) (terminal-map X)) ·r ( suspension-cocone-suspension-structure) is-retraction-cogap-suspension : is-retraction ( ev-suspension (suspension-structure-suspension X) Z) ( cogap-suspension) is-retraction-cogap-suspension = ( is-retraction-cogap (terminal-map X) (terminal-map X)) up-suspension : {l1 : Level} {X : UU l1} → universal-property-suspension (suspension-structure-suspension X) up-suspension Z = is-equiv-is-invertible ( cogap-suspension) ( is-section-cogap-suspension) ( is-retraction-cogap-suspension) module _ {l1 l2 : Level} {X : UU l1} {Z : UU l2} where equiv-up-suspension : (suspension X → Z) ≃ (suspension-structure X Z) pr1 equiv-up-suspension = ev-suspension (suspension-structure-suspension X) Z pr2 equiv-up-suspension = up-suspension Z compute-north-cogap-suspension : (c : suspension-structure X Z) → ( cogap-suspension c north-suspension) = ( north-suspension-structure c) compute-north-cogap-suspension c = pr1 ( htpy-eq-suspension-structure ( is-section-cogap-suspension c)) compute-south-cogap-suspension : (c : suspension-structure X Z) → ( cogap-suspension c south-suspension) = ( south-suspension-structure c) compute-south-cogap-suspension c = pr1 ( pr2 ( htpy-eq-suspension-structure ( is-section-cogap-suspension c))) compute-meridian-cogap-suspension : (c : suspension-structure X Z) (x : X) → ( ( ap (cogap-suspension c) (meridian-suspension x)) ∙ ( compute-south-cogap-suspension c)) = ( ( compute-north-cogap-suspension c) ∙ ( meridian-suspension-structure c x)) compute-meridian-cogap-suspension c = pr2 ( pr2 ( htpy-eq-suspension-structure ( is-section-cogap-suspension c))) ev-suspension-up-suspension : (c : suspension-structure X Z) → ( ev-suspension ( suspension-structure-suspension X) ( Z) ( cogap-suspension c)) = c ev-suspension-up-suspension c = eq-htpy-suspension-structure ( ( compute-north-cogap-suspension c) , ( compute-south-cogap-suspension c) , ( compute-meridian-cogap-suspension c)) ``` ### The suspension of `X` has the dependent universal property of suspensions ```agda dup-suspension : {l1 : Level} {X : UU l1} → dependent-universal-property-suspension (suspension-structure-suspension X) dup-suspension {X = X} B = is-equiv-htpy-equiv' ( ( equiv-dependent-suspension-structure-suspension-cocone ( suspension-structure-suspension X) ( B)) ∘e ( equiv-dup-pushout (terminal-map X) (terminal-map X) B)) ( triangle-dependent-ev-suspension (suspension-structure-suspension X) B) equiv-dup-suspension : {l1 l2 : Level} {X : UU l1} (B : suspension X → UU l2) → ( (x : suspension X) → B x) ≃ ( dependent-suspension-structure B (suspension-structure-suspension X)) pr1 (equiv-dup-suspension {X = X} B) = dependent-ev-suspension (suspension-structure-suspension X) B pr2 (equiv-dup-suspension B) = dup-suspension B module _ {l1 l2 : Level} {X : UU l1} (B : suspension X → UU l2) where dependent-cogap-suspension : dependent-suspension-structure B (suspension-structure-suspension X) → (x : suspension X) → B x dependent-cogap-suspension = map-inv-is-equiv (dup-suspension B) is-section-dependent-cogap-suspension : ( ( dependent-ev-suspension (suspension-structure-suspension X) B) ∘ ( dependent-cogap-suspension)) ~ id is-section-dependent-cogap-suspension = is-section-map-inv-is-equiv (dup-suspension B) is-retraction-dependent-cogap-suspension : ( ( dependent-cogap-suspension) ∘ ( dependent-ev-suspension (suspension-structure-suspension X) B)) ~ id is-retraction-dependent-cogap-suspension = is-retraction-map-inv-is-equiv (dup-suspension B) dup-suspension-north-suspension : (d : dependent-suspension-structure ( B) ( suspension-structure-suspension X)) → ( dependent-cogap-suspension d north-suspension) = ( north-dependent-suspension-structure d) dup-suspension-north-suspension d = north-htpy-dependent-suspension-structure ( B) ( htpy-eq-dependent-suspension-structure ( B) ( is-section-dependent-cogap-suspension d)) dup-suspension-south-suspension : (d : dependent-suspension-structure ( B) ( suspension-structure-suspension X)) → ( dependent-cogap-suspension d south-suspension) = ( south-dependent-suspension-structure d) dup-suspension-south-suspension d = south-htpy-dependent-suspension-structure ( B) ( htpy-eq-dependent-suspension-structure ( B) ( is-section-dependent-cogap-suspension d)) dup-suspension-meridian-suspension : (d : dependent-suspension-structure ( B) ( suspension-structure-suspension X)) (x : X) → coherence-square-identifications ( ap ( tr B (meridian-suspension x)) ( dup-suspension-north-suspension d)) ( apd ( dependent-cogap-suspension d) ( meridian-suspension x)) ( meridian-dependent-suspension-structure d x) ( dup-suspension-south-suspension d) dup-suspension-meridian-suspension d = meridian-htpy-dependent-suspension-structure ( B) ( htpy-eq-dependent-suspension-structure ( B) ( is-section-dependent-cogap-suspension d)) ``` ### Characterization of homotopies between functions with domain a suspension ```agda module _ {l1 l2 : Level} (X : UU l1) {Y : UU l2} (f g : suspension X → Y) where htpy-function-out-of-suspension : UU (l1 ⊔ l2) htpy-function-out-of-suspension = htpy-suspension-structure ( ev-suspension (suspension-structure-suspension X) Y f) ( ev-suspension (suspension-structure-suspension X) Y g) north-htpy-function-out-of-suspension : htpy-function-out-of-suspension → f north-suspension = g north-suspension north-htpy-function-out-of-suspension = pr1 south-htpy-function-out-of-suspension : htpy-function-out-of-suspension → f south-suspension = g south-suspension south-htpy-function-out-of-suspension = pr1 ∘ pr2 meridian-htpy-function-out-of-suspension : (h : htpy-function-out-of-suspension) → (x : X) → coherence-square-identifications ( north-htpy-function-out-of-suspension h) ( ap f (meridian-suspension x)) ( ap g (meridian-suspension x)) ( south-htpy-function-out-of-suspension h) meridian-htpy-function-out-of-suspension = pr2 ∘ pr2 equiv-htpy-function-out-of-suspension-dependent-suspension-structure : ( dependent-suspension-structure ( eq-value f g) ( suspension-structure-suspension X)) ≃ ( htpy-function-out-of-suspension) equiv-htpy-function-out-of-suspension-dependent-suspension-structure = ( equiv-tot ( λ p → equiv-tot ( λ q → equiv-Π-equiv-family ( λ x → inv-equiv ( compute-dependent-identification-eq-value-function ( f) ( g) ( meridian-suspension-structure ( suspension-structure-suspension X) ( x)) ( p) ( q)))))) equiv-dependent-suspension-structure-htpy-function-out-of-suspension : ( htpy-function-out-of-suspension) ≃ ( dependent-suspension-structure ( eq-value f g) ( suspension-structure-suspension X)) equiv-dependent-suspension-structure-htpy-function-out-of-suspension = ( equiv-tot ( λ p → equiv-tot ( λ q → equiv-Π-equiv-family ( λ x → ( compute-dependent-identification-eq-value-function ( f) ( g) ( meridian-suspension-structure ( suspension-structure-suspension X) ( x)) ( p) ( q)))))) compute-inv-equiv-htpy-function-out-of-suspension-dependent-suspension-structure : htpy-equiv ( inv-equiv ( equiv-htpy-function-out-of-suspension-dependent-suspension-structure)) ( equiv-dependent-suspension-structure-htpy-function-out-of-suspension) compute-inv-equiv-htpy-function-out-of-suspension-dependent-suspension-structure = ( compute-inv-equiv-tot ( λ p → equiv-tot ( λ q → equiv-Π-equiv-family ( λ x → inv-equiv ( compute-dependent-identification-eq-value-function ( f) ( g) ( meridian-suspension-structure ( suspension-structure-suspension X) ( x)) ( p) ( q)))))) ∙h ( tot-htpy ( λ p → ( compute-inv-equiv-tot ( λ q → equiv-Π-equiv-family ( λ x → inv-equiv ( compute-dependent-identification-eq-value-function ( f) ( g) ( meridian-suspension-structure ( suspension-structure-suspension X) ( x)) ( p) ( q))))) ∙h ( tot-htpy ( λ q → compute-inv-equiv-Π-equiv-family ( λ x → inv-equiv ( compute-dependent-identification-eq-value-function ( f) ( g) ( meridian-suspension-structure ( suspension-structure-suspension X) ( x)) ( p) ( q))))))) equiv-htpy-function-out-of-suspension-htpy : (f ~ g) ≃ htpy-function-out-of-suspension equiv-htpy-function-out-of-suspension-htpy = ( equiv-htpy-function-out-of-suspension-dependent-suspension-structure) ∘e ( equiv-dup-suspension (eq-value f g)) htpy-function-out-of-suspension-htpy : (f ~ g) → htpy-function-out-of-suspension htpy-function-out-of-suspension-htpy = map-equiv (equiv-htpy-function-out-of-suspension-htpy) equiv-htpy-htpy-function-out-of-suspension : htpy-function-out-of-suspension ≃ (f ~ g) equiv-htpy-htpy-function-out-of-suspension = ( inv-equiv (equiv-dup-suspension (eq-value f g))) ∘e ( equiv-dependent-suspension-structure-htpy-function-out-of-suspension) htpy-htpy-function-out-of-suspension : htpy-function-out-of-suspension → (f ~ g) htpy-htpy-function-out-of-suspension = map-equiv equiv-htpy-htpy-function-out-of-suspension compute-inv-equiv-htpy-function-out-of-suspension-htpy : htpy-equiv ( inv-equiv equiv-htpy-function-out-of-suspension-htpy) ( equiv-htpy-htpy-function-out-of-suspension) compute-inv-equiv-htpy-function-out-of-suspension-htpy c = ( htpy-eq-equiv ( distributive-inv-comp-equiv ( equiv-dup-suspension (eq-value f g)) ( equiv-htpy-function-out-of-suspension-dependent-suspension-structure)) ( c)) ∙ ( ap ( map-inv-equiv (equiv-dup-suspension (eq-value-function f g))) ( compute-inv-equiv-htpy-function-out-of-suspension-dependent-suspension-structure ( c))) is-section-htpy-htpy-function-out-of-suspension : ( ( htpy-function-out-of-suspension-htpy) ∘ ( htpy-htpy-function-out-of-suspension)) ~ ( id) is-section-htpy-htpy-function-out-of-suspension c = ( ap ( htpy-function-out-of-suspension-htpy) ( inv (compute-inv-equiv-htpy-function-out-of-suspension-htpy c))) ∙ ( is-section-map-inv-equiv (equiv-htpy-function-out-of-suspension-htpy) c) equiv-htpy-function-out-of-suspension-htpy-north-suspension : (c : htpy-function-out-of-suspension) → ( htpy-htpy-function-out-of-suspension c north-suspension) = ( north-htpy-function-out-of-suspension c) equiv-htpy-function-out-of-suspension-htpy-north-suspension c = north-htpy-in-htpy-suspension-structure ( htpy-eq-htpy-suspension-structure ( is-section-htpy-htpy-function-out-of-suspension c)) equiv-htpy-function-out-of-suspension-htpy-south-suspension : (c : htpy-function-out-of-suspension) → ( htpy-htpy-function-out-of-suspension c south-suspension) = ( south-htpy-function-out-of-suspension c) equiv-htpy-function-out-of-suspension-htpy-south-suspension c = south-htpy-in-htpy-suspension-structure ( htpy-eq-htpy-suspension-structure ( is-section-htpy-htpy-function-out-of-suspension c)) ``` ### The suspension of a contractible type is contractible ```agda is-contr-suspension-is-contr : {l : Level} {X : UU l} → is-contr X → is-contr (suspension X) is-contr-suspension-is-contr {l} {X} is-contr-X = is-contr-is-equiv' ( unit) ( pr1 (pr2 (cocone-suspension X))) ( is-equiv-universal-property-pushout ( terminal-map X) ( terminal-map X) ( cocone-suspension X) ( is-equiv-is-contr (terminal-map X) is-contr-X is-contr-unit) ( up-suspension' X)) ( is-contr-unit) ``` ### Suspensions increase connectedness More precisely, the suspension of a `k`-connected type is `(k+1)`-connected. For the proof we use that a type `A` is `n`-connected if and only if the constant map `B → (A → B)` is an equivalence for all `n`-types `B`. So for any `(k+1)`-type `Y`, we have the commutative diagram ```text Δ Y ----------------------> (suspension X → Y) ∧ | pr1 | ≃ ≃ | ev-suspension | ≃ ∨ Σ (y y' : Y) , y = y' <----- suspension-structure Y ≐ Σ (y y' : Y) , X → y = y' ``` where the bottom map is induced by the equivalence `(y = y') → (X → (y = y'))` given by the fact that `X` is `k`-connected and `y = y'` is a `k`-type. Since the left, bottom and right maps are equivalences, so is the top map, as desired. ```agda module _ {l : Level} {k : 𝕋} {X : UU l} where is-equiv-north-suspension-ev-suspension-is-connected-Truncated-Type : is-connected k X → {l' : Level} (Y : Truncated-Type l' (succ-𝕋 k)) → is-equiv ( ( north-suspension-structure) ∘ ( ev-suspension ( suspension-structure-suspension X) ( type-Truncated-Type Y))) is-equiv-north-suspension-ev-suspension-is-connected-Truncated-Type c Y = is-equiv-comp ( north-suspension-structure) ( ev-suspension ( suspension-structure-suspension X) ( type-Truncated-Type Y)) ( is-equiv-ev-suspension ( suspension-structure-suspension X) ( up-suspension' X) ( type-Truncated-Type Y)) ( is-equiv-pr1-is-contr ( λ y → is-torsorial-fiber-Id ( λ y' → ( diagonal-exponential (y = y') X , is-equiv-diagonal-exponential-is-connected ( Id-Truncated-Type Y y y') ( c))))) is-connected-succ-suspension-is-connected : is-connected k X → is-connected (succ-𝕋 k) (suspension X) is-connected-succ-suspension-is-connected c = is-connected-is-equiv-diagonal-exponential ( λ Y → is-equiv-right-factor ( ( north-suspension-structure) ∘ ( ev-suspension ( suspension-structure-suspension X) ( type-Truncated-Type Y))) ( diagonal-exponential (type-Truncated-Type Y) (suspension X)) ( is-equiv-north-suspension-ev-suspension-is-connected-Truncated-Type ( c) ( Y)) ( is-equiv-id)) ```