123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- module Lambda where
- open import Prelude
- -- Simply typed λ-calculus
- infixr 70 _⟶_
- data Type : Set where
- ι : Type
- _⟶_ : Type -> Type -> Type
- Ctx : Set
- Ctx = List Type
- infixl 80 _•_
- infix 20 ƛ_
- data Term : Ctx -> Type -> Set where
- vz : forall {Γ τ } -> Term (Γ , τ) τ
- wk : forall {Γ σ τ} -> Term Γ τ -> Term (Γ , σ) τ
- _•_ : forall {Γ σ τ} -> Term Γ (σ ⟶ τ) -> Term Γ σ -> Term Γ τ
- ƛ_ : forall {Γ σ τ} -> Term (Γ , σ) τ -> Term Γ (σ ⟶ τ)
- Terms : Ctx -> Ctx -> Set
- Terms Γ Δ = All (Term Γ) Δ
- infixl 60 _◄_
- infixr 70 _⇒_
- _⇒_ : Ctx -> Type -> Type
- ε ⇒ τ = τ
- (Δ , σ) ⇒ τ = Δ ⇒ σ ⟶ τ
- infixl 80 _•ˢ_
- _•ˢ_ : {Γ Δ : Ctx}{τ : Type} -> Term Γ (Δ ⇒ τ) -> Terms Γ Δ -> Term Γ τ
- t •ˢ ∅ = t
- t •ˢ (us ◄ u) = t •ˢ us • u
- Var : Ctx -> Type -> Set
- Var Γ τ = τ ∈ Γ
- var : forall {Γ τ} -> Var Γ τ -> Term Γ τ
- var hd = vz
- var (tl x) = wk (var x)
- vzero : forall {Γ τ} -> Var (Γ , τ) τ
- vzero = hd
- vsuc : forall {Γ σ τ} -> Var Γ τ -> Var (Γ , σ) τ
- vsuc = tl
|