# Type arithmetic with the unit type ```agda module foundation.type-arithmetic-unit-type where ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.unit-type open import foundation.universe-levels open import foundation-core.cartesian-product-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.retractions open import foundation-core.sections ``` </details> ## Idea We prove arithmetical laws involving the unit type ## Laws ### Left unit law for dependent pair types ```agda module _ {l : Level} (A : unit → UU l) where map-left-unit-law-Σ : Σ unit A → A star map-left-unit-law-Σ (_ , a) = a map-inv-left-unit-law-Σ : A star → Σ unit A pr1 (map-inv-left-unit-law-Σ a) = star pr2 (map-inv-left-unit-law-Σ a) = a is-section-map-inv-left-unit-law-Σ : ( map-left-unit-law-Σ ∘ map-inv-left-unit-law-Σ) ~ id is-section-map-inv-left-unit-law-Σ = refl-htpy is-retraction-map-inv-left-unit-law-Σ : ( map-inv-left-unit-law-Σ ∘ map-left-unit-law-Σ) ~ id is-retraction-map-inv-left-unit-law-Σ = refl-htpy is-equiv-map-left-unit-law-Σ : is-equiv map-left-unit-law-Σ is-equiv-map-left-unit-law-Σ = is-equiv-is-invertible map-inv-left-unit-law-Σ is-section-map-inv-left-unit-law-Σ is-retraction-map-inv-left-unit-law-Σ left-unit-law-Σ : Σ unit A ≃ A star pr1 left-unit-law-Σ = map-left-unit-law-Σ pr2 left-unit-law-Σ = is-equiv-map-left-unit-law-Σ is-equiv-map-inv-left-unit-law-Σ : is-equiv map-inv-left-unit-law-Σ is-equiv-map-inv-left-unit-law-Σ = is-equiv-is-invertible map-left-unit-law-Σ is-retraction-map-inv-left-unit-law-Σ is-section-map-inv-left-unit-law-Σ inv-left-unit-law-Σ : A star ≃ Σ unit A pr1 inv-left-unit-law-Σ = map-inv-left-unit-law-Σ pr2 inv-left-unit-law-Σ = is-equiv-map-inv-left-unit-law-Σ ``` ### Left unit law for cartesian products ```agda module _ {l : Level} {A : UU l} where map-left-unit-law-product : unit × A → A map-left-unit-law-product = pr2 map-inv-left-unit-law-product : A → unit × A map-inv-left-unit-law-product = map-inv-left-unit-law-Σ (λ _ → A) is-section-map-inv-left-unit-law-product : is-section map-left-unit-law-product map-inv-left-unit-law-product is-section-map-inv-left-unit-law-product = is-section-map-inv-left-unit-law-Σ (λ _ → A) is-retraction-map-inv-left-unit-law-product : is-retraction map-left-unit-law-product map-inv-left-unit-law-product is-retraction-map-inv-left-unit-law-product = refl-htpy is-equiv-map-left-unit-law-product : is-equiv map-left-unit-law-product is-equiv-map-left-unit-law-product = is-equiv-is-invertible map-inv-left-unit-law-product is-section-map-inv-left-unit-law-product is-retraction-map-inv-left-unit-law-product left-unit-law-product : (unit × A) ≃ A pr1 left-unit-law-product = map-left-unit-law-product pr2 left-unit-law-product = is-equiv-map-left-unit-law-product is-equiv-map-inv-left-unit-law-product : is-equiv map-inv-left-unit-law-product is-equiv-map-inv-left-unit-law-product = is-equiv-is-invertible map-left-unit-law-product is-retraction-map-inv-left-unit-law-product is-section-map-inv-left-unit-law-product inv-left-unit-law-product : A ≃ (unit × A) pr1 inv-left-unit-law-product = map-inv-left-unit-law-product pr2 inv-left-unit-law-product = is-equiv-map-inv-left-unit-law-product ``` ### Right unit law for cartesian products ```agda map-right-unit-law-product : A × unit → A map-right-unit-law-product = pr1 map-inv-right-unit-law-product : A → A × unit pr1 (map-inv-right-unit-law-product a) = a pr2 (map-inv-right-unit-law-product a) = star is-section-map-inv-right-unit-law-product : is-section map-right-unit-law-product map-inv-right-unit-law-product is-section-map-inv-right-unit-law-product = refl-htpy is-retraction-map-inv-right-unit-law-product : is-retraction map-right-unit-law-product map-inv-right-unit-law-product is-retraction-map-inv-right-unit-law-product = refl-htpy is-equiv-map-right-unit-law-product : is-equiv map-right-unit-law-product is-equiv-map-right-unit-law-product = is-equiv-is-invertible map-inv-right-unit-law-product is-section-map-inv-right-unit-law-product is-retraction-map-inv-right-unit-law-product right-unit-law-product : (A × unit) ≃ A pr1 right-unit-law-product = map-right-unit-law-product pr2 right-unit-law-product = is-equiv-map-right-unit-law-product ``` ### Left unit law for dependent function types ```agda module _ {l : Level} (A : unit → UU l) where map-left-unit-law-Π : ((t : unit) → A t) → A star map-left-unit-law-Π f = f star map-inv-left-unit-law-Π : A star → ((t : unit) → A t) map-inv-left-unit-law-Π a _ = a is-section-map-inv-left-unit-law-Π : is-section map-left-unit-law-Π map-inv-left-unit-law-Π is-section-map-inv-left-unit-law-Π = refl-htpy is-retraction-map-inv-left-unit-law-Π : is-retraction map-left-unit-law-Π map-inv-left-unit-law-Π is-retraction-map-inv-left-unit-law-Π = refl-htpy is-equiv-map-left-unit-law-Π : is-equiv map-left-unit-law-Π is-equiv-map-left-unit-law-Π = is-equiv-is-invertible map-inv-left-unit-law-Π is-section-map-inv-left-unit-law-Π is-retraction-map-inv-left-unit-law-Π left-unit-law-Π : ((t : unit) → A t) ≃ A star pr1 left-unit-law-Π = map-left-unit-law-Π pr2 left-unit-law-Π = is-equiv-map-left-unit-law-Π is-equiv-map-inv-left-unit-law-Π : is-equiv map-inv-left-unit-law-Π is-equiv-map-inv-left-unit-law-Π = is-equiv-is-invertible map-left-unit-law-Π is-retraction-map-inv-left-unit-law-Π is-section-map-inv-left-unit-law-Π inv-left-unit-law-Π : A star ≃ ((t : unit) → A t) pr1 inv-left-unit-law-Π = map-inv-left-unit-law-Π pr2 inv-left-unit-law-Π = is-equiv-map-inv-left-unit-law-Π ``` ### Left unit law for nondependent function types ```agda module _ {l : Level} (A : UU l) where map-left-unit-law-function-type : (unit → A) → A map-left-unit-law-function-type = map-left-unit-law-Π (λ _ → A) map-inv-left-unit-law-function-type : A → (unit → A) map-inv-left-unit-law-function-type = map-inv-left-unit-law-Π (λ _ → A) is-equiv-map-left-unit-law-function-type : is-equiv map-left-unit-law-function-type is-equiv-map-left-unit-law-function-type = is-equiv-map-left-unit-law-Π (λ _ → A) is-equiv-map-inv-left-unit-law-function-type : is-equiv map-inv-left-unit-law-function-type is-equiv-map-inv-left-unit-law-function-type = is-equiv-map-inv-left-unit-law-Π (λ _ → A) left-unit-law-function-type : (unit → A) ≃ A left-unit-law-function-type = left-unit-law-Π (λ _ → A) inv-left-unit-law-function-type : A ≃ (unit → A) inv-left-unit-law-function-type = inv-left-unit-law-Π (λ _ → A) ``` ## See also - That `unit` is the terminal type is a corollary of `is-contr-Π`, which may be found in [`foundation-core.contractible-types`](foundation-core.contractible-types.md). This can be considered a _right zero law for function types_ (`(A → unit) ≃ unit`).