• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プロローグ(=Prolog)について質問です。)

プロローグ(=Prolog)について質問です。

このQ&Aのポイント
  • SWI-Prologのplwin Version5.2.13でプログラムを組む際に、atomの重複を削除するプログラムを作成したいです。
  • 既存のプログラムでは順番が逆になってしまうため、reverse()を使わずに実現したいです。
  • 必要な関数はすでに作成されているため、それらを活用しながら解決策を探しています。お助けください。

質問者が選んだベストアンサー

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.2

先頭から調べていって、すでに見つけたもののリストがA,現在調べているものがHに入っているようですね。 HがAに含まれない場合は、  dupacc([H|T], A, L) :- dupacc(T, [H|A], L). の行でリストに追加されますが、[H|A]によってリストの先頭に追加されます。 そこで、この行を、  dupacc([H|T], A, L) :- dupacc(T,Appended,L),append(H,A,Appended). に変更すれば、リストの後ろに現在チェック中のアイテムが追加されるはずなので、うまく動作するように思います。 ただし、appendという関数(定義)は  append(Item,Orig,Appended)  Item:追加するアイテム  Orig:もとのリスト  Apended:アイテムを末尾に追加されたリスト と定義されているとして回答しました。 (動作確認はしていません)

参考URL:
http://bach.istc.kobe-u.ac.jp/prolog/intro/list.html
ginkgo
質問者

お礼

自己解決しました。 remdup(L, M) :- dupacc(L, [], M). dupacc([], A, A). dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). dupacc([H|T], A, L) :- append(A, [H], X), dupacc(T, X, L). これで仕様どおりに動作します。 wolvさんのコードも実行してみましたがエラーが出たようです。 1 ?- remdup([a, b, c, a, d, c], X). ERROR: Out of global stack Exception: (13) dupacc([c], [b, c, a, d|_G78], _G31) ? なにはともあれ、助かりました。ありがとうございました。

その他の回答 (1)

  • wolv
  • ベストアンサー率37% (376/1001)
回答No.1

ウェブで検索すると、同じ問題と思われるものが、  : dupacc([H | T], A, L) :- member(H, A), !, dupacc(T, A, L).  : と、「!,」ありで記述されてました。 #関係なかったらごめんなさい。

参考URL:
www.google.co.jp
ginkgo
質問者

お礼

そのサイト見つけました。 私の本には「!,」はないのですが出所は同じものようですね。 実行してみましたが残念ながら変化はありませんでした。 ありがとうございました。

関連するQ&A