在SWI prolog中添加两个矩阵

时间:2014-08-18 07:24:03

标签: matrix prolog

我需要添加两个矩阵,这是我试过的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]].

1 个答案:

答案 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)它是一个功能强大的图书馆,但如果不需要它的实际功能,最好坚持本机算法......