{-# OPTIONS --safe #-} module Decidable where open import Cubical.Relation.Nullary using ( Stable ) public open import Cubical.Relation.Nullary.Properties using ( Dec→Stable ; Discrete→isSet ; isPropDec ) public open import Cubical.Relation.Nullary.Base using ( Dec ; yes ; no ; Discrete ) public open import Level open import Data.Bool open import Path open import Inspect open import Data.Unit T? : ∀ d → Dec (T d) T? = bool (no λ x → x) (yes tt) open import HLevels using (isProp; isPropΠ) isProp⇒Discrete : isProp A → Discrete A isProp⇒Discrete p x y = yes (p x y) isPropDiscrete : isProp (Discrete A) isPropDiscrete _≟_ = isPropΠ (λ x → isPropΠ (λ y → isPropDec (Discrete→isSet _≟_ _ _))) _≟_ open import Data.Empty infixr 2 dec dec : (A → B) → (¬ A → B) → Dec A → B dec t f (yes p) = t p dec t f (no ¬p) = f ¬p syntax dec (λ p → t) (λ ¬p → f) d = If d Then p ⇒ t Else ¬p ⇒ f does : Dec A → Bool does d = If d Then _ ⇒ true Else _ ⇒ false from-does : (d : Dec A) → T (does d) → A from-does (yes p) _ = p map-dec : (A → B) → (¬ A → ¬ B) → Dec A → Dec B map-dec t f d = If d Then p ⇒ yes (t p) Else ¬p ⇒ no (f ¬p) open import Function open import Data.Sigma iff-dec : (A ↔ B) → Dec A → Dec B iff-dec (f , f⁻) = map-dec f λ ¬A B → ¬A (f⁻ B) record EqAlg (A : Type a) : Type a where field _≡ᴮ_ : A → A → Bool sound : ∀ x y → T (x ≡ᴮ y) → x ≡ y complete : ∀ x → T (x ≡ᴮ x) from-bool-eq : Discrete A from-bool-eq x y = map-dec (sound x y) (λ x≢ᴮy x≡y → x≢ᴮy (subst (λ z → T (x ≡ᴮ z)) x≡y (complete x))) (T? (x ≡ᴮ y)) open EqAlg using (from-bool-eq) public open import HITs.PropositionalTruncation dec-trunc : Dec A → Dec ∥ A ∥ dec-trunc = map-dec ∣_∣ (∥rec∥ (λ ())) dec-untrunc : Dec A → ∥ A ∥ → A dec-untrunc (yes p) _ = p dec-untrunc (no ¬p) p = absurd (∥rec∥ (λ ()) ¬p p) inj-discrete : (A ↣ B) → Discrete B → Discrete A inj-discrete (f , inj) eq? x y = map-dec inj (λ fx≢fy x≡y → fx≢fy (cong f x≡y) ) (eq? (f x) (f y))