繁体   English   中英

在prolog中将两个列表相乘

[英]Multiplying two lists in prolog

我目前正在与prolog合作,并希望以证书方式将两个列表相乘。 例如:

[1,2,3] and [4,5,6] are my two lists.

我想要执行以下操作:

(1*4)+(2*5)+(3*6) = 32

这样每个列表的第一个元素相互相乘,然后加上第二个元素相乘等。

这有可能进入Prolog吗?

我知道在其他语言中你可以做一个递归函数,带有列表的头部和尾部(其余的条目)。 这允许简单的乘法,但我不认为这是可能的prolog?

使用内置插件:

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).

如果列表中的所有项都是整数,并且Prolog实现提供了 ,则只需使用clpfd内置谓词scalar_product/4 ,如下所示:

?- scalar_product([1,2,3],[4,5,6],#=,Product).
Product = 32.

编辑:您可能也对相关问题“ Prolog:乘以2个列表,其中1个没有实例化? ”感兴趣,特别是在这个答案中

作为'手动编码'循环的替代,使用库( 聚合 )和nth1 / 3:

sum_prod(A,B,S) :-
    aggregate(sum(M), I^X^Y^(nth1(I,A,X), nth1(I,B,Y), M is X*Y), S).

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM