1. ホーム
  2. prolog

[解決済み] SWI-Prologでリストから重複を削除する方法は?

2022-02-17 19:42:02

質問内容

述語を書く必要があります remove_duplicates/2 は、与えられたリストから重複する要素を削除します。例えば

?- remove_duplicates([a,a,b,c,c], List). List = [a,b,c] Yes

SWI-Prologを学んで2日目、Prologの基本しか理解していないことをご留意ください。これは、私が今持っているものです。

remove_duplicates([H | T], List) :- member(H, T), append(T, [], List1).

これはリストに対して機能します。 [a,a,b,c] が、末尾の2つの要素が同じであるリストには適用されません。どうにかして、一時的なリストにHeadを削除し、新しいHeadを作成し、ただ述語を繰り返さなければならないと考えました。どうすればいいのか全くわかりません。また、HeadがTailにない場合、例えば次のようなリストでは [a,b,b,c] と表示されるだけで、端末は False というのも member(H, T) は真ではありません。

何か思い当たることはありますか?

解決方法は?

重複を除去するためのシンプルで素晴らしいコードは、以下の通りです。

remove_duplicates([], []).

remove_duplicates([Head | Tail], Result) :-
    member(Head, Tail), !,
    remove_duplicates(Tail, Result).

remove_duplicates([Head | Tail], [Head | Result]) :-
    remove_duplicates(Tail, Result).


で説明したように Prolog入門(ウルレ・エンドリス著