• ベストアンサー

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

  • Prologについて教えてください!

    リストLにおいて二つの項XとYがこの順番に隣接しているとき真となる関係nextto(X,Y,L)を定義しなさい。 ?-nextto(a,b,[a,b,c]). true ?-nextto(a,c,[a,b,c]). この問題の答えを教えてください。

  • prologのプログラムについて

    ?- ss([3,4,1,2,5],[1,2],X) X=[3,4,5] ?- ss([car(X,Y),car(Z,W)],[car(a,b),car(c,d),train(a),car(e,g)],List) List=[train(a),car(e,f)] List=[car(c,d),train(a)] List=[car(a,b),train(a)] ?- ss(X,[1,2],[3,4]) X=[1,2,3,4] となるようなprologのプログラムをつくりたいです。 丸一日、試行錯誤したのですが、結果どおりに動いてくれません。 分かる方がいらっしゃいましたら、教えていただけませんでしょうか。

  • question about Prolog

     Prologについて質問があります。  私は今Prologで簡易和英・英和翻訳機をつくろうとしているのですが、途中でつまづいています。  以下のようなPrologリストを読み込んで、``in rooms''を日本語に直そうとして    :-prep_phrase([in,rooms], [], B, []). と入力すると、    B = [heya,no,naka,no] と正しい答が返ってきますが、逆に``heya no naka no''を英語に直そうと    :-prep_phrase(A, [], [heya,no,naka,no], []). と入力しても、無限ループに陥ってしまうようでエラーメッセージとして    ``stack overflow'' が返ってきます。  トレースしてみたところ、noun_phrase と prep_phrase が交互に次々と呼ばれていました。  どうしてこのようなことが起こるのでしょうか(英->和はできているのに)。また、これを回避する方法はあるのでしょうか。 %% プログラムリストここから %% 英語の「名詞+前置詞節」を日本語の「前置詞節+名詞」に %% 翻訳する %% ex. in rooms -> heya no naka no %% 名詞節 noun_phrase(A, C, X, Z):-noun(A, B, Y, Z), prep_phrase(B, C, X, Y). %% 前置詞節 prep_phrase(A, C, X, Z):-prep(A, B, Y, [no|Z]), noun_phrase(B, C, X, [no|Y]). prep_phrase(A, A, X, X). %% 前置詞 prep([in|A], A, [naka|X], X). %% 名詞 noun([rooms|A], A, [heya|X], X). %% プログラムリストここまで

  • prologについて

    第2引数で与えられたリストに、第1引数の要素を挿入(位置はどこでも良い)したリストが、第3引数になるようなプログラムを教えてください。 以下のように動作すればいいです。 ?-insert(p,[a,b,c],L). [[Enter]] L = [p, a, b, c] ; [[Enter]] L = [a, p, b, c] ; [[Enter]]

  • Prologについて

    リストの末尾への要素に追加するプログラムを教えてください。 第2引数のリストの末尾へ、第1引数が加えられたリストが第3引数として得られるようなプログラムで、次のように動作すればいいです。 ?-add_last(e,[a,b,c,d],L). [[Enter]] L = [a, b, c, d, e] ; [[Enter]] No ?-add_last(X,L,[a,b,c,d,e]). [[Enter]] X = e L = [a, b, c, d] ; [[Enter]]

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

    プロローグについて質問です。 SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という プログラムを作りたいのですが…できません。 動作は remdup([a, b, c, a, d, c], X). は X=[a, b, c, d] となるはずです。 本に載っていたのを試したのですが 順番が逆になってしまいます。↓ 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) :- dupacc(T, [H|A], L). 結果: 1 ?- remdup([a, b, c, a, d, c], X). X = [d, c, b, a] reverse()を「使わずに」どうにか完成させたいのですが できますでしょうか? ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 ですからそれらは使えます。 どうかお助けください。m(__)m

  • prologでの数式の簡単化

    prologで微分をするプログラムを作ったのですが計算した結果が、例えば、 0*x^2+a*(2*x^1*1)+(0*x+b*1)+0 のように無駄に長くなってしまいます。そこでこれを簡単化する述語simple(P)を作りたいのですがどのようにしたら良いでしょうか? ?- simple(0*x^2+a*(2*x^1*1)+(0*x+b*1)+0). 2*a*x+b yes できれば上のような動作がするぐらいのものが作りたいです。 少なくとも余計な0,1を除去するくらいはしたいのですが・・・ お願いします。

  • 別シートデータからの重複のない入力規則リスト作成

    エクセルで、入力規則のリスト作成に関してご教示ください。 別シートにて、以下のようにC列にデータがあります。 データ数は可変です。 A列 B列 C列 No 種別 データ 1 A データA 2 A データA 3 A データA 4 A データB 5 C データC 6 A データB 7 C データB     :     : 上記データを使用して、入力規則で、リスト作成をしたいのです。 =OFFSET(シートA!$A$2,0,0,COUNTA(シートA!$A:$A)-1,1) 上記式を名前定義して、リストに設定した場合には、重複したリスト表示が されてしまします。 名前定義を使ってどう設定すれば、重複をしないリストづくり可能でしょうか。

  • Prologについて教えてください

    A,B,Cを使って直角三角形が成り立ち真となる関係right triangleを定義するプログラムを教えてください。今のところ triangle(A,B,C). vertical(seg(point(X,Y),point(X,Y1)). horizontal(seg(point(X,Y),point(X1,Y)). を使うところまではわかっているのですが先に進みません。

  • リストに含まれないものだけ合計する方法

    説明しやすいように画像を添付しておきます 表1から表2にあるリストに売上げの合計を求めます。 (実際は、表1「県名」は複数で重複があります) なので、D1には「=SUMIF($A$3:$A$14,C3,$B$3:$B$14)」という式を入れています。 今回はリストにない県名の合計を求める式を知りたいのです この場合、岡山と佐賀が表2のリストにありません。 D13セルにどのような式を入れればリスト外の合計を求めることが出来るのでしょうか? どなたかご教授くださいませ。