在Prolog中进行矩阵乘法

4
我找到了一个可以对矩阵进行乘法运算的代码。
% SWI-Prolog has transpose/2 in its clpfd library
:- use_module(library(clpfd)).

% N is the dot product of lists V1 and V2.
dot(V1, V2, N) :- maplist(product,V1,V2,P), sumlist(P,N).
product(N1,N2,N3) :- N3 is N1*N2.

% Matrix multiplication with matrices represented
% as lists of lists. M3 is the product of M1 and M2
mmult(M1, M2, M3) :- transpose(M2,MT), maplist(mm_helper(MT), M1, M3).
mm_helper(M2, I1, M3) :- maplist(dot(I1), M2, M3).

如果我输入:mult([[1,2],[3,4]],[[5,6],[7,8]],X). 我会得到X = [[19, 22], [43, 50]]. 但是我该怎样得到X = [[1*5+2*7, 1*6+2*8], [3*5+4*7, 3*6+4*8]] . 附:我是Prolog新手。谢谢!
1个回答

7
这很简单:不要用is/2评估算术表达式,而是让它们保持未评估状态,并使用复合术语而不是它们的数值。我对product/3这样做:不是使用类似于X is Y*Z的语句,而是使用类似于product(X,Y,Z)的复合术语。
product(N1,N2,N3) :- N3 is N1*N2.

我会翻译:

product(N1, N2, N1*N2).

您只需要编写一个相应的sumlist/2版本即可。


我应该如何更改sumlist/2? - user721588
类比我给你展示的变化:取sumlist/2,而不是使用is/2评估算术表达式,将和本身表示为一个项(这次使用+作为函数符号)。 - mat
只需编写您自己的 sumlist 版本,但使用 = 而不是 is - Nick Barnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接