34 lines
1.1 KiB
Agda
34 lines
1.1 KiB
Agda
module ahmed.day1 where
|
||
|
||
open import Agda.Primitive
|
||
open import Data.Nat
|
||
open import Data.Fin
|
||
open import Data.Product
|
||
|
||
data Type : Set where
|
||
Bool : Type
|
||
_-→_ : Type → Type → Type
|
||
|
||
data Term (n : ℕ) : Set where
|
||
Var : (m : Fin n) → Term n
|
||
True : Term n
|
||
False : Term n
|
||
If_Then_Else_ : Term n → Term n → Term n → Term n
|
||
λ[_::_]_ : Term n → Type → Term n → Term n
|
||
_∙_ : Term n → Term n → Term n
|
||
|
||
data isValue (n : ℕ) : Term n → Set where
|
||
TrueValue : isValue n True
|
||
FalseValue : isValue n False
|
||
LambdaValue : (x : Term n) → (τ : Type) → (e : Term n) → isValue n (λ[ x :: τ ] e)
|
||
|
||
Value = (n : ℕ) → Σ (Term n) (isValue n)
|
||
|
||
data evaluationContext : (n : ℕ) → Set where
|
||
dot : evaluationContext 0
|
||
EIf_Then_Else_ : {n : ℕ} → evaluationContext n → Term n → Term n → evaluationContext n
|
||
EAppLeft : {n : ℕ} → evaluationContext n → Term n → evaluationContext n
|
||
EAppRight : {n : ℕ} → Value → evaluationContext n → evaluationContext n
|
||
|
||
data isValidValueForType (n : ℕ) (t : Type) : (e : Term n) → Set where
|
||
TrueV : isValidValueForType n Bool True |