Prolog - 添加到每个列表元素

时间:2012-11-17 21:53:05

标签: list recursion prolog

我正在学习swi Prolog,我想创建一个为每个元素添加+2的谓词。

所以我写了这样的话:

addUp([],_).
addUp([H|T],R):-addUp(T,R),is_list(R)->append([H+2],R,R);R=[H+2|[]].

addUp([1,2],X).

但它总是返回false。为什么呢?

2 个答案:

答案 0 :(得分:2)

首先提出建议:学习使用maplist / 3:用你写的

addUp(Xs, Ys) :- maplist(addUp2, Xs, Ys).
addUp2(X, Y) :- Y is X + 2.

或者更好,一个更可重用的代码片段......

addUp(Xs, Ys) :- maplist(addUp(2), Xs, Ys).
addUp(N, X, Y) :- Y is X + N.

无论如何,必须明确评估Prolog中的算术,并且必须简化您的代码以便工作

addUp([], []).
addUp([H|T], [H1|T1]) :- H1 is H+2, addUp(T, T1).

答案 1 :(得分:1)

  

但它总是返回false。为什么呢?

您的定义并不总是失败:

?- addUp([1],X).
X = [1+2].

所以有时它会成功。似乎这个案例或多或少都是你想要的。它还能在哪里取得成功?在其他编程语言中,你必须猜测,或者,天堂禁止,阅读程序。在Prolog中,没有必要这样做。只需找到一个好的查询。一个好的候选者是最常见的查询

?- addUp(Xs,Ys).
Xs = [] ...

因此,您的定义成功,Xs等于[]Ys等于......嗯,等于任何。因此,这个答案太笼统了。

另一个目标引起了我的注意:is_list(R)->append([H+2],R,R)。让我们想象一下,这将是真的。 R = []没有,R = [_]也没有。{{1}}。事实上,没有长度,这将是真实的。

现在,我们可以开始修复你的程序了。见chac / CapelliC的建议。