簡體   English   中英

Prolog-將列表與列表列表相乘

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM