2014-03-05 194 views
2

我目前正在使用prolog,并希望将两个列表相乘,但采用certian方式。例如:在序言中乘以两个列表

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

欲瓶坯以下操作:

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

,使得每个列表的第一个元素乘以彼此然后与第二元素的加入相乘等等

这是可能进入Prolog吗?

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

+2

您是否阅读过任何prolog教程或书籍?为什么你会认为递归列表处理在prolog中可能不可行?这是一个非常常见的操作。 – lurker

回答

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

我一直在阅读很多答案Lurker,真的帮助我学习Prolog,谢谢 – user3667111

0

作为替代 '手工编码' 回路,使用库(aggregate)和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).