カットの使い方がよくわかりません。たとえば、この場合: flatten、本当に必要ですか? 両方のカット述語がなくても機能します(削除してみました)。カットにバックトラックが発生する可能性があるのはどのような場合ですか? カットを削除すると、本「The art of prolog」(Shapiro E.、Sterling L.) と同じ実装が得られます。
flatten([X|Xs],Ys) :-
flatten(X,Ysl),
flatten(Xs,Ys2),
append(Ys1,Ys2,Ys).
flatten(X,[X]) :-
constant(X),
X\=[].
flatten([],[]).
これは別の質問につながります.2番目の節でリストではないかどうかを確認する必要がありますか? 単項だと前節と統一しない…ですね。