List 在Prolog中按组件将两个列表相乘

List 在Prolog中按组件将两个列表相乘,list,recursion,prolog,multiplication,List,Recursion,Prolog,Multiplication,我想在Prolog中创建一个函数,将两个列表按组件方式相乘,并返回结果列表 例如: ?- multiply_lists([1,2,3], [4,5,6], X). X = [4,10,18]. 我想在不使用内置Prolog函数的情况下编写此函数。首先定义基本情况-将两个空列表相乘的结果就是空列表 multl([],[],[]). 然后,定义函数的递归部分: multl([H1|Tail1],[H2|Tail2], [H3|Tail3]):- multl(Tail1, Tail

我想在Prolog中创建一个函数,将两个列表按组件方式相乘,并返回结果列表

例如:

?- multiply_lists([1,2,3], [4,5,6], X).
X = [4,10,18].

我想在不使用内置Prolog函数的情况下编写此函数。

首先定义基本情况-将两个空列表相乘的结果就是空列表

multl([],[],[]).
然后,定义函数的递归部分:

multl([H1|Tail1],[H2|Tail2], [H3|Tail3]):-
        multl(Tail1, Tail2, Tail3),
        H3 is (H1 * H2).
这里发生的事情是,两个列表头部的元素相乘,并与结果的尾部连接在一起

总而言之,我们有:

multl([],[],[]).
multl([H1|Tail1],[H2|Tail2], [H3|Tail3]):-
    multl(Tail1, Tail2, Tail3),
    H3 is (H1 * H2).
有趣的是

:- use_module(library(clpfd)).

mutiply(X,Y,Z) :-
    Z #= X*Y.

multiply_lists(L1, L2, Out) :-
    maplist(mutiply, L1,L2,Out).
结果如下:

?-  multiply_lists([1,2,3], [4,5,6], X).
X = [4, 10, 18].

?- multiply_lists(X, [4,5,6], [4,8,10]).
false.

?- multiply_lists(X, [4,5,6], [4,10,18]).
X = [1, 2, 3].

?- multiply_lists(X, Y, [4,10,18]).
X = [_17366, _17372, _17378],
Y = [_17396, _17402, _17408],
_17366 in -4.. -1\/1..4,
_17366*_17396#=4,
_17396 in -4.. -1\/1..4,
_17372 in -10.. -1\/1..10,
_17372*_17402#=10,
_17402 in -10.. -1\/1..10,
_17378 in -18.. -1\/1..18,
_17378*_17408#=18,
_17408 in -18.. -1\/1..18.

这很有趣,但我需要从头开始编写函数,而不使用任何库函数。