# Empty types
```agda
module foundation-core.empty-types where
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.universe-levels
open import foundation-core.embeddings
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.propositions
open import foundation-core.sets
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
```
</details>
## Idea
An **empty type** is a type with no elements. The (standard) empty type is
introduced as an inductive type with no constructors. With the standard empty
type available, we will say that a type is empty if it maps into the standard
empty type.
## Definition
### Empty types
```agda
data empty : UU lzero where
ind-empty : {l : Level} {P : empty → UU l} → ((x : empty) → P x)
ind-empty ()
ex-falso : {l : Level} {A : UU l} → empty → A
ex-falso = ind-empty
is-empty : {l : Level} → UU l → UU l
is-empty A = A → empty
is-nonempty : {l : Level} → UU l → UU l
is-nonempty A = is-empty (is-empty A)
```
## Properties
### The map `ex-falso` is an embedding
```agda
module _
{l : Level} {A : UU l}
where
abstract
is-emb-ex-falso : is-emb (ex-falso {A = A})
is-emb-ex-falso ()
ex-falso-emb : empty ↪ A
pr1 ex-falso-emb = ex-falso
pr2 ex-falso-emb = is-emb-ex-falso
```
### Any map into an empty type is an equivalence
```agda
abstract
is-equiv-is-empty :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) →
is-empty B → is-equiv f
is-equiv-is-empty f H =
is-equiv-is-invertible
( ex-falso ∘ H)
( λ y → ex-falso (H y))
( λ x → ex-falso (H (f x)))
abstract
is-equiv-is-empty' :
{l : Level} {A : UU l} (f : is-empty A) → is-equiv f
is-equiv-is-empty' f = is-equiv-is-empty f id
equiv-is-empty :
{l1 l2 : Level} {A : UU l1} {B : UU l2} → is-empty A → is-empty B → A ≃ B
equiv-is-empty f g =
( inv-equiv (pair g (is-equiv-is-empty g id))) ∘e
( pair f (is-equiv-is-empty f id))
```
### The empty type is a proposition
```agda
abstract
is-prop-empty : is-prop empty
is-prop-empty ()
empty-Prop : Prop lzero
pr1 empty-Prop = empty
pr2 empty-Prop = is-prop-empty
is-prop-is-empty : {l : Level} {A : UU l} → is-empty A → is-prop A
is-prop-is-empty is-empty-A = ex-falso ∘ is-empty-A
```
### The empty type is a set
```agda
is-set-empty : is-set empty
is-set-empty ()
empty-Set : Set lzero
pr1 empty-Set = empty
pr2 empty-Set = is-set-empty
```
### The empty type is `k`-truncated for any `k ≥ 1`
```agda
abstract
is-trunc-empty : (k : 𝕋) → is-trunc (succ-𝕋 k) empty
is-trunc-empty k ()
empty-Truncated-Type : (k : 𝕋) → Truncated-Type lzero (succ-𝕋 k)
pr1 (empty-Truncated-Type k) = empty
pr2 (empty-Truncated-Type k) = is-trunc-empty k
abstract
is-trunc-is-empty :
{l : Level} (k : 𝕋) {A : UU l} → is-empty A → is-trunc (succ-𝕋 k) A
is-trunc-is-empty k f x = ex-falso (f x)
```