• ベストアンサー

prologリスト処理

prologやり始めたんですけどリストのところで分からないところがあります。 リストAからリストBを取り除いたリストCを作り出す定義は? A[a,b,b,c]-B[a,b,c]⇒C[b] という問題なんですが、どうすれば出せるのでしょうか?取り除こうとすると重複しているbすべてを取り除いてしまい答えが出せません。 ご教授お願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

本当にそれが「現在のプログラム」ですか? それだと, 「重複している b を全て取り除いてしまう」という動作にはならないと思うんだけど. だいたい, パターンマッチングに失敗するはずだし. で本題に入るけど, 本当はきちんとプログラムを作るためにはもっといろんな条件を付ける必要があります. 面倒なので「最も単純」バージョンだけ考え方を書いてみましょう: ・空リストから何を取り除いても空リストです. ・2つのリストの先頭要素が一致していれば, 残りの要素同士だけを考えれば OK. ・先頭要素が一致していない場合には, 一旦リスト1 の最初の要素を除いた部分リストからリスト2 を取り除いたリストを作り, それに「リスト1 の最初の要素」を先頭に追加する. これで示された例*だけ*は動作するはずです. あとは, 例えば「[a, b, b, c] と [a, c, b] からも [b] にしたい」とかあればもっと考えることになります.

hokuri22
質問者

お礼

考え方どうりにやったら出来ました。本当にありがとうございます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

う~ん, 普通に書けば「重複した b を全部取り除く」ことにはならないと思うんだけど.... よろしければ, 現在どのようなプログラムになっているか出してもらえますか?

hokuri22
質問者

補足

これが現在のプログラムです。 append([],X,X). append([W|X],Y,[W|Z]):-append(X,Y,Z). 本を見てたら、処理の両方向性というのがあり ?-append(X,[d,e],[a,b,c,d,e]). X=[a,b,c] が出来ると書いてあったので使ったんですがこれでは、出来ませんでした。

関連するQ&A