我已经编写了一个程序,用于从表达式列表中递归地评估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