2012-03-26 2 views
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]] .

P.S. Я новичок в прологе. Спасибо!

ответ

6

Это легко: вместо оценки арифметических выражений с is/2 просто оставьте их неоценимыми и используйте составные термины вместо их числовых значений. Я делаю это для продукта/3: Вместо

product(N1,N2,N3) :- N3 is N1*N2. 

Я пишу:

product(N1, N2, N1*N2). 

Вам нужно только написать соответствующую версию SumList/2.

+0

Как изменить sumlist/2? –

+0

По аналогии с изменением я показал вам: возьмите sumlist/2, а вместо вычисления арифметического выражения с is/2 представим сумму как член (на этот раз используя функтор + вместо *). – mat

+0

вы можете показать? Я не понимаю ... –

Смежные вопросы