虽然学习的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与待连接的[]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top