open import Data.Fin using (Fin)
open import Data.Nat using (ℕ; suc)

module CBV.Base.Terms where

variable n : ℕ
variable m : Fin n

mutual
  data Value (n : ℕ) : Set where
    unit : Value n
    ƛ_ : Exp (suc n) → Value n
    #_ : Fin n → Value n
    inl : Value n → Value n
    inr : Value n → Value n
    ⟨_,_⟩ : Value n → Value n → Value n

  data Exp (n : ℕ) : Set where
    val : Value n → Exp n
    _·_ : Exp n → Exp n → Exp n
    _»_ : Exp n → Exp n → Exp n
    inl : Exp n → Exp n
    inr : Exp n → Exp n
    ⟨_,_⟩ : Exp n → Exp n → Exp n
    case_inl⇒_inr⇒_ : Exp n → Exp (suc n) → Exp (suc n) → Exp n
    $≔_⋯_ : Exp n → Exp (suc (suc n)) → Exp n

variable v v₁ v₂ : Value n
variable e e₁ e₂ : Exp n

infix 5 ƛ_
infixl 7 _»_
infixl 7 _·_
infix 9 #_
infixl 5 case_inl⇒_inr⇒_
infixr 5 $≔_⋯_