0

私はPrologを学んでいて、違いのリストは私にとって非常に新しく、地獄のように見えます。特に、私は間違いなく貧弱な単純なC++の人です:)私は自分のタスクに問題があります:

addall(-E、+ G、+ S、-R)は、目標G(変数Eが発生する)を満たす変数Eの置換のすべての結果をコレクションSに追加し、新しいコレクションRを返します(この述語は次のようになります)。標準述語findall=3およびfindall=4)。

私はこれをLIFOコレクションで問題なく実装しましたが、FIFOに問題があります。次の使用法を検討してください。

lifo_empty(L), lifo_addall(X,number(odd,X), L, W).

大丈夫です、コレクションWは[8,6,4,2,0]ですが:

fifo_empty(Q), fifo_addall(X, podstaw(c,X), Q, W).

私に与えますW = [9, 7, 5, 3|[1|_G3761]-_G3761]。私が欲しいのはです[9,7,5,3,1|_G3761]-_G3761。何が悪いのか、特に次のことがわかりません。

?- fifo_empty(Q), fifo_put(a,Q,W), fifo_put(b,W,C).
C = [a, b|_G3922]-_G3922.

うまく動作します。私のコード:

fifo_empty(X-X).
todiff(X, [X|Xs]-Xs).
fifo_put(E, X-[E|Xs], X-Xs).
fifo_get([E|X]-Xs, X-Xs, E).

fifo_append([],S,S).
fifo_append([H|T],S,W) :- fifo_put(H,S,NS), lifo_append(T,NS,W).

fifo_addall(E, Goal, S, R) :- findall(E,Goal, W), fifo_append(W,S,R).

前もって感謝します。

4

1 に答える 1

2

lifo_append/3これは、ラインの最後のゴールとしてコールしているために発生している可能性があります。

fifo_append([H|T],S,W) :- fifo_put(H,S,NS), lifo_append(T,NS,W).

...代わりにfifo_append/3?最後のサブゴール呼び出しを に変更してみてくださいfifo_append/3。次の事実を使用して、この変更でコードをテストします。

person(joe).
person(mary).

与えます:

?- fifo_empty(Q), fifo_addall(X, person(X), Q, W).
Q = [joe, mary|_G677]-[joe, mary|_G677],
W = [joe, mary|_G677]-_G677.

...どこでW、あなたが説明したパターンにバインドします。

于 2011-04-15T04:19:50.177 に答える