4

なぜこれが機能するのですか:

   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.
4

2 に答える 2

7

is算術演算は、演算子を介して句に対してのみ実行されるためです。最初の例では、Y1 は Y - 1 の計算結果にバインドされます。後者では、システムは power(X', Y', Z') X' = X、Y' = Y - 1、Z' = Z をバインドします。これは再び再帰的に行われるため、Y'' = Y - 1 - 1 のように無限大になり、実際には計算が実行されません。

プロローグは主に用語の統一にすぎません。「常識的な」意味での計算は、明示的に要求する必要があります。

于 2009-10-03T20:48:25.540 に答える