aboutsummaryrefslogtreecommitdiff
path: root/samples/Prolog/calc.pl
diff options
context:
space:
mode:
Diffstat (limited to 'samples/Prolog/calc.pl')
-rw-r--r--samples/Prolog/calc.pl68
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)]).