2012-03-26 22 views
4

Ich fand einen Code, der Matrizen multipliziert.Matrix-Multiplikation in Prolog

% 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). 

Wenn ich tippe: mult([[1,2],[3,4]],[[5,6],[7,8]],X). dann bekomme ich X = [[19, 22], [43, 50]].

Aber wie kann ich ein X = [[1*5+2*7, 1*6+2*8], [3*5+4*7, 3*6+4*8]] .

P. S. bekommen Ich bin neu in Prolog. Danke!

Antwort

6

Das ist einfach: Anstatt die arithmetischen Ausdrücke mit is/2 auszuwerten, lassen Sie sie einfach unbewertet und verwenden Sie die zusammengesetzten Ausdrücke anstelle ihrer numerischen Werte. Ich mache es für das Produkt/3: Statt

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

Ich schreibe:

product(N1, N2, N1*N2). 

Sie nur eine entsprechende Version von Summe/2 schreiben müssen.

+0

wie soll ich sumlist/2 ändern? –

+0

In Analogie zu der Änderung habe ich Ihnen gezeigt: Nehmen Sie sumlist/2, und anstatt den arithmetischen Ausdruck mit is/2 auszuwerten, stellen Sie die Summe selbst als einen Ausdruck dar (diesmal mit dem Funktor + anstelle von *). – mat

+0

kannst du zeigen? Ich verstehe nicht ... –