# Empty types ```agda module foundation.empty-types where open import foundation-core.empty-types public ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.embeddings open import foundation.equivalences open import foundation.propositional-truncations open import foundation.raising-universe-levels open import foundation.subuniverses open import foundation.univalence open import foundation.universe-levels open import foundation-core.contractible-types open import foundation-core.equality-dependent-pair-types 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. ## Definitions ### We raise the empty type to an arbitrary universe level ```agda raise-empty : (l : Level) → UU l raise-empty l = raise l empty compute-raise-empty : (l : Level) → empty ≃ raise-empty l compute-raise-empty l = compute-raise l empty raise-ex-falso : (l1 : Level) {l2 : Level} {A : UU l2} → raise-empty l1 → A raise-ex-falso l = ex-falso ∘ map-inv-equiv (compute-raise-empty l) ``` ### The predicate that a subuniverse contains the empty type ```agda contains-empty-subuniverse : {l1 l2 : Level} (P : subuniverse l1 l2) → UU l2 contains-empty-subuniverse {l1} P = is-in-subuniverse P (raise-empty l1) ``` ### The predicate that a subuniverse contains any empty type ```agda contains-empty-types-subuniverse : {l1 l2 : Level} (P : subuniverse l1 l2) → UU (lsuc l1 ⊔ l2) contains-empty-types-subuniverse {l1} P = (X : UU l1) → is-empty X → is-in-subuniverse P X ``` ### The predicate that a subuniverse is closed under the `is-empty` predicate ```agda is-closed-under-is-empty-subuniverses : {l1 l2 l3 : Level} (P : subuniverse l1 l2) (Q : subuniverse l1 l3) → UU (lsuc l1 ⊔ l2 ⊔ l3) is-closed-under-is-empty-subuniverses P Q = (X : type-subuniverse P) → is-in-subuniverse Q (is-empty (inclusion-subuniverse P X)) ``` ## Properties ### The map `ex-falso` is an embedding ```agda raise-ex-falso-emb : (l1 : Level) {l2 : Level} {A : UU l2} → raise-empty l1 ↪ A raise-ex-falso-emb l = comp-emb ex-falso-emb (emb-equiv (inv-equiv (compute-raise-empty l))) ``` ### Being empty is a proposition ```agda is-property-is-empty : {l : Level} {A : UU l} → is-prop (is-empty A) is-property-is-empty = is-prop-function-type is-prop-empty is-empty-Prop : {l1 : Level} → UU l1 → Prop l1 pr1 (is-empty-Prop A) = is-empty A pr2 (is-empty-Prop A) = is-property-is-empty is-nonempty-Prop : {l1 : Level} → UU l1 → Prop l1 pr1 (is-nonempty-Prop A) = is-nonempty A pr2 (is-nonempty-Prop A) = is-property-is-empty ``` ### Being empty is preserved under propositional truncations ```agda abstract is-empty-type-trunc-Prop : {l1 : Level} {X : UU l1} → is-empty X → is-empty (type-trunc-Prop X) is-empty-type-trunc-Prop f = map-universal-property-trunc-Prop empty-Prop f abstract is-empty-type-trunc-Prop' : {l1 : Level} {X : UU l1} → is-empty (type-trunc-Prop X) → is-empty X is-empty-type-trunc-Prop' f = f ∘ unit-trunc-Prop ``` ### Any inhabited type is nonempty ```agda abstract is-nonempty-is-inhabited : {l : Level} {X : UU l} → type-trunc-Prop X → is-nonempty X is-nonempty-is-inhabited {l} {X} = map-universal-property-trunc-Prop (is-nonempty-Prop X) (λ x f → f x) ``` ### Properties for the raised empty type ```agda abstract is-prop-raise-empty : {l1 : Level} → is-prop (raise-empty l1) is-prop-raise-empty {l1} = is-prop-equiv' ( compute-raise l1 empty) ( is-prop-empty) raise-empty-Prop : (l1 : Level) → Prop l1 pr1 (raise-empty-Prop l1) = raise-empty l1 pr2 (raise-empty-Prop l1) = is-prop-raise-empty abstract is-empty-raise-empty : {l1 : Level} → is-empty (raise-empty l1) is-empty-raise-empty {l1} = map-inv-equiv (compute-raise-empty l1) abstract is-set-raise-empty : {l1 : Level} → is-set (raise-empty l1) is-set-raise-empty = is-trunc-succ-is-trunc neg-one-𝕋 is-prop-raise-empty raise-empty-Set : (l1 : Level) → Set l1 pr1 (raise-empty-Set l1) = raise-empty l1 pr2 (raise-empty-Set l1) = is-set-raise-empty ``` ### The type of all empty types of a given universe is contractible ```agda is-contr-type-is-empty : (l : Level) → is-contr (type-subuniverse is-empty-Prop) pr1 (is-contr-type-is-empty l) = raise-empty l , is-empty-raise-empty pr2 (is-contr-type-is-empty l) x = eq-pair-Σ ( eq-equiv ( equiv-is-empty ( is-empty-raise-empty) ( is-in-subuniverse-inclusion-subuniverse is-empty-Prop x))) ( eq-is-prop is-property-is-empty) ```