Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. open import Relation.Binary.PropositionalEquality
  2.  
  3. data ∃ {A : Set} (B : A → Set) : Set where
  4. _,_ : (x₁ : A) → B x₁ → ∃ \(x : A) → B x
  5.  
  6. infixl 8 _∨_
  7. data _∨_ (P Q : Set) : Set where
  8. or-introl : P → P ∨ Q
  9. or-intror : Q → P ∨ Q
  10.  
  11. or-elimination : {A B C : Set} → A ∨ B → (A → C) → (B → C) → C
  12. or-elimination (or-introl x) ac bc = ac x
  13. or-elimination (or-intror x) ac bc = bc x
  14.  
  15. data Term : Set where
  16. true : Term
  17. false : Term
  18. if_then_else_ : Term → Term → Term → Term
  19. zero : Term
  20. succ : Term → Term
  21. pred : Term → Term
  22. iszero : Term → Term
  23.  
  24. infix 30 if_then_else_
  25.  
  26. data Type : Set where
  27. Bool : Type
  28. Nat : Type
  29.  
  30. data _∷_ : Term → Type → Set where
  31. t-True : true ∷ Bool
  32. t-False : false ∷ Bool
  33. t-If : {t₁ t₂ t₃ : Term} {T : Type} →
  34. t₁ ∷ Bool → t₂ ∷ T → t₃ ∷ T →
  35. if t₁ then t₂ else t₃ ∷ T
  36. t-Zero : zero ∷ Nat
  37. t-Succ : {t₁ : Term} →
  38. t₁ ∷ Nat → (succ t₁) ∷ Nat
  39. t-Pred : {t₁ : Term} →
  40. t₁ ∷ Nat → (pred t₁) ∷ Nat
  41. t-IsZero : {t₁ : Term} →
  42. iszero t₁ ∷ Bool
  43.  
  44. data is-nval : Term → Set where
  45. nval-zero : is-nval zero
  46. nval-succ : {t : Term} → is-nval t → is-nval (succ t)
  47. nval-pred : {t : Term} → is-nval t → is-nval (pred t)
  48.  
  49. data is-bval : Term → Set where
  50. bval-true : is-bval true
  51. bval-false : is-bval false
  52.  
  53. data is-value : Term → Set where
  54. val-true : is-value true
  55. val-false : is-value false
  56. val-zero : is-value zero
  57. val-succ : {nv : Term} → is-nval nv → is-value (succ nv)
  58.  
  59.  
  60. data _⟶_ : Term → Term → Set where
  61. e-IfTrue : {t₂ t₃ : Term} →
  62. if true then t₂ else t₃ ⟶ t₂
  63. e-IfFalse : {t₂ t₃ : Term} →
  64. if false then t₂ else t₃ ⟶ t₃
  65. e-If : {t₁ t₁′ t₂ t₃ : Term} →
  66. t₁ ⟶ t₁′
  67. if t₁ then t₂ else t₃ ⟶ if t₁′ then t₂ else t₃
  68.  
  69. e-Succ : {t₁ t₁′ : Term} →
  70. t₁ ⟶ t₁′
  71. succ t₁ ⟶ succ t₁′
  72. e-PredZero :
  73. pred zero ⟶ zero
  74. e-PredSucc : {nv₁ : Term} →
  75. is-nval nv₁
  76. pred (succ nv₁) ⟶ pred nv₁
  77. e-IsZeroZero :
  78. iszero zero ⟶ true
  79. e-IsZeroSucc : {nv₁ : Term} →
  80. is-nval nv₁
  81. iszero (succ nv₁) ⟶ false
  82. e-IsZero : {t₁ t₁′ : Term} →
  83. t₁ ⟶ t₁′
  84. iszero t₁ ⟶ iszero t₁′
  85.  
  86. -- reverse-true : {R : Type} → true ∷ R → R ≡ Bool
  87. -- reverse-true t-true = refl
  88.  
  89. normal-form-bool : {v : Term} → v ∷ Bool → is-value v → (v ≡ true) ∨ (v ≡ false)
  90. normal-form-bool t-True is-value-v = or-introl refl
  91. normal-form-bool t-False is-value-v = or-intror refl
  92. normal-form-bool (t-If v-bool v-bool₁ v-bool₂) ()
  93. normal-form-bool t-IsZero ()
  94.  
  95. normal-form-nat : {v : Term} → v ∷ Nat → is-value v → is-nval v
  96. normal-form-nat t-Zero isval-v = nval-zero
  97. normal-form-nat (t-Succ vnat) (val-succ x) = nval-succ x
  98. normal-form-nat (t-Pred vnat) ()
  99. normal-form-nat (t-If vnat vnat₁ vnat₂) ()
  100.  
  101.  
  102. progress : {t : Term} {T : Type} → t ∷ T → is-value t ∨ ∃ \(t′ : Term) → t ⟶ t′
  103. progress t-True = or-introl val-true
  104. progress t-False = or-introl val-false
  105. progress (t-If t1bool t₂t t₃t) = or-elimination (progress t1bool)
  106. (λ x → or-intror (value-case t1bool x))
  107. (λ x → or-intror (prog-case t1bool x))
  108. where
  109. value-case : {t₁ t₂ t₃ : Term} → t₁ ∷ Bool → is-value t₁ → ∃ \(t′ : Term) → (if t₁ then t₂ else t₃) ⟶ t′
  110. value-case {t₁}{t₂}{t₃} t₁bool is-value-t1 = or-elimination (normal-form-bool t₁bool is-value-t1)
  111. true-case
  112. false-case
  113. where
  114. true-case : {t₁ t₂ t₃ : Term} → t₁ ≡ true → ∃ \(t′ : Term) → (if t₁ then t₂ else t₃) ⟶ t′
  115. true-case {_}{t₂}{_} refl = t₂ , e-IfTrue
  116. false-case : {t₁ t₂ t₃ : Term} → t₁ ≡ false → ∃ \(t′ : Term) → (if t₁ then t₂ else t₃) ⟶ t′
  117. false-case {_}{_}{t₃} refl = t₃ , e-IfFalse
  118. prog-case : {t₁ t₂ t₃ : Term} → t₁ ∷ Bool → ∃ (_⟶_ t₁) → ∃ \(t′ : Term) → (if t₁ then t₂ else t₃) ⟶ t′
  119. prog-case {t₁}{t₂}{t₃} t1bool₁ (x₁ , x) = (if x₁ then t₂ else t₃) , (e-If x)
  120. progress t-Zero = or-introl val-zero
  121. progress (t-Succ case) = {!!}
  122. progress (t-Pred case) = {!!}
  123. progress t-IsZero = {!!}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement