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]] .

PS私はプロローグが初めてです。ありがとう!

4

1 に答える 1

7

これは簡単です: is/2 で算術式を評価する代わりに、単純にそれらを未評価のままにして、数値の代わりに複合項を使用します。私は製品/3のためにそれを行います:代わりに

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

私は書きます:

product(N1, N2, N1*N2).

sumlist/2 の対応するバージョンを書くだけで済みます。

于 2012-03-26T11:46:05.903 に答える