• ベストアンサー

prologの記号について

prologを勉強中です.次のように階乗を計算します fact(N, 1) :- N < 1!. fact(N, X) :- N1 is N - 1, fact(N1, Y), X is N * Y. そのとき,1行目の最後の"!"は何を表すのでしょうか? たぶん,それ以上先を実行しないという意味だと思うのですが, 正しい意味が分かりません.ご指導お願いします.

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

  • ベストアンサー
  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

カットといいます。 意味は、仰るとおりそれ以上実行しないといった感じです。 バックトラックの挙動を制御するための特殊なゴールで、正確に言うと、「1回目の評価は成功するが、(バックトラック後の)2回目以降の評価では失敗する」というものです。 http://www.google.com/search?num=50&hl=ja&q=%E3%82%AB%E3%83%83%E3%83%88+prolog&lr=lang_ja

whgpw017
質問者

お礼

わかりました.ありがとうございました.

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

解答はANo.1の方が出されておりますので、このプログラムについてのウンチクをひとつ このプログラムは1行目と2,3,4行目の2ステップで成り立っています。 階乗計算をする際にNから順にNをデクリメント(-1)しながら掛けていくと最終的に1にたどり着きます(1の階乗は1というやつ:それ以下になると0、かけちゃうと答えはすべて0になってしまいますから)。 この1行目と2行目を入れ替えて処理しようとした場合どうなるでしょうか(3とか簡単な数字で試してみてください)。 これは、人工知能言語と呼ばれるPrologといえども「アルゴリズム」の呪縛からは逃れられないという一例でもあります。

関連するQ&A

  • 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)) と定義したのですが、確認をするときにどのように確認したらよいのか教えて頂けますでしょうか?

  • 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).

  • 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)については、質問と規則の頭部との単一化です。 どの変数も単一化の前に値を持っていないとします。 教えてください。

  • 階乗のプログラム

    c言語初心者です。 13までの階乗の値を計算するプログラムを下のように書いたのですが、 #include <stdio.h> main() { int N, fact; fact=1; for(N=1; N<=13; ++N){ fact=fact*N; printf("%d!=%d\n",N, fact); } } このプログラムを実行してみると、12!までは正しい値が出力されるのですが、13!の値が1932053504と出力され、計算機の値と違います。 どこが間違っているのでしょうか。どなたかご教授お願いします。

  • 全称記号∀の使い方

    たとえばxとyの恒等式についての記述をするのに 「(数行計算してでてきた式)=0が任意の実数x、yについて成り立つとき」というのを 「(数行計算してでてきた式)=0が∀x、y∈Rについて成り立つとき」と書いても問題ないでしょうか? それとも∀や∃はちゃんと命題の中で使用しないと間違いでしょうか?

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

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • python ver3について

    python3を勉強している初心者です。 参考書に載っていた、階乗を計算する例題を変更したいと思っています。 このプログラムを書き換えて、input文で任意の数字nをキーボードから入力して、結果を表示させたいんですが、どうすれば良いでしょうか。 このプログラムでは思う様に動きません。 n=input() def fact(n):   if n ==0:     return 1   return n*fact(n-1) print(fact(n)) input() よろしくお願いいたします。

  • かけ算の記号

    かけ算の記号についてお聞きします。 数のかけ算(乗法)の記号には「×」と「・」がありますが、何か使い分けがあるのでしょうか。 私の中学のときの数学の教科書には、かけ算の記号として「×」は使われていますが、「・」は使われていないようです。 高校に入って、数学(1)の教科書では、五つの章に分かれているのですが、前の四つの章では、みな「×」を使っています。最後の「数と式」という章で初めて「・」がかけ算の記号として出てきます。しかし、「『・』はかけ算の記号である」というような紹介や注のようなものはなくて、次のように登場します。 「実数の範囲では,四則演算は自由に行われる.減法 a-bは a+(-b),除法 a÷b は a・1/b と考えれば,減法・除法は加法・乗法として扱うことができる.」(1/b の / は横棒) 高校のときの数学の教科書全体では、どうやら、数字を使った具体的な数どうしのかけ算では「×」が多く、文字や記号の間で使うときは「・」が多いようです。 また、一つの式の中で両方とも使っているものはないようです。 「1 × x × x × … × x」(xのn乗の説明) なんてのもありますし、 「n(n-1)(n-2)・ … ・3・2・1」(nの階乗) という記述もあります。 計算問題では文字どうしでも「×」が使われています。 別にどちらでも意味は変わらないと思いますが、習慣としてこのような場合はどちらを使うというのはあるのでしょうか。

  • 再帰について(C言語)

    今、再帰処理を勉強しています。 しかし、以下のプログラムがどうしても理解できません。 流れ的には一体どういう手順になっているのでしょうか? return i * fact( i - 1 )の部分を考えると頭が こんがらがってしまいます。 #include <stdio.h> int main( void ){  printf("5の階乗は %d です", fact(5) );  return 0; } int fact( int i ){  if( i == 1 ) return 1;  else return i * fact( i - 1 ); } --------実行結果---------- 5の階乗は 120 です

  • Fortranでの記号「./」について

    Fortran 90で書かれた数値計算プログラムを、より専門的な言語に書き換える作業を行っています。 Fortranを学んだことがないのでインターネット等で関数の意味や書式を調べながら作業しているのですが、 「X./Y」という式の意味がわからずに困っています。 単純に「X/Y」とはどう違うのでしょうか。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

専門家に質問してみよう