[英]Prolog-Multiplying a list with a list of lists
我正在嘗試使用這兩個謂詞來模擬矩陣與向量的乘積:
eva([], [], []).
eva([A|A1], [W], [Res|R1]) :-
vectormultiplication(A, W, Res),
eva(A1, W, R1).
vectormultiplication([A], [W], [A*W]).
vectormultiplication([A|A1], [W|W1], [A*W|Out1]) :-
vectormultiplication(A1, W1, Out1).
在eva中的[A|A1]
是矩陣(或列表的列表)的情況下, [W]
是向量(列表), [Res|R1]
是結果乘積。 vectormultiplication
應該將列表中的每個列表與向量W
相乘。 但是,這種策略只會產生錯誤的反應。 有什么跡象表明我在這里做錯了阻止我得到所需的產品嗎? 我目前正在使用SWI Prolog版本5.10
那么,你的第一個問題是你認為A*W
會自己做任何事情。 在Prolog中,這只是創建表達式A*W
,與*(A,W)
或foo(A, W)
沒有區別 - 不涉及is/2
,不會發生實際的算術減少。 這是我在快速瀏覽中看到的唯一真正的問題。
丹尼爾(+1)證明你還有另外兩個問題:這里是一個清理過的來源
eva([], _, []). % here [] was wrong
eva([A|A1], W, [Res|R1]) :- % here [W] was wrong
vectormultiplication(A, W, Res),
eva(A1, W, R1).
vectormultiplication([A], [W], [M]) :-
M is A*W.
vectormultiplication([A|A1], [W|W1], [M|Out1]) :-
M is A*W,
vectormultiplication(A1, W1, Out1).
測試:
?- eva([[1,2],[3,5]],[5,6],R).
R = [[5, 12], [15, 30]]
處理列表時,如果可用的話,使用maplist是值得的
eva(A, W, R) :-
maplist(vectormultiplication1(W), A, R).
vectormultiplication1(W, A, M) :-
maplist(mult, A, W, M).
mult(A, W, M) :-
M is A*W.
注意我改變了vectormultiplication1的參數順序,因為向量在該循環中是一個“常量”,而maplist附加的參數是“展開的”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.