40 lines
1.5 KiB
Agda
40 lines
1.5 KiB
Agda
|
{-# OPTIONS --allow-incomplete-matches --allow-unsolved-metas #-}
|
|||
|
|
|||
|
module Project.Cesk where
|
|||
|
|
|||
|
open import Data.Product renaming (_,_ to ⦅_,_⦆)
|
|||
|
open import Project.Definitions using (Aexp; Exp; Env; State; Letk; Kont; Value; Type; atomic; kont; letk; lookup; call/cc; case; mkState; halt; `ℕ; _,_; _k⇒_; _⇒_; _∋_; _·_; _∘_; _[_∶_]; ∅)
|
|||
|
open import Project.Util using (_$_)
|
|||
|
open import Project.Do using (StepResult; part; done; do-kont; do-apply)
|
|||
|
|
|||
|
open Aexp
|
|||
|
open Value
|
|||
|
open State
|
|||
|
|
|||
|
astep : ∀ {Γ A} → Aexp Γ A → Env Γ → Value A
|
|||
|
astep zero _ = zero
|
|||
|
astep (suc c) e = suc $ astep c e
|
|||
|
astep (` id) e = lookup e id
|
|||
|
astep (ƛ body) e = clo body e
|
|||
|
|
|||
|
inject : (A : Type) → Exp ∅ A → State A
|
|||
|
inject A C = mkState A ∅ C ∅ halt
|
|||
|
|
|||
|
step : ∀ {Tω : Type} → State Tω → StepResult Tω
|
|||
|
step (mkState Tc Γ (case c cz cs) E K) with ⦅ astep c E , astep cs E ⦆
|
|||
|
... | ⦅ zero , _ ⦆ = part $ mkState Tc Γ cz E K
|
|||
|
... | ⦅ suc n , clo {Γc} cc cloE ⦆ =
|
|||
|
part $ mkState Tc (Γc , `ℕ) cc (cloE [ `ℕ ∶ n ]) K
|
|||
|
step (mkState Tc Γ (C₁ · C₂) E K) =
|
|||
|
let C₁′ = astep C₁ E in
|
|||
|
let C₂′ = astep C₂ E in
|
|||
|
do-apply C₁′ C₂′ K
|
|||
|
step (mkState Tc Γ (atomic x) E K) with K
|
|||
|
... | halt = done $ astep x E
|
|||
|
... | kont l = part $ do-kont l $ astep x E
|
|||
|
step (mkState Tc Γ (call/cc C) E K) =
|
|||
|
part $ mkState ({! !} k⇒ {! !}) Γ {! !} {! !} {! !}
|
|||
|
|
|||
|
-- 3 + (call/cc k . k 2 + k 4)
|
|||
|
-- (k . k 2 + k 4) (\x . 3 + x)
|
|||
|
-- ((\x . 3 + x) 2 + (\x . 3 + x) 4)
|