diff options
Diffstat (limited to 'samples/Prolog/calc.pl')
| -rw-r--r-- | samples/Prolog/calc.pl | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/samples/Prolog/calc.pl b/samples/Prolog/calc.pl new file mode 100644 index 0000000..b7492ca --- /dev/null +++ b/samples/Prolog/calc.pl @@ -0,0 +1,68 @@ +action_module(calculator) . + + +%[-,-,d1,-] --push(D)--> [-,-,D,-] if mode(init) +push(D) < - + mode(init), + deny([displayed(D1),mode(init)]), + affirm([displayed(D),mode(cont)]). + +%[-,-,D1,-] --push(D)--> [-,-,10*D1+D,-] if mode(cont) +push(D) < - + mode(cont), + deny(displayed(D1)), + New = 10*D1 + D, + affirm(displayed(New)). + +%[a,op,d,m] --push(clear)--> [0,nop,0,0] +push(clear) < - + deny([accumulator(A),op(O),displayed(D),memory(M),mode(X)]), + affirm([accumulator(0),op(nop),displayed(0),memory(0),mode(init)]). + +%[a,op,d,m] --push(mem_rec)--> [a,op,m,m] +push(mem_rec) < - + memory(M), + deny([displayed(D),mode(X)]), + affirm([displayed(M),mode(init)]). + +%[a,op,d,m] --push(plus)--> [op(a,d),plus,d,m] +push(plus) < - + displayed(D), + deny([accumulator(A),op(O),mode(X)]), + eval(O,A,D,V), ; use normal arithmetic, i.e., V=O(A,D) + affirm([accumulator(V),op(plus),mode(init)]). + +%[a,op,d,m] --push(minus)--> [op(a,d,minus,d,m] +push(minus) lt - + displayed(D), + deny([accumulator(A),op(O),mode(X)]), + eval(O,A,D,V), ; use normal arithmetic, i.e., V=O(A,D) + affirm([accumulator(V),op(minus),mode(init)]). + +%[a,op,d,m] --push(times)--> [op(a,d),times,d,m] +push(times) < - + displayed(D), + deny([accumulator(A),op(O),mode(X)]), + eval(O,A,D,V), ; use normal arithmetic, i.e., V=O(A,D) + affirm([accumulator(V),op(times),mode(init)]). + +%[a,op,d,m] --push(equal)--> [a,nop,op(a,d),m] +push(equal) < - + accumulator(A), + deny([op(O),displayed(D),mode(X)]), + eval(O,A,D,V), + affirm([op(nop),displayed(V),mode(init)]). + +%[a,op,d,m] --push(mem_plus)--> [a,nop,v,plus(m,v)] where v=op(a,d) +push(mem_plus) < - + accumulator(A), + deny([op(O),displayed(D),memory(M),mode(X)]), + eval(O,A,D,V), + eval(plus,M,V,V1), + affirm([op(nop),displayed(V),memory(V1),mode(init)]). + +%[a,op,d,m] --push(plus_minus)--> [a,op,-d,m] +push(clear) < - + deny([displayed(D),mode(X)]), + eval(minus,0,D,V), + affirm([displayed(V),mode(init)]). |
