2014-03-05 251 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).