js.compile.ignore=true
=====
>>> main.whiley
type uint is (int x) where x >= 0
type State is { int[] mem }
type Inc is { uint rd }
type AddC is { uint rd, int c }
property exec(State st, Inc insn) -> (State ns):
if insn.rd < |st.mem|:
return st{mem:=st.mem[insn.rd := st.mem[insn.rd] + 1]}
else:
return st
property exec(State st, AddC insn) -> (State ns):
if insn.rd < |st.mem|:
return st{mem:=st.mem[insn.rd := st.mem[insn.rd] + insn.c]}
else:
return st
// bisimulation
method bisim(State st, uint reg)
requires reg >= 0
// Ensure register is in bounds
requires |st.mem| > reg:
State st1 = exec(st,{rd:reg})
State st2 = exec(st,AddC{rd:reg,c:2})
assert st1 == st2
public export method test():
bisim({mem:[1]},0)
bisim({mem:[1,2]},0)
bisim({mem:[1,2]},1)
bisim({mem:[1,2,3]},0)
bisim({mem:[1,2,3]},1)
bisim({mem:[1,2,3]},2)
---
E705 main.whiley 26,10:19
E722 main.whiley 26,10:19
=====
>>> main.whiley 25:26
State st2 = exec(st,AddC{rd:reg,c:1})
---