1

プロローグにはかなり新しい。私は 2 つのリストを提供し、2 つの違いを返してもらうようにしています。2 番目のリストには、バインドされた変数とバインドされていない変数を含めることができます。これをトレースしてみましたが、最後まで再帰的に実行され、NewL で正しいリストが返されますが、戻る途中で、行ったすべての削除が無効になります。何がうまくいかないのですか?助けてくれてありがとう!

% Find difference between two lists, return result in Difference
difference(List,[H|T],Difference) :-   % When H is unbound var, use Tail
    var(H),!,difference(List,T,Difference),!.

difference(List,[H|T],Difference) :- % When H is bound var, remove from List.
    subtract(List,[H],NewL),
    difference(NewL,T,Difference),!.
4

1 に答える 1

3

Subtract/3 がSWI-Prolog ライブラリから来ており、したがって正しいと仮定すると、可能性が 1 つだけ残されます: 再帰を駆動する 2 番目の引数で基本ケースを宣言するのを忘れています。

また、@mog からのコメントを考慮して、カットは必要な場合にのみ使用する必要があります。もちろん、いつ必要になるかを判断するの難しい場合があります...

于 2012-05-31T08:50:26.643 に答える