2012-03-26 5 views
4

J'ai trouvé un code qui multiplie les matrices.multiplication matricielle dans 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). 

Si je tape: mult([[1,2],[3,4]],[[5,6],[7,8]],X). puis-je obtenir X = [[19, 22], [43, 50]].

Mais comment je peux obtenir un X = [[1*5+2*7, 1*6+2*8], [3*5+4*7, 3*6+4*8]] .

post-scriptum Je suis nouveau à prolog. Merci!

Répondre

6

C'est simple: au lieu d'évaluer les expressions arithmétiques avec is/2, il suffit de les laisser non évaluées et d'utiliser les termes composés au lieu de leurs valeurs numériques. Je le fais pour le produit/3: Au lieu de

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

J'écris:

product(N1, N2, N1*N2). 

Il vous suffit d'écrire une version correspondante de ListeSommes/2.

+0

comment dois-je changer sumlist/2? –

+0

Par analogie au changement que je vous ai montré: Prenez sumlist/2, et au lieu d'évaluer l'expression arithmétique avec is/2, représentez la somme elle-même comme un terme (cette fois en utilisant le foncteur + au lieu de *). – mat

+0

pouvez-vous montrer? Je ne comprends pas ... –

Questions connexes