我正在学习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。为什么呢?
答案 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的建议。