1

我正在尝试使用这两个谓词来模拟矩阵与向量的乘积:

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).

其中[A|A1]in eva 是矩阵(或列表列表),[W]是向量(列表),并且[Res|R1]是结果乘积。vectormultiplication应该将列表中的每个列表与向量相乘W。然而,这种策略只会产生错误的反应。有什么明显的地方我做错了,阻止我得到想要的产品吗?我目前正在使用 SWI Prolog 5.10 版

4

2 回答 2

2

嗯,你的第一个问题是你认为自己A*W会做任何事情。在 Prolog 中,这只是创建表达式,与orA*W没有区别,没有涉及,不会发生实际的算术归约。这是我一眼就看到的唯一真正的问题。*(A,W)foo(A, W)is/2

于 2013-02-11T23:56:32.730 回答
2

除了 Daniel (+1) 证明的以外,您还有 2 个其他问题:here a cleaned source

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将参数附加到“展开”。

于 2013-02-12T00:54:25.393 回答