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