1

これらの2つの述語を使用して、行列とベクトルの積をシミュレートしようとしています。

eva([], [], []).
eva([A|A1], [W], [Res|R1]) :-
    vectormultiplication(A, W, Res),
    eva(A1, W, R1).

vectormultiplication([A], [W], [A*W]).
vectormultiplication([A|A1], [W|W1], [A*W|Out1]) :-
    vectormultiplication(A1, W1, Out1).

ここで、[A|A1]in evaは行列(またはリストのリスト)で[W]あり、はベクトル(リスト)であり[Res|R1]、結果の積です。vectormultiplicationリスト内の各リストにベクトルを掛けることになっていWます。ただし、この戦略は誤った応答を生成するだけです。私がここで間違っていることが、目的の製品を手に入れるのを妨げていることは明らかですか?私は現在SWIPrologバージョン5.10を使用しています

4

2 に答える 2

2

さて、あなたの最初の問題は、あなたがA*Wそれ自体で何かをするつもりだと思うことです。Prologでは、それは式を作成するだけでありA*W、関係なく、*(A,W)または-foo(A, W)なしis/2で、実際の算術削減は行われません。それが私が一目で見る唯一の本当の問題です。

于 2013-02-11T23:56:32.730 に答える
2

ダニエル(+1)によって証明された他の2つの問題があります:ここではクリーンアップされたソース

eva([], _, []).  % here [] was wrong
eva([A|A1], W, [Res|R1]) :- % here [W] was wrong
    vectormultiplication(A, W, Res),
    eva(A1, W, R1).

vectormultiplication([A], [W], [M]) :-
    M is A*W.
vectormultiplication([A|A1], [W|W1], [M|Out1]) :-
    M is A*W,
    vectormultiplication(A1, W1, Out1).

テスト:

?- eva([[1,2],[3,5]],[5,6],R).
R = [[5, 12], [15, 30]]

リストを処理するときは、可能な場合はマップリストを使用する価値があります

eva(A, W, R) :-
    maplist(vectormultiplication1(W), A, R).

vectormultiplication1(W, A, M) :-
    maplist(mult, A, W, M).

mult(A, W, M) :-
    M is A*W.

ベクトルはそのループ内で「定数」であり、maplistは引数を「展開」するように追加するため、vectormultiplication1の引数の順序を変更したことに注意してください。

于 2013-02-12T00:54:25.393 に答える