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

JAN*_*JAN 3 lambda prolog swi-prolog

我想将两个列表相乘,我在左侧列表中将其乘以右侧列表中的每个元素.

例如:

?- multLists([3,4,2], [4,7,8], R).
R = [[12,16,8],[21,28,14],[24,32,16]].
Run Code Online (Sandbox Code Playgroud)

为此,我编写了一个辅助谓词,它接受一个列表并将其乘以一个标量:

multListElem([], _, _).
multListElem([H|T], Result, Elem) :- 
    multListElem(T, W, Elem),
    Z is H*Elem,
    Result = [Z|W].
Run Code Online (Sandbox Code Playgroud)

但现在,当我跑步时,?- multListElem([1,2,3], X, 3). 我得到:

1 ?- multListElem([1,2,3], X, 3).
X = [3, 6, 9|_G1840].
Run Code Online (Sandbox Code Playgroud)

那怪异的尾巴是_G1840什么?

joe*_*l76 5

错误在这里:multListElem([],_,_).当第一个列表为空时,结果为空,因此您必须写入multListElem([],[],_).

当您使用列表时,您可以使用功能成语像 MAPLIST:

multLists(L1, L2, R) :-
    maplist(mult_one_list(L1), L2, R).

mult_one_list(L1, Elem, R) :-
    maplist(mult_2_numbers(Elem), L1, R).

mult_2_numbers(V1, V2, R) :-
    R is V1 * V2.
Run Code Online (Sandbox Code Playgroud)

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