Lambda Prolog-将一个列表与一个元素相乘,结果会有一个奇怪的尾部?

Lambda Prolog-将一个列表与一个元素相乘,结果会有一个奇怪的尾部?,lambda,prolog,swi-prolog,Lambda,Prolog,Swi Prolog,我想乘以两个列表,取左边的列表,然后乘以 正确的列表 例如: ?- multLists([3,4,2], [4,7,8], R). R = [[12,16,8],[21,28,14],[24,32,16]]. 为此,我编写了一个helper谓词,它接受一个列表并将其相乘 通过单个标量: multListElem([], _, _). multListElem([H|T], Result, Elem) :- multListElem(T, W, Elem), Z is H*El

我想乘以两个列表,取左边的列表,然后乘以 正确的列表

例如:

?- multLists([3,4,2], [4,7,8], R).
R = [[12,16,8],[21,28,14],[24,32,16]].
为此,我编写了一个helper谓词,它接受一个列表并将其相乘 通过单个标量:

multListElem([], _, _).
multListElem([H|T], Result, Elem) :- 
    multListElem(T, W, Elem),
    Z is H*Elem,
    Result = [Z|W].
但是现在,当我运行
?-multListElem([1,2,3],X,3])时。
我得到:


那奇怪的尾巴是什么

错误就在这里:
multListElem([],\uu,\uu)
。当第一个列表为空时,结果为空,因此您必须编写
multListElem([],[],389;)。

当您处理列表时,可以使用功能性习惯用法,如 :


将第一个参数应用于每个列表的每个元素(作为参数传递给它)。

基本情况保持未实例化尾部:更改为

multListElem([],[],_).
它会起作用的

@Joel76已经解决了您的问题,并公开了使用maplist的更好方法。如果你有lambda.pl,这里有一个简洁的公式来解决这个问题

?- maplist(\A^B^maplist(\X^Y^(Y is X*A), [3,4,2], B), [4,7,8], R).
R = [[12, 16, 8], [21, 28, 14], [24, 32, 16]].
编辑当然正确的界面是

multLists(L1, L2, R) :-
    maplist(\A^B^maplist(\X^Y^(Y is X*A), L1, B), L2, R).
@false指出的第二个bug很难理解,但很容易修复:

multLists(L1, L2, R) :-
    maplist(\A^maplist(\X^Y^(Y is X*A), L1), L2, R).

我称之为特性的第一个bug是:lambda与闭包一起工作非常有用,
a
随后被声明为。。。只需申报我的2美分……

A;和B可以通过部分应用删除@false:和一位好老师一起学习序言真是太好了。谢谢代替Y的使用是XA,而不是Y=XA。并用作列表[A,B,C]和[X,Y,Z]:因此,没有基本术语……请不要更改您的问题!这使得现有的答案毫无用处。
multLists(L1, L2, R) :-
    maplist(\A^B^maplist(\X^Y^(Y is X*A), L1, B), L2, R).
multLists(L1, L2, R) :-
    maplist(\A^maplist(\X^Y^(Y is X*A), L1), L2, R).