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)]).
 |