在学习Prolog时,我正在尝试使用累加器来解决以下问题:
写一个谓词addone2 /,其第一个参数是一个整数列表,其第二个参数是通过在第一个列表中的每个整数加1得到的整数列表。例如,查询
addone([1,2,7,2],X).
应该给出
X = [2,3,8,3].
我创建了以下代码:
addone([], _).
addone([E|Tail], [R|Rs]) :-
NewE is E+1,
append([R|Rs], [NewE], NewRs),
addone(Tail, NewRs).
但它不起作用。有人可以告诉我为什么吗?那么,我如何在Prolog中使用累加器?
谢谢!
答案 0 :(得分:4)
anthares是正确的,因为你必须优化你的基本案例。但是,您通过append
来电也会使效率低下。在Prolog中,需要一些时间来适应统一的力量,但是,例如,在这种情况下,它可以帮助您立即设置结果列表。请尝试以下方法:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
这就是它的全部内容。通过立即将E1
放在第二个参数的模式中,您已经创建了结果列表的第一个元素。其余元素Rs
将在递归期间创建。一个非常典型的Prolog模式。
答案 1 :(得分:1)
递归的底部应为addone([],[]).
,以便NewRs与[]