3

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

谢谢!

4

2 回答 2

4

anthares 是正确的,因为您必须改进基本情况。但是,您的append通话也使事情变得非常低效。在 Prolog 中,需要一些时间来适应统一的力量,但例如,在这种情况下,它可以帮助您立即设置结果列表。尝试以下操作:

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

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

于 2010-11-22T08:55:01.937 回答
1

递归的底部应该是addone([],[]).为了让 NewRs 与 [] 连接

于 2010-11-22T08:50:12.303 回答