我目前正在使用prolog,並希望將兩個列表相乘,但採用certian方式。例如:在序言中乘以兩個列表
[1,2,3] and [4,5,6] are my two lists.
欲瓶坯以下操作:
(1*4)+(2*5)+(3*6) = 32
,使得每個列表的第一個元素乘以彼此然後與第二元素的加入相乘等等
這是可能進入Prolog嗎?
我知道,在其他語言中,你可以做一個遞歸函數,帶有列表頭和尾部(其餘條目)。這允許一個簡單的乘法,但我不認爲這是可能的序言?
我目前正在使用prolog,並希望將兩個列表相乘,但採用certian方式。例如:在序言中乘以兩個列表
[1,2,3] and [4,5,6] are my two lists.
欲瓶坯以下操作:
(1*4)+(2*5)+(3*6) = 32
,使得每個列表的第一個元素乘以彼此然後與第二元素的加入相乘等等
這是可能進入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).
我一直在閱讀很多答案Lurker,真的幫助我學習Prolog,謝謝 – user3667111
如果你的列表中的所有項目都是整數,你的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。
您是否閱讀過任何prolog教程或書籍?爲什麼你會認爲遞歸列表處理在prolog中可能不可行?這是一個非常常見的操作。 – lurker