namespace http://cds.omdoc.org/examples/programs

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