List Prolog-添加到每个列表元素

List Prolog-添加到每个列表元素,list,recursion,prolog,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。为什么?首先有一个建议:学会使用/3:这样你就可以写作了 addUp(Xs, Ys) :- maplist(addUp2, Xs, Ys). addUp2(X, Y) :- Y

我正在学习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。为什么?

首先有一个建议:学会使用/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).
但它总是返回false。为什么?

您的定义并不总是失败:

?- addUp([1],X). X = [1+2]. ?-相加([1],X)。 X=[1+2]。 所以有时候它会成功。看来这个案子或多或少是你想要的。它还能在哪里成功?在其他编程语言中,您必须猜测或(但愿如此)阅读程序。在Prolog中,不需要这样做。只需找到一个好的查询。一个好的候选者是最一般的查询

?- addUp(Xs,Ys). Xs = [] ... ?-相加(Xs,Ys)。 Xs=[]。。。 因此,您成功地定义了
Xs
等于
[]
,而
Ys
等于。。。嗯,等于任何东西。因此,这个答案过于笼统

另一个目标吸引了我的眼球:
是\u list(R)->append([H+2],R,R)
。让我们想象一下,这将是真的。对于
R=[]
不,也不适用于
R=[[\u]
。事实上,没有长度,这将是真实的


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

或者更可重用的
地图列表(\X^Y^(Y是X+2),Xs,Ys)