我需要将两个矩阵相加,这是我尝试过的 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/