1

私は Prolog を初めて使用し、一度に 2 つのリストから要素を取得してベクトルを作成する補助関数を作成しようとして行き詰まりました。例えば:

L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L). L = [0,1,3,0,0,0,0,0] .

そのようにする必要がありますが、私はこれを取得しています:

?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L).
L = [0, 0, 0, 0, 0, 0, 0, 0] .

私のコードは次のとおりです。

 replace([_|T], 0, X, [X|T]).
 replace([H|T], I, X, [H|R]):- I > 0, I1 is I-1, replace(T, I1, X, R).

 v_form([],R).
 v_form([X,Y|Z],R) :- replace(R,X,Y,K), v_form(Z,K).

私はこれを見つけました「Aはあなたのルールの本体の何とも統一されていません。Prologが機能する方法は、用語の統一によるものです。手続き型言語のようにAを「返す」ことはできません」ので、私の述語でRを推測しています統一されていませんが、その場合、変更すると目的の値が得られる理由がわかり v_form([],R). ませ v_form([],R).:- write(R). ん。

 ?- L=[0,0,0,0,0,0,0,0], v_form([2,3,1,1],L).
 [0,1,3,0,0,0,0,0]
 L = [0, 0, 0, 0, 0, 0, 0, 0]

それで、私がRを統合していないことが本当なら、なぜwrtie(R)はエラー/例外/印刷をスローしないのですか[] /統合されていない、またはそれらの行の中で何かを教えてください、代わりに述語に返してほしいRを書きます.

4

1 に答える 1