第二天,我正在尝试制作类似这样的作品:
?- sm([1,2,3,4], [3,4,5,6], X).
X = [4,6,8,10].
我现在有这样的事情:
sm([], []).
sm([Head1|Rest1], [Head2|Rest2], R) :-
ResultElem is Head1 + Head2,
append([ResultElem], R, R1),
sm(Rest1, Rest2, R1).
我只得到:
Singleton variables: [X]
false
为什么它不起作用以及最终如何克服它?
答案 0 :(得分:3)
问题是您的递归sm/3
没有匹配的基础,因为您错误地写了sm/2
:
sm([], [], []). /* You forgot the third pair of [] brackets */
就recursive子句而言,将结果放在规则的标题中更容易,并且可以避免使用append
:
sm([Head1|Rest1], [Head2|Rest2], [ResultElem|R]) :-
ResultElem is Head1 + Head2,
sm(Rest1, Rest2, R).
答案 1 :(得分:2)
你可以使用maplist:
add(X,Y,Z) :-
Z is X+Y.
my_sum(L1, L2, L) :-
maplist(add, L1,L2,L).
使用SWI-Prolog和模块lambda,您可以编写
:- use_module(library(lambda)).
my_sum(L1,L2,L) :-
maplist(\X^Y^Z^(Z is X+Y), L1, L2, L).
最后,使用模块clpfd,您可以:
:- use_module(library(lambda)).
:- use_module(library(clpfd)).
my_sum(L1,L2,L) :-
maplist(\X^Y^Z^(Z #= X+Y), L1, L2, L).
我们有:
?- my_sum([1,A, 9] ,[B,5,6], [5,7,C]).
A = 2,
B = 4,
C = 15.