prolog中的累加器问题

时间:2010-11-22 08:47:48

标签: prolog accumulator

在学习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中使用累加器?

谢谢!

2 个答案:

答案 0 :(得分:4)

anthares是正确的,因为你必须优化你的基本案例。但是,您通过append来电也会使效率低下。在Prolog中,需要一些时间来适应统一的力量,但是,例如,在这种情况下,它可以帮助您立即设置结果列表。请尝试以下方法:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

这就是它的全部内容。通过立即将E1放在第二个参数的模式中,您已经创建了结果列表的第一个元素。其余元素Rs将在递归期间创建。一个非常典型的Prolog模式。

答案 1 :(得分:1)

递归的底部应为addone([],[]).,以便NewRs与[]

连接