私は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).
前もって感謝します。