1

私はPrologを初めて使用するので、以下の例に示すように、リストから重複を削除する必要があります。

?- remove([a,a,b,c,a,a,b,c,b,a,a],X).
X = [a,b,c,a,b,c,b,a]
4

1 に答える 1

1

私の理解が正しければ、隣接する重複を削除する必要があります。最初の隣接要素をスキップして要素をコピーするだけです。コードを完成させます...

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 !!
于 2012-10-23T22:42:19.407 に答える