%	Domain knowledge for WARPLAN - generates code for register machine

:- defop(700, xfy, #).
:- defop(500, fx, ld).
:- defop(500, fx, add).
:- defop(500, fx, sub).
:- defop(500, fx, store).
:- defop(500, fx, reg).

add(acc is V1 + V2, add R # V1 + V2).
add(acc is V1 - V2, sub R # V1 - V2).
add(acc is V, ld R # V).
add(reg R is V, store R # V).

del(acc is Z, U) :- add(acc is V, U).
del(reg R is Z, U) :- add(reg R is V, U).

can(ld R # V, reg R is V).
can(store R # V, acc is V).
can(add R # V1 + V2, reg R is V2 & acc is V1).
can(sub R # V1 - V2, reg R is V2 & acc is V1).

given(start, reg 1 is c1).
given(start, reg 2 is c2).
given(start, reg 3 is c3).
given(start, reg 4 is c4).

run :-  plans(acc is (c1 - c2) + (c3 - c4), start).
