namespace http://cds.omdoc.org/examples/programs❚
theory Syntax : http://cds.omdoc.org/urtheories?LF =
tp: type❙
Bool: tp❙
Nat : tp❙
Unit: tp❙
prog: tp ⟶ type❙
true : prog Bool❙
false: prog Bool❙
unit : prog Unit❙
zero : prog Nat❙
succ : prog Nat ⟶ prog Nat❘# succ 1❙
one : prog Nat❘
= succ zero❙
equal : {a} prog a ⟶ prog a ⟶ prog Bool ❘ # 2 = 3 prec 10❙
not : prog Bool ⟶ prog Bool ❘ # ¬ 1 prec 8 ❙
plus : prog Nat ⟶ prog Nat ⟶ prog Nat ❘ # 1 + 2 prec 20❙
minus : prog Nat ⟶ prog Nat ⟶ prog Nat ❘ # 1 - 2 prec 20❙
seq : {a,b} prog a ⟶ prog b ⟶ prog b ❘ # 3 ; 4 prec 5❙
ifte : {a} prog Bool ⟶ prog a ⟶ prog a ⟶ prog a❘ # if 2 then 3 else 4 prec 3❙
ifte2 : prog Bool ⟶ prog Unit ⟶ prog Unit❘
= [b,c] if b then c else unit❙
while : prog Bool ⟶ prog Unit ⟶ prog Unit❙
print : {a} prog a ⟶ prog Unit❘ # print 2❙
read : {a} prog a❙
val : {a,b} prog a ⟶ (prog a ⟶ prog b) ⟶ prog b❘ # val 3 4❙
Var : tp ⟶ type❙
var : {a,b} prog a ⟶ (Var a ⟶ prog b) ⟶ prog b❘ # var 3 4❙
varref : {a} Var a ⟶ prog a❘ # 2 ' prec 30❙
assign : {a} Var a ⟶ prog a ⟶ prog Unit❘ # 2 ← 3 prec 10❙
❚
theory Test : ?Syntax =
main = val (read Nat) [x]
var zero [y]
while (¬ x = y') (
print x;
y ← succ y'
)❙
❚
theory Machine : http://cds.omdoc.org/urtheories?LF =
obj: type❙
loc: type❙
command: type❙
add: obj ⟶ loc ⟶ command❙
get: loc ⟶ obj ⟶ command❙
update: loc ⟶ obj ⟶ command❙
delete: loc ⟶ obj ⟶ command❙
chan: type❙
stdio: chan❙
in : chan ⟶ obj ⟶ command❙
out: chan ⟶ obj ⟶ command❙
execute: command ⟶ type❙
❚
theory OperationalSemantics : http://cds.omdoc.org/urtheories?LF =
include ?Syntax❙
include ?Machine❙
objectify : {a} prog a ⟶ obj ❘ # objectify 2❙
varloc: {a} Var a ⟶ loc ⟶ type❘ # 2 @ 3❙
eval : {a} prog a ⟶ prog a ⟶ type❘ # 2 ⟿ 3 prec 3❙
eval_seq: {a,b, p:prog a, q: prog b, x,y} p⟿x ⟶ q⟿y ⟶ p;q ⟿ y❙
eval_if_true : {a, c, t,e: prog a, x} c⟿true ⟶ t⟿x ⟶ if c then t else e ⟿ x❙
eval_if_false: {a, c, t,e: prog a, x} c⟿false ⟶ e⟿x ⟶ if c then t else e ⟿ x❙
eval_while_true : {c, b, x, y} c⟿true ⟶ b⟿x ⟶ while c b ⟿ y ⟶ while c b ⟿ y❙
eval_while_false: {c, b} c⟿false ⟶ while c b ⟿ unit❙
eval_var : {a,b, p: prog a, cont: Var a ⟶ prog b, l, x, y}
p⟿x ⟶ execute (add (objectify x) l) ⟶ ({v} v@l ⟶ cont v ⟿ y)
⟶ (var p cont)⟿y❙
eval_varref : {a,v:Var a,l,x}
v@l ⟶ execute (get l (objectify x))
⟶ v' ⟿ x❙
eval_assign : {a, v: Var a,p,l,x}
p⟿x ⟶ v@l ⟶ execute (update l (objectify x))
⟶ v←p ⟿ unit❙
eval_print : {a, p: prog a, x}
p⟿x ⟶ execute (out stdio (objectify x))
⟶ (print p) ⟿ unit❙
eval_read : {a, x: prog a}
execute (in stdio (objectify x))
⟶ (read a) ⟿ x❙
❚