繁体   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