我目前正在与prolog合作,并希望将两个列表相加,但是以证书方式。例如:
[1,2,3] and [4,5,6] are my two lists.
我想要执行以下操作:
(1*4)+(2*5)+(3*6) = 32
这样每个列表的第一个元素相互相乘,然后加上第二个元素相乘等。
这可以进入Prolog吗?
我知道在其他语言中你可以使用列表的头部和尾部(其余条目)来执行递归函数。这允许简单的乘法,但我不认为这是可能的prolog?
答案 0 :(得分:6)
使用内置插件:
mult(X, Y, Z) :- Z is X * Y.
sum_prod(A, B, SumProd) :-
maplist(mult, A, B, Prods),
sumlist(Prods, SumProd). % In GNU Prolog this is sum_list
使用简单的递归:
sum_prod([A|As], [B|Bs], SumProd) :-
sum_prod(As, Bs, SP),
SumProd is SP + A*B.
sum_prod([], [], 0).
使用尾递归:
sum_prod(A, B, SumProd) :-
sum_prod(A, B, 0, SumProd).
sum_prod([A|As], [B|Bs], Acc, SumProd) :-
Acc1 is Acc + A*B,
sum_prod(As, Bs, Acc1, SumProd).
sum_prod([], [], Acc, Acc).
答案 1 :(得分:2)
如果列表中的所有项目都是整数,而Prolog实现提供clpfd,则只需使用
clpfd内置谓词scalar_product/4
,如下所示:
?- scalar_product([1,2,3],[4,5,6],#=,Product).
Product = 32.
修改强> 您可能还对相关问题“Prolog: Multiplying 2 lists with 1 of them not instantiated?”感兴趣,尤其是this answer。
答案 2 :(得分:0)