# Decidable propositions ```agda module foundation.decidable-propositions where open import foundation-core.decidable-propositions public ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.booleans open import foundation.decidable-types open import foundation.dependent-pair-types open import foundation.embeddings open import foundation.empty-types open import foundation.equivalences open import foundation.logical-equivalences open import foundation.negation open import foundation.propositional-extensionality open import foundation.raising-universe-levels open import foundation.type-arithmetic-coproduct-types open import foundation.type-arithmetic-dependent-pair-types open import foundation.unit-type open import foundation.universe-levels open import foundation-core.contractible-types open import foundation-core.coproduct-types open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.propositions open import foundation-core.sets open import foundation-core.small-types open import foundation-core.subtypes open import foundation-core.transport-along-identifications open import univalent-combinatorics.counting open import univalent-combinatorics.finite-types ``` </details> ## Idea A decidable proposition is a proposition that has a decidable underlying type. ## Properties ### The forgetful map from decidable propositions to propositions is an embedding ```agda is-emb-prop-Decidable-Prop : {l : Level} → is-emb (prop-Decidable-Prop {l}) is-emb-prop-Decidable-Prop = is-emb-tot ( λ X → is-emb-inclusion-subtype ( λ H → pair (is-decidable X) (is-prop-is-decidable H))) emb-prop-Decidable-Prop : {l : Level} → Decidable-Prop l ↪ Prop l pr1 emb-prop-Decidable-Prop = prop-Decidable-Prop pr2 emb-prop-Decidable-Prop = is-emb-prop-Decidable-Prop ``` ### The type of decidable propositions in universe level `l` is equivalent to the type of booleans ```agda module _ {l : Level} where split-Decidable-Prop : Decidable-Prop l ≃ ((Σ (Prop l) type-Prop) + (Σ (Prop l) (λ Q → ¬ (type-Prop Q)))) split-Decidable-Prop = ( left-distributive-Σ-coprod (Prop l) (λ Q → pr1 Q) (λ Q → ¬ (pr1 Q))) ∘e ( inv-associative-Σ (UU l) is-prop (λ X → is-decidable (pr1 X))) map-equiv-bool-Decidable-Prop' : (Σ (Prop l) type-Prop) + (Σ (Prop l) (λ Q → ¬ (type-Prop Q))) → bool map-equiv-bool-Decidable-Prop' (inl x) = true map-equiv-bool-Decidable-Prop' (inr x) = false map-inv-equiv-bool-Decidable-Prop' : bool → (Σ (Prop l) type-Prop) + (Σ (Prop l) (λ Q → ¬ (type-Prop Q))) map-inv-equiv-bool-Decidable-Prop' true = inl (pair (raise-unit-Prop l) raise-star) map-inv-equiv-bool-Decidable-Prop' false = inr (pair (raise-empty-Prop l) is-empty-raise-empty) is-section-map-inv-equiv-bool-Decidable-Prop' : (map-equiv-bool-Decidable-Prop' ∘ map-inv-equiv-bool-Decidable-Prop') ~ id is-section-map-inv-equiv-bool-Decidable-Prop' true = refl is-section-map-inv-equiv-bool-Decidable-Prop' false = refl is-retraction-map-inv-equiv-bool-Decidable-Prop' : (map-inv-equiv-bool-Decidable-Prop' ∘ map-equiv-bool-Decidable-Prop') ~ id is-retraction-map-inv-equiv-bool-Decidable-Prop' (inl x) = ap inl (eq-is-contr is-torsorial-true-Prop) is-retraction-map-inv-equiv-bool-Decidable-Prop' (inr x) = ap inr (eq-is-contr is-torsorial-false-Prop) is-equiv-map-equiv-bool-Decidable-Prop' : is-equiv map-equiv-bool-Decidable-Prop' is-equiv-map-equiv-bool-Decidable-Prop' = is-equiv-is-invertible map-inv-equiv-bool-Decidable-Prop' is-section-map-inv-equiv-bool-Decidable-Prop' is-retraction-map-inv-equiv-bool-Decidable-Prop' equiv-bool-Decidable-Prop' : ((Σ (Prop l) type-Prop) + (Σ (Prop l) (λ Q → ¬ (type-Prop Q)))) ≃ bool pr1 equiv-bool-Decidable-Prop' = map-equiv-bool-Decidable-Prop' pr2 equiv-bool-Decidable-Prop' = is-equiv-map-equiv-bool-Decidable-Prop' equiv-bool-Decidable-Prop : Decidable-Prop l ≃ bool equiv-bool-Decidable-Prop = equiv-bool-Decidable-Prop' ∘e split-Decidable-Prop abstract compute-equiv-bool-Decidable-Prop : (P : Decidable-Prop l) → type-Decidable-Prop P ≃ (map-equiv equiv-bool-Decidable-Prop P = true) compute-equiv-bool-Decidable-Prop (pair P (pair H (inl p))) = equiv-is-contr ( is-proof-irrelevant-is-prop H p) ( is-proof-irrelevant-is-prop (is-set-bool true true) refl) compute-equiv-bool-Decidable-Prop (pair P (pair H (inr np))) = equiv-is-empty np neq-false-true-bool ``` ### Types of decidable propositions of any universe level are equivalent ```agda equiv-universes-Decidable-Prop : (l l' : Level) → Decidable-Prop l ≃ Decidable-Prop l' equiv-universes-Decidable-Prop l l' = inv-equiv equiv-bool-Decidable-Prop ∘e equiv-bool-Decidable-Prop iff-universes-Decidable-Prop : (l l' : Level) (P : Decidable-Prop l) → ( prop-Decidable-Prop P ⇔ prop-Decidable-Prop (map-equiv (equiv-universes-Decidable-Prop l l') P)) pr1 (iff-universes-Decidable-Prop l l' P) p = map-inv-equiv ( compute-equiv-bool-Decidable-Prop ( map-equiv (equiv-universes-Decidable-Prop l l') P)) ( tr ( λ e → map-equiv e (map-equiv equiv-bool-Decidable-Prop P) = true) ( inv (right-inverse-law-equiv equiv-bool-Decidable-Prop)) ( map-equiv (compute-equiv-bool-Decidable-Prop P) p)) pr2 (iff-universes-Decidable-Prop l l' P) p = map-inv-equiv ( compute-equiv-bool-Decidable-Prop P) ( tr ( λ e → map-equiv e (map-equiv equiv-bool-Decidable-Prop P) = true) ( right-inverse-law-equiv equiv-bool-Decidable-Prop) ( map-equiv ( compute-equiv-bool-Decidable-Prop ( map-equiv (equiv-universes-Decidable-Prop l l') P)) ( p))) ``` ### The type of decidable propositions in any universe is a set ```agda is-set-Decidable-Prop : {l : Level} → is-set (Decidable-Prop l) is-set-Decidable-Prop {l} = is-set-equiv bool equiv-bool-Decidable-Prop is-set-bool Decidable-Prop-Set : (l : Level) → Set (lsuc l) pr1 (Decidable-Prop-Set l) = Decidable-Prop l pr2 (Decidable-Prop-Set l) = is-set-Decidable-Prop ``` ### Extensionality of decidable propositions ```agda module _ {l : Level} (P Q : Decidable-Prop l) where extensionality-Decidable-Prop : (P = Q) ≃ (type-Decidable-Prop P ↔ type-Decidable-Prop Q) extensionality-Decidable-Prop = ( propositional-extensionality ( prop-Decidable-Prop P) ( prop-Decidable-Prop Q)) ∘e ( equiv-ap-emb emb-prop-Decidable-Prop) iff-eq-Decidable-Prop : P = Q → type-Decidable-Prop P ↔ type-Decidable-Prop Q iff-eq-Decidable-Prop = map-equiv extensionality-Decidable-Prop eq-iff-Decidable-Prop : (type-Decidable-Prop P → type-Decidable-Prop Q) → (type-Decidable-Prop Q → type-Decidable-Prop P) → P = Q eq-iff-Decidable-Prop f g = map-inv-equiv extensionality-Decidable-Prop (pair f g) ``` ### The type of decidable propositions in any universe is small ```agda abstract is-small-Decidable-Prop : (l1 l2 : Level) → is-small l2 (Decidable-Prop l1) pr1 (is-small-Decidable-Prop l1 l2) = raise l2 bool pr2 (is-small-Decidable-Prop l1 l2) = compute-raise l2 bool ∘e equiv-bool-Decidable-Prop ``` ### Decidable propositions have a count ```agda count-is-decidable-Prop : {l : Level} (P : Prop l) → is-decidable (type-Prop P) → count (type-Prop P) count-is-decidable-Prop P (inl x) = count-is-contr (is-proof-irrelevant-is-prop (is-prop-type-Prop P) x) count-is-decidable-Prop P (inr x) = count-is-empty x ``` ### Decidable propositions are finite ```agda abstract is-finite-is-decidable-Prop : {l : Level} (P : Prop l) → is-decidable (type-Prop P) → is-finite (type-Prop P) is-finite-is-decidable-Prop P x = is-finite-count (count-is-decidable-Prop P x) is-finite-type-Decidable-Prop : {l : Level} (P : Decidable-Prop l) → is-finite (type-Decidable-Prop P) is-finite-type-Decidable-Prop P = is-finite-is-decidable-Prop ( prop-Decidable-Prop P) ( is-decidable-Decidable-Prop P) ``` ### The type of decidable propositions of any universe level is finite ```agda is-finite-Decidable-Prop : {l : Level} → is-finite (Decidable-Prop l) is-finite-Decidable-Prop {l} = is-finite-equiv' equiv-bool-Decidable-Prop is-finite-bool decidable-Prop-𝔽 : (l : Level) → 𝔽 (lsuc l) pr1 (decidable-Prop-𝔽 l) = Decidable-Prop l pr2 (decidable-Prop-𝔽 l) = is-finite-Decidable-Prop ``` ### The negation of a decidable proposition is a decidable proposition ```agda neg-Decidable-Prop : {l : Level} → Decidable-Prop l → Decidable-Prop l pr1 (neg-Decidable-Prop P) = ¬ (type-Decidable-Prop P) pr1 (pr2 (neg-Decidable-Prop P)) = is-prop-neg pr2 (pr2 (neg-Decidable-Prop P)) = is-decidable-neg (is-decidable-Decidable-Prop P) ```