我需要添加两个矩阵,这是我试过的SWI prolog代码。但 答案在这里是错误的。我想纠正它。
:- 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]].
答案 0 :(得分:2)
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)它是一个功能强大的图书馆,但如果不需要它的实际功能,最好坚持本机算法......