- ベストアンサー
prologリスト処理
prologやり始めたんですけどリストのところで分からないところがあります。 リストAからリストBを取り除いたリストCを作り出す定義は? A[a,b,b,c]-B[a,b,c]⇒C[b] という問題なんですが、どうすれば出せるのでしょうか?取り除こうとすると重複しているbすべてを取り除いてしまい答えが出せません。 ご教授お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
本当にそれが「現在のプログラム」ですか? それだと, 「重複している b を全て取り除いてしまう」という動作にはならないと思うんだけど. だいたい, パターンマッチングに失敗するはずだし. で本題に入るけど, 本当はきちんとプログラムを作るためにはもっといろんな条件を付ける必要があります. 面倒なので「最も単純」バージョンだけ考え方を書いてみましょう: ・空リストから何を取り除いても空リストです. ・2つのリストの先頭要素が一致していれば, 残りの要素同士だけを考えれば OK. ・先頭要素が一致していない場合には, 一旦リスト1 の最初の要素を除いた部分リストからリスト2 を取り除いたリストを作り, それに「リスト1 の最初の要素」を先頭に追加する. これで示された例*だけ*は動作するはずです. あとは, 例えば「[a, b, b, c] と [a, c, b] からも [b] にしたい」とかあればもっと考えることになります.
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
う~ん, 普通に書けば「重複した b を全部取り除く」ことにはならないと思うんだけど.... よろしければ, 現在どのようなプログラムになっているか出してもらえますか?
補足
これが現在のプログラムです。 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] が出来ると書いてあったので使ったんですがこれでは、出来ませんでした。
お礼
考え方どうりにやったら出来ました。本当にありがとうございます。