• ベストアンサー

prologについての質問です。

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

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

  • ベストアンサー
  • chirubou
  • ベストアンサー率37% (189/502)
回答No.1

課題なんですよね? ではサブ課題を。リストの要素数をカウントするのは、 count_list( [], 0 ). count_list( [X|Y], N ) :- N=M+1, count_list( Y, M ). #あれ私の prolog 環境がおかしい…で、テストできませんが、 これに allcount の Y の条件を組み込むのが最初のステップ。これができたら、今度は X の要素がリストの場合、再帰的にその要素に対して同じことをすればいいのではないでしょうか。

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

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

allcount([],_,0). allcount([X|Y],X,V) :- allcount(Y,X,M), V is M + 1. allcount([Z|Y],X,V) :- atomic(Z),allcount(Y,X,V). allcount([Z|Y],X,V) :- allcount(Z,X,M),allcount(Y,X,N), V is M+N.

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

関連するQ&A

  • 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について教えてください!

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

  • prologについて

    emacsというソフトでprologについて勉強しているんですが、 times,plus,exp,mod を定義してから動作の確認をしたいのです。 (<- - (times 0 ?x 0)) (<- (times (s ?x) ?y ?z) (times ?x ?y ?xy) (plus ?xy ?y ?z)) (<- - (exp (s ?n) 0 0)) (<- (exp 0 (s ?x) (s 0))) (<- (exp (s ?n) ?x ?y) (exp ?n ?x ?z) (times ?z ?x ?y)) (<- - (mod ?x ?y ?x) (< ?x ?y)) (<- (mod ?x ?y ?z) (plus ?x1 ?y ?x) (mod ?x1 ?y ?z)) と定義したのですが、確認をするときにどのように確認したらよいのか教えて頂けますでしょうか?

  • mathmaticaについて詳しい方に助けを借りたいです。

    以下の問題の精密解答が欲しいです…。 自分でやっても、エラーばかりで、どこが間違っているのかがよくわからないので、誰か助けてください! 1問だけでも解答が頂けると助かります。 1.0≦x≦n,0≦y≦nの範囲の格子点(x,y)でxが奇数でy<x^2をみたすもの全体のリストg(n)を求める関数gをMathmaticaによって定義せよ。 2.x[0]=0.1,x[n+1]=2.5(1-x[n])x[n]によって数列x[n]を定義する。初期値a(=x[k])からはじめて、|x[n+1]-x[n]|が許容誤差eps未満になるまで繰り返しx[k],x[k+1],...を求め、|x[n+1]-x[n]|<epsを満たす最初のx[n]を求める関数ff(関数適用はff(a,eps))をMathmaticaによって定義せよ。 3.与えられた整数のリストxsに対して、はじめに、負の要素が並び、つぎに3で割った余りが1のxsの要素が並び、最後にそれ以外のxsの要素が並んだリストを返す関数hをMathmaticaによって定義せよ。

  • 数列の質問です。

    nを自然数とする。 2つの放物線y=x^2+n^2 とy=2x^2 で囲まれた領域をSとし、Sは周を含むとする。 次の各問に答えよ。 i)) kを整数とする。 Sに含まれm直線x=kの上にある格子点の個数をn、kを使って表せ。 ii))Sに含まれる格子点の個数をnの式で表せ。 iのほうなのですが、放物線とx=kが交わるところをひいて、 (k^2+n^2)ー2k^2 となるのはいいのですが、これに (k^2+n^2)ー2k^2+1と1を加えてあるのですが、この1はどの点なのでしょうか。 ii Σ(n、k=1) n^2ーk^2+1 なのかと思ったのですが、 n^2+1+2Σ(n^2ーk^2+1) となっていました。 このようになるのはなぜでしょうか。 解説お願いします。

  • 計算をできるだけしない解答を教えてください

    |x|+|y|+|z|<=n となる3つの整数の組(x、y、z)の個数を求めよ。 ただし|x|+|y|<=n となる2つの整数の組(x、y)の個数=2・n^2+2n+1が成立しているものとします。

  • 整数問題の質問です。

    y-2z/x=z-3x/2y=y-6X/5zのとき、この式の値を求めよ。 という問題で、私は=kとおいて、分母を消したりしたのですが、全然式がきれいにならず、どう解くべきなのか分かりません!困っています。 あと、 nは自然数とする。x^nをx^2-x-2で割った時の余りを求めよ。 という問題は、二項定理を使うのかとは思いますが、それで解いたら答が全然違いました。答は 2^n-(-1)^nx/3+2^n+2(-1)^n/3でした。 解き方を教えてください!お願いします。

  • 格子点

    Y≧1/2x、Y≦2x、Y≦-x+n とする。xy平面上の領域において、x座標もy座標も整数である点の個数をSnで表す。ただし、nは整数である。 S30を求めよ。 この問題が分かりません。図書いてみると、大きい三角形の中の個数から小さい三角形の中の個数の二倍したものを引くと解けると思うんですが、個数の求め方が分かりません。よろしくお願いします。 良ければ、limn→∞S3n/n^2もお願いします。

  • prolog言語で積分計算

    PROLOG計算 prolog言語で積分計算のできるプログラムを作っています。 積分定数Cを表示させるようにしているのですが 、3*x^3の積分の結果が 3* (x^2/2+c)+cとなってしまいます。 ()内のcを消すにはどーしたらよいでしょうか? プログラムは以下のように書きました。 t(x,x^2/2+c). t(Y ,Y*x+c) :- integer(Y). t(Y+Z,TY+TZ+c):- t(Y,TY),t(Z,TZ). t(Z*Y,Z*TY+c) :- integer(Z),t(Y,TY). t(Y^N ,(1/N)*Y^N1*TY+c):-integer(N),N1 is N+1,t(Y,TY). t(Y-Z,TY-TZ+c):-t(Y,TY),t(Z,TZ).

  • 0の0乗は0、にしたくない

    再び帰ってきました。 迷惑と感じる人は、スルーしてください。 Wikipediaでの議論について、気になったことを質問します。 参考:0の0乗のノート 質問は、以下のことです。 総乗:Π[n=1,y]x_n これの帰納的な定義が、x_n=xならば、x^yの定義と同じに思えます。  p_1 = x_1  p_n+1 = p_n * x_n+1 (+1は添字) そして、ΠΦ=1と記述されています。p_0に相当します。  p_0 = 1 つまり、x_n=0,y=0とすれば、総乗で0^0に相当する値は1です。 ほぼ同じ定義に対して、一方では未定義とし、もう一方では1であるとしています。 この違いは、どこからくるのでしょうか? 理由の一つは、x^yに連続性がないためであることは分かるのですが、定義が同じなら、結果にも同じことを期待するのではないですか? なお、0^0=0を否定するネタとして考えているので、0^0=1を主張する意図はありません。 0^0は未定義か1であり、状況や利便性で使い分ければ良いと考えています。