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