プロローグ、リスト、再帰全体をよりよく理解するために、私は自分に割り当てたさまざまな単純なタスクを実行しています。特に、リストからdoubleエントリを削除しています。
ルールを定義しました:
is_on(Item, [Ah|At]) :- Ah = Item; is_on(Item, At).
これは、「アイテム」がリストXにあるかどうかをチェックします。したがって、これを拡張してfilter_double述語も定義できると思いました。
filter_doubles([Ah|At], Result) :-
(not(is_on(Ah, At)) ->
Result = [Ah|Result]
;
filter_doubles(At, Result)
).
これは私にとって完全に理にかなっています。リストの残りの部分(テール)でAhが発生しない場合は、リストの作成を使用して結果の先頭にaを追加します。それ以外の場合は、リストの残りの部分を繰り返します。どうやらPrologはそうではないと考えています:
47 ?- filter_doubles([1,2,3,3,4,2,1,1], Z).
Z = [3|**].
私はこれについてあまりにも必須だと思っていますか?