[ language |
continuations |
typing |
evaluation |
type preservation ||
MLref ||
LLF ]
Evaluation for MLref
%%% Mini-ML with References
%%% Continuation-Based Abstract Machine
%%% Author: Frank Pfenning
exec : cont -> inst -> final -> type. %name exec Ex
close : final -> final -> type. %name close Ec
contains : cell -> val -> type. %name contains Et
read : cell -> val -> type. %name read Ed
ceval : exp -> final -> type. %name ceval Ev
%%% Reading a cell value without affecting the state
rd : read C V o- contains C V o- .
%%% Execution
% Natural Numbers
ex_z : exec K (ev z) W
o- exec K (return z*) W.
ex_s : exec K (ev (s E1)) W
o- exec (K ; [x1] return (s* x1)) (ev E1) W.
ex_case : exec K (ev (case E1 E2 E3)) W
o- exec (K ; [x1] case1 x1 E2 E3) (ev E1) W.
ex_case1_z : exec K (case1 z* E2 E3) W
o- exec K (ev E2) W.
ex_case1_s : exec K (case1 (s* V1) E2 E3) W
o- exec K (ev (E3 V1)) W.
% Unit
ex_unit : exec K (ev (unit)) W
o- exec K (return unit*) W.
% Pairs
ex_pair : exec K (ev (pair E1 E2)) W
o- exec (K ; [x1] pair1 x1 E2) (ev E1) W.
ex_pair1 : exec K (pair1 V1 E2) W
o- exec (K ; [x2] return (pair* V1 x2)) (ev E2) W.
ex_fst : exec K (ev (fst E1)) W
o- exec (K ; [x1] fst1 x1) (ev E1) W.
ex_fst1 : exec K (fst1 (pair* V1 V2)) W
o- exec K (return V1) W.
ex_snd : exec K (ev (snd E1)) W
o- exec (K ; [x1] snd1 x1) (ev E1) W.
ex_snd1 : exec K (snd1 (pair* V1 V2)) W
o- exec K (return V2) W.
% Functions
ex_lam : exec K (ev (lam E1)) W
o- exec K (return (lam* E1)) W.
ex_app : exec K (ev (app E1 E2)) W
o- exec (K ; [x1] app1 x1 E2) (ev E1) W.
ex_app1 : exec K (app1 V1 E2) W
o- exec (K ; [x2] app2 V1 x2) (ev E2) W.
ex_app2 : exec K (app2 (lam* E1) V2) W
o- exec K (ev (E1 V2)) W.
% References
ex_ref : exec K (ev (ref E1)) W
o- exec (K ; [x1] ref1 x1) (ev E1) W.
ex_ref1 : exec K (ref1 V1) (new* W)
o- ({c:cell} contains c V1
-o exec K (return (ref* c)) (W c)).
ex_deref : exec K (ev (deref E1)) W
o- exec (K ; [x1] deref1 x1) (ev E1) W.
ex_deref1 : exec K (deref1 (ref* C)) W
o- read C V1 & exec K (return V1) W.
%{ or, multiplicatively
ex_deref1 : exec K (deref1 (ref* C)) W
o- contains C V1
o- (contains C V1 -o exec K (return V1) W).
}%
ex_assign : exec K (ev (assign E1 E2)) W
o- exec (K ; [x1] assign1 x1 E2) (ev E1) W.
ex_assign1 : exec K (assign1 V1 E2) W
o- exec (K ; [x2] assign2 V1 x2) (ev E2) W.
ex_assign2 : exec K (assign2 (ref* C1) V2) W
o- contains C1 V1
o- (contains C1 V2 -o exec K (return unit*) W).
ex_seq : exec K (ev (seq E1 E2)) W
o- exec (K ; [x1] ev E2) (ev E1) W.
% Let
ex_let : exec K (ev (let E1 E2)) W
o- exec (K ; [x1] let1 x1 E2) (ev E1) W.
ex_let1 : exec K (let1 V1 E2) W
o- exec K (ev (E2 V1)) W.
ex_letv : exec K (ev (letv V1 E2)) W
o- exec K (ev (E2 V1)) W.
% Recursion
ex_fix : exec K (ev (fix E1)) W
o- exec K (ev (E1 (fix E1))) W.
% Values
ex_vl : exec K (ev (vl V)) W
o- exec K (return V) W.
ex_return : exec (K ; C) (return V) W
o- exec K (C V) W.
ex_init : exec init (return V) W
o- close (val* V) W.
%%% Collecting the final state
% In LLF close_done should come last and will only
% succeed if there are no "contains" assumptions
% left in the state.
close_done : close W W.
close_loc : close W1 W
o- contains C1 V1
o- close (loc* C1 V1 W1) W.
%%% Top-level evaluation
cev : ceval E V
o- exec init (ev E) V.
[ language |
continuations |
typing |
evaluation |
type preservation ||
MLref ||
LLF ]
Frank Pfenning