Guest User

Untitled

a guest
Oct 16th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.23 KB | None | 0 0
  1. module taste-it where
  2. open import Data.Product
  3. open import Data.Sum
  4. open import Data.Nat
  5. open import Data.Nat.Properties
  6. open import Data.Empty
  7. open import Data.Unit using (⊤; tt)
  8. open import Relation.Nullary
  9. open import Relation.Binary.PropositionalEquality
  10.  
  11. min : {A : Set} → (A → Set) → (A → A → Set) → A → Set
  12. min {A} P _≤_ m = (x : A) → P x → m ≤ x
  13.  
  14. StrongWF : (A : Set) → (A → A → Set) → Set₁
  15. StrongWF A _≤_ =
  16. (P : A → Set) →
  17. (a : A) → P a →
  18. Σ[ m ∈ A ] P m × min P _≤_ m
  19.  
  20. min-unique : (P : ℕ → Set)(m n : ℕ) → P m → P n → min P _≤_ m → min P _≤_ n → n ≡ m
  21. min-unique P m n p-m p-n min-m min-n = ≤-antisym (min-n m p-m) (min-m n p-n)
  22.  
  23. -- WTS that if StrongWF ℕ _≤_ then every predicate on ℕ is decidable.
  24. postulate wf-nat : StrongWF ℕ _≤_
  25. data Even : ℕ → Set
  26. data Odd : ℕ → Set
  27.  
  28. data Even where
  29. zero : Even 0
  30. suc-odd : {n : ℕ} → Odd n → Even (suc n)
  31. data Odd where
  32. suc-even : {n : ℕ} → Even n → Odd (suc n)
  33.  
  34. parity : (n : ℕ) → Even n ⊎ Odd n
  35. parity zero = inj₁ zero
  36. parity (suc n) with parity n
  37. ... | inj₁ p = inj₂ (suc-even p)
  38. ... | inj₂ p = inj₁ (suc-odd p)
  39.  
  40. not-both : (n : ℕ) → Even n → Odd n → ⊥
  41. not-both zero n-even ()
  42. not-both (suc n) (suc-odd n-odd) (suc-even n-even) = not-both n n-even n-odd
  43.  
  44. div-2 : {n : ℕ} → Even n → ℕ
  45. div-2 zero = zero
  46. div-2 (suc-odd (suc-even x)) = suc (div-2 x)
  47.  
  48. double : ℕ → ℕ
  49. double zero = zero
  50. double (suc n) = suc (suc (double n))
  51.  
  52. ≤-weaken : {m n : ℕ} → m ≤ n → m ≤ suc n
  53. ≤-weaken prf = ≤′⇒≤ (≤′-step (≤⇒≤′ prf))
  54.  
  55. double-monotone : (m : ℕ) → m ≤ double m
  56. double-monotone zero = z≤n
  57. double-monotone (suc m) = s≤s (≤-weaken (double-monotone m))
  58.  
  59. double-even : (m : ℕ) → Even (double m)
  60. double-even zero = zero
  61. double-even (suc m) = suc-odd (suc-even (double-even m))
  62.  
  63. double-half : (m : ℕ)(is-even : Even (double m)) → div-2 is-even ≡ m
  64. double-half zero zero = refl
  65. double-half (suc m) (suc-odd (suc-even m-even)) rewrite double-half m m-even = refl
  66.  
  67. lift : (ℕ → Set) → ℕ → Set
  68. lift P n with parity n
  69. ... | inj₁ even = P (div-2 even)
  70. ... | inj₂ odd = ⊤
  71.  
  72. lift-is-lift-even : (P : ℕ → Set)(n : ℕ) → P n ≡ lift P (double n)
  73. lift-is-lift-even P n with parity (double n)
  74. ... | inj₁ x rewrite double-half n x = refl
  75. ... | inj₂ y = ⊥-elim (not-both _ (double-even n) y)
  76.  
  77. lift-is-lift-odd : (P : ℕ → Set){n : ℕ} → Odd n → ⊤ ≡ lift P n
  78. lift-is-lift-odd P {n} odd with parity n
  79. ... | inj₁ x = ⊥-elim (not-both _ x odd)
  80. ... | inj₂ y = refl
  81.  
  82. infinitely-true : (ℕ → Set) → Set
  83. infinitely-true P = (m : ℕ) → Σ[ n ∈ ℕ ] m ≤ n × P n
  84.  
  85. lift-is-infinitely-true : (P : ℕ → Set) → infinitely-true (lift P)
  86. lift-is-infinitely-true P m =
  87. suc (double m) , ≤-weaken (double-monotone m) , subst (λ x → x) (lift-is-lift-odd P (suc-even (double-even m))) tt
  88.  
  89. lift-greater : ℕ → (ℕ → Set) → ℕ → Set
  90. lift-greater m P n = m ≤ n × P n
  91.  
  92. min-of-lift-greater : (P : ℕ → Set)(m : ℕ) → min (lift-greater m P) _≤_ m
  93. min-of-lift-greater P m x prf = proj₁ prf
  94.  
  95. dec-min : (P : ℕ → Set)(n : ℕ) → P n → (m : ℕ) → min P _≤_ m → P m ⊎ (P m → ⊥)
  96. dec-min P n P-wit m is-min = dec-P
  97. where min-of-P : Σ[ x ∈ ℕ ] P x × min P _≤_ x
  98. min-of-P = wf-nat P n P-wit
  99. eq-min : Dec (proj₁ min-of-P ≡ m)
  100. eq-min = proj₁ min-of-P ≟ m
  101. dec-P : P m ⊎ (P m → ⊥)
  102. dec-P with eq-min
  103. dec-P | yes prf = inj₁ (subst P prf (proj₁ (proj₂ min-of-P)))
  104. dec-P | no ¬prf = inj₂ λ p-m → (¬prf (min-unique P m (proj₁ min-of-P) p-m (proj₁ (proj₂ min-of-P)) is-min (proj₂ (proj₂ min-of-P))))
  105.  
  106. dec-infinite : (P : ℕ → Set) → infinitely-true P → (n : ℕ) → P n ⊎ (P n → ⊥)
  107. dec-infinite P inf n with dec-min (lift-greater n P) (proj₁ (inf n)) (proj₂ (inf n)) n (min-of-lift-greater P n)
  108. dec-infinite P inf n | inj₁ (_ , prf) = inj₁ prf
  109. dec-infinite P inf n | inj₂ ¬prf = inj₂ λ prf → ¬prf (≤-refl , prf)
  110.  
  111. dec : (P : ℕ → Set)(n : ℕ) → P n ⊎ (P n → ⊥)
  112. dec P n with dec-infinite (lift P) (lift-is-infinitely-true P) (double n)
  113. ... | prf rewrite (lift-is-lift-even P n) = prf
Add Comment
Please, Sign In to add comment