题
虽然学习的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).
但它不工作。谁能告诉我为什么?所以,我怎么用蓄电池在序言?
谢谢!
解决方案
Anthares旅馆是正确的,你必须优化您的基本情况。但是,你也与您的通话append
使事情变得非常低效。在Prolog,它需要一些时间来适应统一的力量,但例如,在这种情况下,它可以帮助你立即成立了你的结果。尝试以下方法:
addone([E|Tail], [E1|Rs]) :-
E1 is E+1,
addone(Tail, Rs).
这真的就是这么简单。通过立即将E1
在你的第二个参数的模式,你已经创建了你的结果的第一个元素。其余的元素Rs
将递归过程中创建。一个非常典型的Prolog图案。
其他提示
您递归底部应addone([],[]).
为了NewRs与待连接的[]
不隶属于 StackOverflow