# Universal property of contractible types
```agda
module foundation.universal-property-contractible-types 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.singleton-induction
open import foundation.universe-levels
open import foundation-core.contractible-maps
open import foundation-core.contractible-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.identity-types
```
</details>
## Idea
The
{{#concept "dependent universal property of [contractible types](foundation-core.contractible-types.md)" Agda=dependent-universal-property-contr}}
states that, given a point `a : A`, the evaluating map
```text
ev-point a P : ((x : A) ā P x) ā P a
```
is an [equivalence](foundation-core.equivalences.md) for every type family
`P : A ā š°`.
The condition that `ev-point` has a [section](foundation-core.sections.md)
```text
P a ā ((x : A) ā P x)
```
is another way of phrasing that the type satisfies
[singleton induction](foundation.singleton-induction.md). Furthermore, the
condition that `ev-point` has a [retraction](foundation-core.retractions.md)
asserts that all dependent functions `(x : A) ā P x` are fully determined by
their value at `a`, thus, in particular, that the section of `ev-point` is
unique.
## Definitions
### The dependent universal property of contractible types
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
dependent-universal-property-contr : UUĻ
dependent-universal-property-contr =
{l : Level} (P : A ā UU l) ā is-equiv (ev-point a {P})
```
### The universal property of contractible types
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
universal-property-contr : UUĻ
universal-property-contr = {l : Level} (X : UU l) ā is-equiv (ev-point' a {X})
```
## Properties
### The universal property of contractible types follows from the dependent universal property
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
universal-property-dependent-universal-property-contr :
dependent-universal-property-contr a ā universal-property-contr a
universal-property-dependent-universal-property-contr dup-contr {l} X =
dup-contr (Ī» _ ā X)
```
### Types satisfying the universal property of contractible types are contractible
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
abstract
is-contr-is-equiv-ev-point :
is-equiv (ev-point' a {A}) ā is-contr A
pr1 (is-contr-is-equiv-ev-point H) = a
pr2 (is-contr-is-equiv-ev-point H) =
htpy-eq
( ap
( pr1)
( eq-is-contr'
( is-contr-map-is-equiv H a)
( (Ī» _ ā a) , refl)
( id , refl)))
abstract
is-contr-universal-property-contr :
universal-property-contr a ā is-contr A
is-contr-universal-property-contr up-contr =
is-contr-is-equiv-ev-point (up-contr A)
```
### Types satisfying the dependent universal property of contractible types are contractible
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
abstract
is-contr-dependent-universal-property-contr :
dependent-universal-property-contr a ā is-contr A
is-contr-dependent-universal-property-contr dup-contr =
is-contr-universal-property-contr a
( universal-property-dependent-universal-property-contr a dup-contr)
```
### Types that are contractible satisfy the dependent universal property
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
abstract
dependent-universal-property-contr-is-contr :
is-contr A ā dependent-universal-property-contr a
dependent-universal-property-contr-is-contr H P =
is-equiv-is-invertible
( ind-singleton a H P)
( compute-ind-singleton a H P)
( Ī» f ā
eq-htpy
( ind-singleton a H
( Ī» x ā ind-singleton a H P (f a) x ļ¼ f x)
( compute-ind-singleton a H P (f a))))
equiv-dependent-universal-property-contr :
is-contr A ā {l : Level} (B : A ā UU l) ā ((x : A) ā B x) ā B a
pr1 (equiv-dependent-universal-property-contr H P) = ev-point a
pr2 (equiv-dependent-universal-property-contr H P) =
dependent-universal-property-contr-is-contr H P
apply-dependent-universal-property-contr :
is-contr A ā {l : Level} (B : A ā UU l) ā (B a ā ((x : A) ā B x))
apply-dependent-universal-property-contr H P =
map-inv-equiv (equiv-dependent-universal-property-contr H P)
```
### Types that are contractible satisfy the universal property
```agda
module _
{l1 : Level} {A : UU l1} (a : A)
where
abstract
universal-property-contr-is-contr :
is-contr A ā universal-property-contr a
universal-property-contr-is-contr H =
universal-property-dependent-universal-property-contr a
( dependent-universal-property-contr-is-contr a H)
equiv-universal-property-contr :
is-contr A ā {l : Level} (X : UU l) ā (A ā X) ā X
pr1 (equiv-universal-property-contr H X) = ev-point' a
pr2 (equiv-universal-property-contr H X) =
universal-property-contr-is-contr H X
apply-universal-property-contr :
is-contr A ā {l : Level} (X : UU l) ā X ā (A ā X)
apply-universal-property-contr H X =
map-inv-equiv (equiv-universal-property-contr H X)
```
## See also
- [Singleton induction](foundation.singleton-induction.md)
- [Universal property of contractible types with respect to pointed types and maps](structured-types.pointed-universal-property-contractible-types.md)