# The booleans ```agda module foundation.booleans where ``` <details><summary>Imports</summary> ```agda open import foundation.dependent-pair-types open import foundation.involutions open import foundation.negated-equality open import foundation.raising-universe-levels open import foundation.unit-type open import foundation.universe-levels open import foundation-core.constant-maps open import foundation-core.coproduct-types open import foundation-core.empty-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.injective-maps open import foundation-core.negation open import foundation-core.propositions open import foundation-core.sections open import foundation-core.sets open import univalent-combinatorics.finite-types open import univalent-combinatorics.standard-finite-types ``` </details> ## Idea The type of **booleans** is a [2-element type](univalent-combinatorics.2-element-types.md) with elements `true false : bool`, which is used for reasoning with [decidable propositions](foundation-core.decidable-propositions.md). ## Definition ### The booleans ```agda data bool : UU lzero where true false : bool {-# BUILTIN BOOL bool #-} {-# BUILTIN TRUE true #-} {-# BUILTIN FALSE false #-} ``` ### The induction principle of the booleans ```agda module _ {l : Level} (P : bool → UU l) where ind-bool : P true → P false → (b : bool) → P b ind-bool pt pf true = pt ind-bool pt pf false = pf ``` ### The `if_then_else` function ```agda module _ {l : Level} {A : UU l} where if_then_else_ : bool → A → A → A if true then x else y = x if false then x else y = y ``` ### Raising universe levels of the booleans ```agda raise-bool : (l : Level) → UU l raise-bool l = raise l bool raise-true : (l : Level) → raise-bool l raise-true l = map-raise true raise-false : (l : Level) → raise-bool l raise-false l = map-raise false compute-raise-bool : (l : Level) → bool ≃ raise-bool l compute-raise-bool l = compute-raise l bool ``` ### The standard propositions associated to the constructors of bool ```agda prop-bool : bool → Prop lzero prop-bool true = unit-Prop prop-bool false = empty-Prop type-prop-bool : bool → UU lzero type-prop-bool = type-Prop ∘ prop-bool ``` ### Equality on the booleans ```agda Eq-bool : bool → bool → UU lzero Eq-bool true true = unit Eq-bool true false = empty Eq-bool false true = empty Eq-bool false false = unit refl-Eq-bool : (x : bool) → Eq-bool x x refl-Eq-bool true = star refl-Eq-bool false = star Eq-eq-bool : {x y : bool} → x = y → Eq-bool x y Eq-eq-bool {x = x} refl = refl-Eq-bool x eq-Eq-bool : {x y : bool} → Eq-bool x y → x = y eq-Eq-bool {true} {true} star = refl eq-Eq-bool {false} {false} star = refl neq-false-true-bool : false ≠ true neq-false-true-bool () neq-true-false-bool : true ≠ false neq-true-false-bool () ``` ## Structure ### The boolean operators ```agda neg-bool : bool → bool neg-bool true = false neg-bool false = true conjunction-bool : bool → bool → bool conjunction-bool true true = true conjunction-bool true false = false conjunction-bool false true = false conjunction-bool false false = false disjunction-bool : bool → bool → bool disjunction-bool true true = true disjunction-bool true false = true disjunction-bool false true = true disjunction-bool false false = false implication-bool : bool → bool → bool implication-bool true true = true implication-bool true false = false implication-bool false true = true implication-bool false false = true ``` ## Properties ### The booleans are a set ```agda abstract is-prop-Eq-bool : (x y : bool) → is-prop (Eq-bool x y) is-prop-Eq-bool true true = is-prop-unit is-prop-Eq-bool true false = is-prop-empty is-prop-Eq-bool false true = is-prop-empty is-prop-Eq-bool false false = is-prop-unit abstract is-set-bool : is-set bool is-set-bool = is-set-prop-in-id ( Eq-bool) ( is-prop-Eq-bool) ( refl-Eq-bool) ( λ x y → eq-Eq-bool) bool-Set : Set lzero pr1 bool-Set = bool pr2 bool-Set = is-set-bool ``` ### The type of booleans is equivalent to `Fin 2` ```agda bool-Fin-two-ℕ : Fin 2 → bool bool-Fin-two-ℕ (inl (inr star)) = true bool-Fin-two-ℕ (inr star) = false Fin-two-ℕ-bool : bool → Fin 2 Fin-two-ℕ-bool true = inl (inr star) Fin-two-ℕ-bool false = inr star abstract is-retraction-Fin-two-ℕ-bool : Fin-two-ℕ-bool ∘ bool-Fin-two-ℕ ~ id is-retraction-Fin-two-ℕ-bool (inl (inr star)) = refl is-retraction-Fin-two-ℕ-bool (inr star) = refl abstract is-section-Fin-two-ℕ-bool : bool-Fin-two-ℕ ∘ Fin-two-ℕ-bool ~ id is-section-Fin-two-ℕ-bool true = refl is-section-Fin-two-ℕ-bool false = refl equiv-bool-Fin-two-ℕ : Fin 2 ≃ bool pr1 equiv-bool-Fin-two-ℕ = bool-Fin-two-ℕ pr2 equiv-bool-Fin-two-ℕ = is-equiv-is-invertible ( Fin-two-ℕ-bool) ( is-section-Fin-two-ℕ-bool) ( is-retraction-Fin-two-ℕ-bool) ``` ### The type of booleans is finite ```agda is-finite-bool : is-finite bool is-finite-bool = is-finite-equiv equiv-bool-Fin-two-ℕ (is-finite-Fin 2) bool-𝔽 : 𝔽 lzero pr1 bool-𝔽 = bool pr2 bool-𝔽 = is-finite-bool ``` ### Boolean negation has no fixed points ```agda neq-neg-bool : (b : bool) → b ≠ neg-bool b neq-neg-bool true () neq-neg-bool false () ``` ### Boolean negation is an involution ```agda is-involution-neg-bool : is-involution neg-bool is-involution-neg-bool true = refl is-involution-neg-bool false = refl ``` ### Boolean negation is an equivalence ```agda abstract is-equiv-neg-bool : is-equiv neg-bool is-equiv-neg-bool = is-equiv-is-involution is-involution-neg-bool equiv-neg-bool : bool ≃ bool pr1 equiv-neg-bool = neg-bool pr2 equiv-neg-bool = is-equiv-neg-bool ``` ### The constant function `const bool b` is not an equivalence ```agda abstract no-section-const-bool : (b : bool) → ¬ (section (const bool b)) no-section-const-bool true (g , G) = neq-true-false-bool (G false) no-section-const-bool false (g , G) = neq-false-true-bool (G true) abstract is-not-equiv-const-bool : (b : bool) → ¬ (is-equiv (const bool b)) is-not-equiv-const-bool b e = no-section-const-bool b (section-is-equiv e) ```