通过将具有相同索引的元素求和来组合两个列表不起作用

时间:2015-12-08 14:54:47

标签: prolog

第二天,我正在尝试制作类似这样的作品:

?- 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

为什么它不起作用以及最终如何克服它?

2 个答案:

答案 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.