プロローグの後置式を式リストから再帰的に評価するプログラムを作成しました。たとえば、次のリストがあるとします。
[+,1,2]
3 を返す必要があります。私が述語を作成した方法は、値を逆方向に読み取るように、リストの最後に到達するまで自分自身を再帰的に呼び出すことです。(このリストを左から右に読むのと同じ: [2,1,+])。
私の問題は、再帰呼び出しで複数の値を返そうとすると、すべての値が突然消えることです。
コードは次のとおりです。
eval_list([Head|Tail],_,Result):-
Tail==[], % last element of list
Result=Head,
write(Head),
write(' was stored in Result!\n').
eval_list([Head|Tail],Store1,Result):-
eval_list(Tail,Store2, NewResult),
(\+integer(Store2))
->
% if no integer is bound to Store2, bind Store1 to Head
Store1=Head,
Result is NewResult,
write(Head),
write(' is stored value!\n')
; (integer(Store2)) ->
% if an integer is bound to store2, we perform operation specified by the Head with the stored number
X is Store2+NewResult,
Result is X,
write('performed operation!\n')
;
% if doesnt catch either of these states the program is broken
( print('something broke\n'),
print(Store1),
nl,
print(Store2),
nl,
print(Head),
nl,
print(Result),
nl
).
次の出力が得られます。
?- eval_list([+,1,2],X,Result).
2 was stored in Result!
1 is stored value!
something broke
_G1162
_L147
+
_G1163
true.
値が消える理由、またはリストを評価するためのより良い方法があるかどうかがわかりません。