7

べき乗関数の何が問題になっていますか?

pow(_,0,1).   
pow(X,Y,Z) :-
    pow(X,Y-1,X*Z).

?- pow(2,3,Z).
ERROR: Out of global stack
4

3 に答える 3

18

Yはデクリメントされません。関数のような述語を使用することはできません。また、乗算の結果でZを統合する必要があります。

pow(_,0,1).

pow(X,Y,Z) :- Y1 is Y - 1,
              pow(X,Y1,Z1), Z is Z1*X.

組み込みのべき関数もあり、これははるかに高速です。

pow2(X,Y,Z) :- Z is X**Y.

また、powは最後の呼び出しではなく、1つのスタックフレームのみを使用するように最適化することはできないことに注意してください。次のように再定式化する必要があります。

pow3(X,Y,Z) :- powend(X,Y,1,Z),!.

powend(_,0,A,Z) :- Z is A.
powend(X,Y,A,Z) :- Y1 is Y - 1, A1 is A*X, powend(X,Y1,A1,Z).
于 2009-09-19T15:53:20.810 に答える
1
DOMAINS
num=INTEGER

PREDICATES
nondeterm power(num,num,num)

CLAUSES
power(X,0,1).
power(X,P,F):-X>0,P1=P-1,power(X,P1,F1),F=X*F1.

GOAL
power(2,5,X).
于 2011-04-16T08:58:18.040 に答える