repos / machines.hs.git


machines.hs.git / src / Abstract
Evgenii Akentev  ·  2024-09-06

CEK.hs

 1module Abstract.CEK where
 2
 3-- https://en.wikipedia.org/wiki/CEK_Machine
 4-- https://legacy.cs.indiana.edu/ftp/techreports/TR202.pdf
 5-- https://cstheory.stackexchange.com/a/41257
 6
 7-- i'm fine with the defunctionalized version
 8
 9data V = Bound Int
10  deriving (Show, Eq)
11
12data Term = Appl Term Term | Var V | Abst Term
13  deriving (Show)
14
15data Val = Closure Term [Val]
16  deriving (Show)
17
18data Cont
19  = C2 Term [Val] Cont
20  | C1 Val Cont
21  | C0
22
23continue :: Cont -> Val -> Val 
24continue c v = case (c, v) of
25  (C2 t1 e k, v0) -> eval t1 e (C1 v0 k)
26  (C1 v0 k, v1) -> apply v0 v1 k
27  (C0, v') -> v'
28
29apply :: Val -> Val -> Cont -> Val
30apply v0 v1 k =
31  let (Closure t e) = v0
32  in eval t (v1 : e) k
33
34eval :: Term -> [Val] -> Cont -> Val
35eval t e k = case t of
36  Var (Bound n) -> continue k (e!!n)
37  Abst t' -> continue k (Closure t' e)
38  Appl t0 t1 -> eval t0 e (C2 t1 e k)
39
40run :: Term -> Val
41run t = eval t [] C0
42
43
44-- (\ 0 0) (\ 0)
45t1 :: Term
46t1 = Appl (Abst (Appl (Var $ Bound 0) (Var $ Bound 0))) (Abst (Var $ Bound 0))
47
48ex1 :: Val
49ex1 = run t1
50
51--((λ 0) (λ 0)) (λ 0)
52t2 :: Term
53t2 = Appl (Appl (Abst $ Var $ Bound 0) (Abst $ Var $ Bound 0)) (Abst $ Var $ Bound 0)
54
55ex2 :: Val
56ex2 = run t2