2024-06-04 14:31:23 +00:00
|
|
|
|
module ahmed.day1 where
|
|
|
|
|
|
2024-06-04 22:56:00 +00:00
|
|
|
|
open import Agda.Primitive
|
|
|
|
|
open import Data.Nat
|
|
|
|
|
open import Data.Fin
|
2024-06-04 14:31:23 +00:00
|
|
|
|
open import Data.Product
|
|
|
|
|
|
|
|
|
|
data Type : Set where
|
|
|
|
|
Bool : Type
|
|
|
|
|
_-→_ : Type → Type → Type
|
|
|
|
|
|
2024-06-04 22:56:00 +00:00
|
|
|
|
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
|
2024-06-04 14:31:23 +00:00
|
|
|
|
|
2024-06-04 22:56:00 +00:00
|
|
|
|
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)
|
2024-06-04 14:31:23 +00:00
|
|
|
|
|
2024-06-04 22:56:00 +00:00
|
|
|
|
Value = (n : ℕ) → Σ (Term n) (isValue n)
|
2024-06-04 14:31:23 +00:00
|
|
|
|
|
2024-06-04 22:56:00 +00:00
|
|
|
|
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
|
2024-06-04 17:52:15 +00:00
|
|
|
|
|
2024-06-04 22:56:00 +00:00
|
|
|
|
data isValidValueForType (n : ℕ) (t : Type) : (e : Term n) → Set where
|
|
|
|
|
TrueV : isValidValueForType n Bool True
|