• ベストアンサー

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

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

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

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

直接的な答えは書きません。 ・リストLの先頭の2つの要素がX, Yと一致するならば真。 ・リストLの先頭の要素を取り除いたリストをZとすると、nextto(X, Y, Z)の結果がnextto(X, Y, L)の結果。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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)). を使うところまではわかっているのですが先に進みません。

  • 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リスト処理

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

  • Prologの単一化について

    (1)p([X|Y]) と p([a]) (2)p(a, [b, c], X)  と p(Y1, [Y2|Y3], Y3) (3)?-p([a, b, c], X). p([X|Y], N) :- p(Y, N1), N is N1+1 . (4)?-p([a, b, c], [d, e], X) . p([X|A], B, [X|C]) :- p(A, B, C). (5)?-p([a, b, c], [], X). p([X|R], Y, Z) :- p(R, [X|Y], Z) の述語についてですが、それぞれ単一化すると各変数はどうなるでしょうか。 (3)~(5)については、質問と規則の頭部との単一化です。 どの変数も単一化の前に値を持っていないとします。 教えてください。

  • prologについて

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

  • prologについての質問です。

    課題で、リストXのなかにある要素 Yの個数を数える述語  allcount(X,Y,N)を定義しなさい。 というものが出ましたが、参考になるような本も、webページも見つけられませんでした。 どういったように定義すればよいでしょうか? ?- allcount([1,2,[1,2],1], 1, N). の答えが N=3 となればよいらしいです。

  • 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)について質問です。

    プロローグについて質問です。 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:リストに関する質問

    prefix(L1, L2):L1がL2のサブリストかどうか調べる述語を作ってるんですがサブリストに含まれているものしか判定できないまま悩み続けています。含まれていないものを入力すると無限ループに入ります。compoundを使ってみてもRedoでその行だけで無限ループに入ります。。。 なにか打開策はないでしょうか? /*---------------------無限ループ------------------------*/ [debug] ?- trace, prefix([c], [a, b, c]). Call: (8) prefix([c], [a, b, c]) ? creep Call: (9) prefix([c], [b, c]) ? creep Call: (10) prefix([c], [c]) ? creep Exit: (10) prefix([c], [c]) ? creep Exit: (9) prefix([c], [b, c]) ? creep Exit: (8) prefix([c], [a, b, c]) ? creep Yes [debug] ?- | . ERROR: Stream user_input:0:30 Syntax error: Unexpected end of clause [debug] ?- trace, prefix([g], [a, b, c]). Call: (8) prefix([g], [a, b, c]) ? creep Call: (9) prefix([g], [b, c]) ? creep Call: (10) prefix([g], [c]) ? creep Call: (11) prefix([g], []) ? creep Call: (12) prefix([g], []) ? creep Call: (13) prefix([g], []) ? creep Call: (14) prefix([g], []) ? creep Call: (15) prefix([g], []) ? creep Call: (16) prefix([g], []) ? creep Call: (17) prefix([g], []) ? /*-----------------Redo-----------------*/ ?- trace, prefix([g], [a, b, c]). Call: (9) prefix([g], [a, b, c]) ? cree Call: (10) compound([b, c]) ? creep Exit: (10) compound([b, c]) ? creep Call: (10) prefix([g], [b, c]) ? creep Call: (11) compound([c]) ? creep Exit: (11) compound([c]) ? creep Call: (11) prefix([g], [c]) ? creep Call: (12) compound([]) ? creep Fail: (12) compound([]) ? creep Redo: (11) prefix([g], [c]) ? creep Call: (12) prefix([g], [c]) ? creep Call: (13) compound([]) ? creep Fail: (13) compound([]) ? creep Redo: (12) prefix([g], [c]) ? creep Call: (13) prefix([g], [c]) ? creep Call: (14) compound([]) ? creep Fail: (14) compound([]) ? creep Redo: (13) prefix([g], [c]) ? creep Call: (14) prefix([g], [c]) ? creep Call: (15) compound([]) ? creep Fail: (15) compound([]) ? creep Redo: (14) prefix([g], [c]) ? creep Call: (15) prefix([g], [c]) ? creep Call: (16) compound([]) ? creep Fail: (16) compound([]) ? creep /*-------------ソース----------------*/ prefix([], _). prefix([X], [X|_]). prefix([X], [_|Y1]) :- prefix([X], Y1). prefix([X|Y], Y1) :- prefix([X], Y1), prefix(Y, Y1). /*-------------compound---------------*/ prefix([], _). prefix([X], [X|_]). prefix([X], [_|Y1]) :- compound(Y1), prefix([X], Y1). prefix([X|Y], Y1) :- prefix([X], Y1), prefix(Y, Y1).