Martin Escardo 2011. \begin{code} {-# OPTIONS --safe --without-K #-} module NotionsOfDecidability.Decidable where open import MLTT.Spartan open import MLTT.Two-Properties open import UF.Equiv open import UF.PropTrunc open import UF.Subsingletons open import UF.SubtypeClassifier open import UF.Logic ¬¬-elim : {A : π€ Μ } β is-decidable A β ¬¬ A β A ¬¬-elim (inl a) f = a ¬¬-elim (inr g) f = π-elim(f g) map-decidable : {A : π€ Μ } {B : π₯ Μ } β (A β B) β (B β A) β is-decidable A β is-decidable B map-decidable f g (inl x) = inl (f x) map-decidable f g (inr h) = inr (Ξ» y β h (g y)) map-decidable-β : {A : π€ Μ } {B : π₯ Μ } β (A β B) β (is-decidable A β is-decidable B) map-decidable-β (f , g) = map-decidable f g , map-decidable g f decidability-is-closed-under-β : {A : π€ Μ } {B : π₯ Μ } β (A β B) β is-decidable A β is-decidable B decidability-is-closed-under-β (f , e) = map-decidable f (inverse f e) map-decidable' : {A : π€ Μ } {B : π₯ Μ } β (A β Β¬ B) β (Β¬ A β B) β is-decidable A β is-decidable B map-decidable' f g (inl x) = inr (f x) map-decidable' f g (inr h) = inl (g h) empty-is-decidable : {X : π€ Μ } β is-empty X β is-decidable X empty-is-decidable = inr π-is-decidable : is-decidable (π {π€}) π-is-decidable = empty-is-decidable π-elim pointed-is-decidable : {X : π€ Μ } β X β is-decidable X pointed-is-decidable = inl π-is-decidable : is-decidable (π {π€}) π-is-decidable = pointed-is-decidable β equivs-are-decidable : {X : π€ Μ } {Y : π₯ Μ } (π : X β Y) β each-fiber-of β π β is-decidable equivs-are-decidable π y = inl (β π ββ»ΒΉ y , inverses-are-sections' π y) id-is-decidable : {X : π€ Μ } β each-fiber-of (id {π€} {X}) is-decidable id-is-decidable x = inl (x , refl) decidable-closed-under-Ξ£ : {X : π€ Μ } {Y : X β π₯ Μ } β is-prop X β is-decidable X β ((x : X) β is-decidable (Y x)) β is-decidable (Ξ£ Y) decidable-closed-under-Ξ£ {π€} {π₯} {X} {Y} isp d e = g d where g : is-decidable X β is-decidable (Ξ£ Y) g (inl x) = h (e x) where Ο : Ξ£ Y β Y x Ο (x' , y) = transport Y (isp x' x) y h : is-decidable(Y x) β is-decidable (Ξ£ Y) h (inl y) = inl (x , y) h (inr v) = inr (contrapositive Ο v) g (inr u) = inr (contrapositive prβ u) Γ-preserves-decidability : {A : π€ Μ } {B : π₯ Μ } β is-decidable A β is-decidable B β is-decidable (A Γ B) Γ-preserves-decidability (inl a) (inl b) = inl (a , b) Γ-preserves-decidability (inl a) (inr v) = inr (Ξ» c β v (prβ c)) Γ-preserves-decidability (inr u) _ = inr (Ξ» c β u (prβ c)) +-preserves-decidability : {A : π€ Μ } {B : π₯ Μ } β is-decidable A β is-decidable B β is-decidable (A + B) +-preserves-decidability (inl a) _ = inl (inl a) +-preserves-decidability (inr u) (inl b) = inl (inr b) +-preserves-decidability (inr u) (inr v) = inr (cases u v) \end{code} The following was added by Ayberk Tosun on 2024-05-28. \begin{code} module _ (pt : propositional-truncations-exist) where open Disjunction pt open PropositionalTruncation pt using (β£_β£; β₯β₯-rec) β¨-preserves-decidability : (P : Ξ© π€) (Q : Ξ© π₯) β is-decidable (P holds) β is-decidable (Q holds) β is-decidable ((P β¨ Q) holds) β¨-preserves-decidability P Q Ο Ο = cases caseβ caseβ (+-preserves-decidability Ο Ο) where caseβ : P holds + Q holds β is-decidable ((P β¨ Q) holds) caseβ (inl p) = inl β£ inl p β£ caseβ (inr q) = inl β£ inr q β£ caseβ : Β¬ (P holds + Q holds) β is-decidable ((P β¨ Q) holds) caseβ = inr β β₯β₯-rec π-is-prop \end{code} End of addition. \begin{code} β-preserves-decidability : {A : π€ Μ } {B : π₯ Μ } β is-decidable A β is-decidable B β is-decidable (A β B) β-preserves-decidability d (inl b) = inl (Ξ» _ β b) β-preserves-decidability (inl a) (inr v) = inr (Ξ» f β v (f a)) β-preserves-decidability (inr u) (inr v) = inl (Ξ» a β π-elim (u a)) β-preserves-decidability' : {A : π€ Μ } {B : π₯ Μ } β (Β¬ B β is-decidable A) β is-decidable B β is-decidable (A β B) β-preserves-decidability' Ο (inl b) = inl (Ξ» _ β b) β-preserves-decidability' {π€} {π₯} {A} {B} Ο (inr v) = Ξ³ (Ο v) where Ξ³ : is-decidable A β is-decidable (A β B) Ξ³ (inl a) = inr (Ξ» f β v (f a)) Ξ³ (inr u) = inl (Ξ» a β π-elim (u a)) β-preserves-decidability'' : {A : π€ Μ } {B : π₯ Μ } β is-decidable A β (A β is-decidable B) β is-decidable (A β B) β-preserves-decidability'' {π€} {π₯} {A} {B} (inl a) Ο = Ξ³ (Ο a) where Ξ³ : is-decidable B β is-decidable (A β B) Ξ³ (inl b) = inl (Ξ» _ β b) Ξ³ (inr v) = inr (Ξ» f β v (f a)) β-preserves-decidability'' (inr u) Ο = inl (Ξ» a β π-elim (u a)) Β¬-preserves-decidability : {A : π€ Μ } β is-decidable A β is-decidable(Β¬ A) Β¬-preserves-decidability d = β-preserves-decidability d π-is-decidable which-of : {A : π€ Μ } {B : π₯ Μ } β A + B β Ξ£ b κ π , (b οΌ β β A) Γ (b οΌ β β B) which-of (inl a) = β , (Ξ» (r : β οΌ β) β a) , (Ξ» (p : β οΌ β) β π-elim (zero-is-not-one p)) which-of (inr b) = β , (Ξ» (p : β οΌ β) β π-elim (zero-is-not-one (p β»ΒΉ))) , (Ξ» (r : β οΌ β) β b) \end{code} The following is a special case we are interested in: \begin{code} boolean-value : {A : π€ Μ } β is-decidable A β Ξ£ b κ π , (b οΌ β β A) Γ (b οΌ β β Β¬ A) boolean-value = which-of module _ {X : π€ Μ } {Aβ : X β π₯ Μ } {Aβ : X β π¦ Μ } (h : (x : X) β Aβ x + Aβ x) where indicator : Ξ£ p κ (X β π) , ((x : X) β (p x οΌ β β Aβ x) Γ (p x οΌ β β Aβ x)) indicator = (Ξ» x β prβ(lemmaβ x)) , (Ξ» x β prβ(lemmaβ x)) where lemmaβ : (x : X) β (Aβ x + Aβ x) β Ξ£ b κ π , (b οΌ β β Aβ x) Γ (b οΌ β β Aβ x) lemmaβ x = which-of lemmaβ : (x : X) β Ξ£ b κ π , (b οΌ β β Aβ x) Γ (b οΌ β β Aβ x) lemmaβ x = lemmaβ x (h x) indicator-map : X β π indicator-map = prβ indicator indicator-property : (x : X) β (indicator-map x οΌ β β Aβ x) Γ (indicator-map x οΌ β β Aβ x) indicator-property = prβ indicator indicator-propertyβ : (x : X) β indicator-map x οΌ β β Aβ x indicator-propertyβ x = prβ (indicator-property x) indicator-propertyβ : (x : X) β indicator-map x οΌ β β Aβ x indicator-propertyβ x = prβ (indicator-property x) module _ {X : π€ Μ } (A : X β π₯ Μ ) (Ξ΄ : (x : X) β A x + Β¬ A x) where private f : (x : X) β is-decidable (A x) β π f x (inl a) = β f x (inr Ξ½) = β fβ : (x : X) (d : is-decidable (A x)) β f x d οΌ β β A x fβ x (inl a) e = a fβ x (inr Ξ½) e = π-elim (one-is-not-zero e) fβ : (x : X) (d : is-decidable (A x)) β f x d οΌ β β Β¬ A x fβ x (inl a) e = π-elim (zero-is-not-one e) fβ x (inr Ξ½) e = Ξ½ fβ-back : (x : X) (d : is-decidable (A x)) β A x β f x d οΌ β fβ-back x (inl a) a' = refl fβ-back x (inr Ξ½) a' = π-elim (Ξ½ a') fβ-back : (x : X) (d : is-decidable (A x)) β Β¬ A x β f x d οΌ β fβ-back x (inl a) Ξ½' = π-elim (Ξ½' a) fβ-back x (inr Ξ½) Ξ½' = refl Ο : X β π Ο x = f x (Ξ΄ x) characteristic-map : X β π characteristic-map = Ο characteristic-map-propertyβ : (x : X) β Ο x οΌ β β A x characteristic-map-propertyβ x = fβ x (Ξ΄ x) characteristic-map-propertyβ : (x : X) β Ο x οΌ β β Β¬ A x characteristic-map-propertyβ x = fβ x (Ξ΄ x) characteristic-map-propertyβ-back : (x : X) β A x β Ο x οΌ β characteristic-map-propertyβ-back x = fβ-back x (Ξ΄ x) characteristic-map-propertyβ-back : (x : X) β Β¬ A x β Ο x οΌ β characteristic-map-propertyβ-back x = fβ-back x (Ξ΄ x) \end{code} Added by Tom de Jong, November 2021. \begin{code} decidable-β : {X : π€ Μ } {Y : π₯ Μ } β X β Y β is-decidable X β is-decidable Y decidable-β {π€} {π₯} {X} {Y} (f , g) (inl x) = inl (f x) decidable-β {π€} {π₯} {X} {Y} (f , g) (inr nx) = inr (nx β g) decidable-cong : {X : π€ Μ } {Y : π₯ Μ } β X β Y β is-decidable X β is-decidable Y decidable-cong e = decidable-β (β e β , β e ββ»ΒΉ) \end{code} Added by Tom de Jong in January 2022. \begin{code} all-types-are-¬¬-decidable : (X : π€ Μ ) β ¬¬ (is-decidable X) all-types-are-¬¬-decidable X h = claimβ claimβ where claimβ : Β¬ X claimβ x = h (inl x) claimβ : ¬¬ X claimβ nx = h (inr nx) ¬¬-stable-if-decidable : (X : π€ Μ ) β is-decidable X β ¬¬-stable X ¬¬-stable-if-decidable X (inl x) = Ξ» _ β x ¬¬-stable-if-decidable X (inr nx) = Ξ» h β π-elim (h nx) \end{code} Added by Martin Escardo 17th September 2024. The propositional truncation of a decidable type can be constructed with no assumptions and it has split support. \begin{code} β₯_β₯β¨_β© : (X : π€ Μ) β is-decidable X β π€β Μ β₯ X β₯β¨ inl x β© = π β₯ X β₯β¨ inr Ξ½ β© = π β₯β₯β¨_β©-is-prop : {X : π€ Μ } (Ξ΄ : is-decidable X) β is-prop β₯ X β₯β¨ Ξ΄ β© β₯β₯β¨ inl x β©-is-prop = π-is-prop β₯β₯β¨ inr Ξ½ β©-is-prop = π-is-prop β₯β₯β¨_β©-is-decidable : {X : π€ Μ } (Ξ΄ : is-decidable X) β is-decidable β₯ X β₯β¨ Ξ΄ β© β₯β₯β¨ inl x β©-is-decidable = π-is-decidable β₯β₯β¨ inr Ξ½ β©-is-decidable = π-is-decidable β£_β£β¨_β© : {X : π€ Μ } β X β (Ξ΄ : is-decidable X) β β₯ X β₯β¨ Ξ΄ β© β£ x β£β¨ inl _ β© = β β£ x β£β¨ inr Ξ½ β© = Ξ½ x \end{code} Notice that the induction principle doesn't require the family A to be prop-valued. \begin{code} β₯β₯β¨_β©-induction : {X : π€ Μ } (Ξ΄ : is-decidable X) (A : β₯ X β₯β¨ Ξ΄ β© β π₯ Μ ) β ((x : X) β A β£ x β£β¨ Ξ΄ β©) β (s : β₯ X β₯β¨ Ξ΄ β©) β A s β₯β₯β¨ inl x β©-induction A f β = f x β₯β₯β¨ inr Ξ½ β©-induction A f s = π-elim s \end{code} But the induction equation does. \begin{code} β₯β₯β¨_β©-induction-equation : {X : π€ Μ } (Ξ΄ : is-decidable X) (A : β₯ X β₯β¨ Ξ΄ β© β π₯ Μ ) β ((s : β₯ X β₯β¨ Ξ΄ β©) β is-prop (A s)) β (f : (x : X) β A β£ x β£β¨ Ξ΄ β©) (x : X) β β₯β₯β¨ Ξ΄ β©-induction A f β£ x β£β¨ Ξ΄ β© οΌ f x β₯β₯β¨ inl x β©-induction-equation A A-is-prop f x' = A-is-prop β (f x) (f x') β₯β₯β¨ inr Ξ½ β©-induction-equation A A-is-prop f x = π-elim (Ξ½ x) β₯β₯β¨_β©-rec : {X : π€ Μ } (Ξ΄ : is-decidable X) {A : π₯ Μ } β (X β A) β β₯ X β₯β¨ Ξ΄ β© β A β₯β₯β¨ Ξ΄ β©-rec {A} = β₯β₯β¨ Ξ΄ β©-induction (Ξ» _ β A) β£β£β¨_β©-exit : {X : π€ Μ} (Ξ΄ : is-decidable X) β β₯ X β₯β¨ Ξ΄ β© β X β£β£β¨ Ξ΄ β©-exit = β₯β₯β¨ Ξ΄ β©-rec id β£β£β¨_β©-exit-is-section : {X : π€ Μ} (Ξ΄ : is-decidable X) (s : β₯ X β₯β¨ Ξ΄ β©) β β£ β£β£β¨ Ξ΄ β©-exit s β£β¨ Ξ΄ β© οΌ s β£β£β¨ inl x β©-exit-is-section β = refl β£β£β¨ inr Ξ½ β©-exit-is-section s = π-elim s infix 0 β₯_β₯β¨_β© infix 0 β£_β£β¨_β© module propositional-truncation-of-decidable-type (pt : propositional-truncations-exist) where open propositional-truncations-exist pt public module _ {X : π€ Μ } (Ξ΄ : is-decidable X) where β₯β₯β¨_β©-to-β₯β₯ : β₯ X β₯β¨ Ξ΄ β© β β₯ X β₯ β₯β₯β¨_β©-to-β₯β₯ = β₯β₯β¨ Ξ΄ β©-rec β£_β£ β₯β₯-to-β₯β₯β¨_β© : β₯ X β₯ β β₯ X β₯β¨ Ξ΄ β© β₯β₯-to-β₯β₯β¨_β© = β₯β₯-rec (β₯β₯β¨ Ξ΄ β©-is-prop) β£_β£β¨ Ξ΄ β© decidable-types-have-split-support : β₯ X β₯ β X decidable-types-have-split-support s = β£β£β¨ Ξ΄ β©-exit (β₯β₯-to-β₯β₯β¨_β© s) \end{code}