我已經編寫了一個程序,用於從表達式列表中遞歸地評估prolog中的post-fix表達式。例如,假設下面的列表:Postfix表達式列表評估
[+,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.
我不明白爲什麼我的價值觀消失,或是否有更好的方法來評估名單。
我試圖做的方法是顛倒後綴表達式,以便我的遞歸程序可以從右向左讀取它:P 我給出的例子是讓事情變得簡單哈哈。我希望能夠處理任何大小的表達式。 據我瞭解,你的程序版本會不斷重新組織表達式,直到它匹配eval_stack謂詞之一,然後用表達式的一部分替換結果? 感謝您的迴應,我一直試圖找出這一個幾天現在:) – thegalah 2013-04-11 12:35:35
@thegalah我也得到了這種感覺.... :)除非有一個**非常**很好的理由,總是試圖找到一個從左到右讀Prolog列表的解決方案。然後,您可以使用統一,匹配和尾遞歸對列表進行自然迭代。是的,但看到我的編輯答案(並投票,以便其他人也可以使用它)。 – 2013-04-11 12:38:20
[標籤:DCG]任何人? – false 2014-11-17 20:07:11