matrix - 在 SWI prolog 中添加两个矩阵

标签 matrix prolog

我需要将两个矩阵相加,这是我尝试过的 SWI 序言代码。但 这里的答案是错误的。我希望得到纠正。

:- use_module(library(clpfd)).

m_add(M1, M2, M3) :- maplist(mm_helper(M2), M1, M3).

mm_helper(M2, I1, M3) :- maplist(dot(I1), M2, M3).

dot(V1, V2, P) :- maplist(sum,V1,V2,P).

sum(N1,N2,N3) :- N3 is N1+N2.

当提出如下问题时,

?- m_add([[2,1,3],[4,2,5]],[[4,0,1],[1,7,1]],R).

答案如下所示。

R = [[[6, 1, 4], [3, 8, 4]], [[8, 2, 6], [5, 9, 6]]].

但答案应该是,

R = [[6, 1, 4],[5, 9, 6]].

最佳答案

实际上,它比你想象的要简单:

m_add(M1, M2, M3) :- maplist(maplist(sum), M1, M2, M3).
sum(X,Y,Z) :- Z is X+Y.

测试:

?- m_add([[2,1,3],[4,2,5]],[[4,0,1],[1,7,1]],R).
R = [[6, 1, 4], [5, 9, 6]].

如果您正在处理整数,plus/3可以很方便,因为它可以计算“向后”:

m_plus(M1, M2, M3) :- maplist(maplist(plus), M1, M2, M3).

?- m_plus([[2,1,3],[4,2,5]],[[4,0,1],[1,7,1]],R).
R = [[6, 1, 4], [5, 9, 6]].

?- m_plus([[2,1,3],[4,2,5]],B,$R).
B = [[4, 0, 1], [1, 7, 1]].

$R 这是一个 SWI-Prolog 的“技巧”来记住顶级变量...

最后一点:CLP(FD) 它是一个强大的库,但如果不需要它的实际功能,最好坚持使用 native 算术...

关于matrix - 在 SWI prolog 中添加两个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25358159/

相关文章:

两个矩阵之间的行相关性

python - 在python中用范围随机数初始化矩阵

java - 如何使用java中的colt库求解线性方程组

prolog - Prolog中@<和<之间的算术差异

prolog - 如何在递归Prolog中将数据插入列表中

java - 如何从 Java 使用 Prolog?

c - 矩阵访问 Ansi C

r - 在 R 中创建一个双模式频率矩阵

lambda - 如何返回到一个点的最小距离?

prolog - 袋子只给出一件元素,通过多件元素适合