mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
69 lines
1.9 KiB
Prolog
69 lines
1.9 KiB
Prolog
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)]).
|