List Prolog-添加到每个列表元素
我正在学习swi Prolog,我想创建一个谓词,为每个元素添加+2 所以我写了这样的东西: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
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)
。