私はPrologを初めて使用するので、以下の例に示すように、リストから重複を削除する必要があります。
?- remove([a,a,b,c,a,a,b,c,b,a,a],X).
X = [a,b,c,a,b,c,b,a]
私はPrologを初めて使用するので、以下の例に示すように、リストから重複を削除する必要があります。
?- remove([a,a,b,c,a,a,b,c,b,a,a],X).
X = [a,b,c,a,b,c,b,a]
私の理解が正しければ、隣接する重複を削除する必要があります。最初の隣接要素をスキップして要素をコピーするだけです。コードを完成させます...
remove([X,X|Rest], [X|Rest1]) :-
!, % this commit avoid the logical alternative you'll code below
.... % recurse to get Rest1 from Rest
remove([X|Rest], [X|Rest1]) :-
% recurse to get Rest1 from Rest
% remember the base case !!
false が指摘したように編集します。そのような素朴な remove/2 はバグがあります。remove/3 述語の追加を修正しました。これは、要素の先読みを使用してコピーを監視します。
remove([X|Xs], [X|Ys]) :-
remove(X, Xs, Ys).
remove(X, [X|Xs], Ys) :-
!, % discard the duplicate
... % recurse to get Ys from Xs, with same witness
remove(_, [X|Xs], [X|Ys]) :-
... % the cut above ensure that here we must change witness when recursing
% as always, remember the base case !!