------------------------------------------------------------------------ -- The Agda standard library -- -- Operations on and properties of decidable relations ------------------------------------------------------------------------ {-# OPTIONS --cubical-compatible --safe #-} module Relation.Nullary.Decidable where open import Level using (Level) open import Data.Bool.Base using (true; false) open import Data.Product.Base using (∃; _,_) open import Function.Bundles using (Injection; module Injection; module Equivalence; _⇔_; _↔_; mk↔ₛ′) open import Relation.Binary.Bundles using (Setoid; module Setoid) open import Relation.Binary.Definitions using (Decidable) open import Relation.Nullary.Irrelevant using (Irrelevant) open import Relation.Nullary.Negation.Core using (¬_; contradiction) open import Relation.Nullary.Reflects using (invert) open import Relation.Binary.PropositionalEquality.Core as ≡ using (_≡_; refl; sym; trans) private variable a b ℓ₁ ℓ₂ : Level A B : Set a ------------------------------------------------------------------------ -- Re-exporting the core definitions open import Relation.Nullary.Decidable.Core public ------------------------------------------------------------------------ -- Maps map : A ⇔ B → Dec A → Dec B map A⇔B = map′ to from where open Equivalence A⇔B -- If there is an injection from one setoid to another, and the -- latter's equivalence relation is decidable, then the former's -- equivalence relation is also decidable. module _ {S : Setoid a ℓ₁} {T : Setoid b ℓ₂} (injection : Injection S T) where open Injection injection via-injection : Decidable Eq₂._≈_ → Decidable Eq₁._≈_ via-injection _≟_ x y = map′ injective cong (to x ≟ to y) ------------------------------------------------------------------------ -- A lemma relating True and Dec True-↔ : (a? : Dec A) → Irrelevant A → True a? ↔ A True-↔ a? irr = mk↔ₛ′ to from to-from (from-to a?) where to = toWitness {a? = a?} from = fromWitness {a? = a?} to-from : ∀ a → to (from a) ≡ a to-from a = irr _ a from-to : ∀ a? (x : True a?) → fromWitness (toWitness x) ≡ x from-to (yes _) _ = refl ------------------------------------------------------------------------ -- Result of decidability isYes≗does : (a? : Dec A) → isYes a? ≡ does a? isYes≗does (true because _) = refl isYes≗does (false because _) = refl dec-true : (a? : Dec A) → A → does a? ≡ true dec-true (true because _ ) a = refl dec-true (false because [¬a]) a = contradiction a (invert [¬a]) dec-false : (a? : Dec A) → ¬ A → does a? ≡ false dec-false (false because _ ) ¬a = refl dec-false (true because [a]) ¬a = contradiction (invert [a]) ¬a dec-yes-recompute : (a? : Dec A) → .(a : A) → a? ≡ yes (recompute a? a) dec-yes-recompute a? a with yes _ ← a? | refl ← dec-true a? (recompute a? a) = refl dec-yes-irr : (a? : Dec A) → Irrelevant A → (a : A) → a? ≡ yes a dec-yes-irr a? irr a = trans (dec-yes-recompute a? a) (≡.cong yes (recompute-irrelevant-id a? irr a)) dec-yes : (a? : Dec A) → A → ∃ λ a → a? ≡ yes a dec-yes a? a = _ , dec-yes-recompute a? a dec-no : (a? : Dec A) (¬a : ¬ A) → a? ≡ no ¬a dec-no a? ¬a with no _ ← a? | refl ← dec-false a? ¬a = refl ⌊⌋-map′ : ∀ t f (a? : Dec A) → ⌊ map′ {B = B} t f a? ⌋ ≡ ⌊ a? ⌋ ⌊⌋-map′ t f a? = trans (isYes≗does (map′ t f a?)) (sym (isYes≗does a?)) does-≡ : (a? b? : Dec A) → does a? ≡ does b? does-≡ a? (yes a) = dec-true a? a does-≡ a? (no ¬a) = dec-false a? ¬a does-⇔ : A ⇔ B → (a? : Dec A) → (b? : Dec B) → does a? ≡ does b? does-⇔ A⇔B a? = does-≡ (map A⇔B a?)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4