質問

なぜ、この作品は行います:

   power(_,0,1) :- !.
   power(X,Y,Z) :-
      Y1 is Y - 1,
      power(X,Y1,Z1),
      Z is X * Z1.

これは、スタックオーバーフロー例外を与える?

power(_,0,1) :- !.
power(X,Y,Z) :-
  power(X,Y - 1,Z1),
  Z is X * Z1.
役に立ちましたか?

解決

算術演算のみisオペレータを通じて句で実行されるので。最初の例では、Y1はYの計算の結果にバインドされている - 以降で1.、システムは、句電源電力を単一化(X、Y1、Z1)、(X「Y」を証明しようと、 =のX 'X結合)' をZは、Y '= Y - 1、Z' 実際に計算を行うことがない、無限のために1等

Prologは、主に用語の統一だけである - 計算は、「一般的な」という意味で、明示的に要求する必要があります。

他のヒント

両方の定義が正しく動作しません。

考えてみましょう。

?- pow(1, 1, 2).

は第二節は関係なく、第二引数の適用することができるので、両方の定義のためにループします。最初の句のカットが、これを元に戻すことはできません。第二節は、再帰的なゴールの前にゴールY > 0を必要とします。 (is)/2を使用すると、まだ実際のソリューションを取得することをお勧めします。

(初心者用)

最高のは、<クラス=「ポスト・タグ」のhref =「/質問/タグ付き/後継-算術演算」タイトル=で開始することであるのrel = "タグ「ショーの質問『後継-算術演算』をタグ付け」質問が'clpfd'" rel="tag"> clpfd にタグ付けtitle="show「>後継-算術演算はのか、

-

例えば: Prologの述語を見ます

scroll top