prolog中的幂函数

时间:2009-09-19 15:38:56

标签: math prolog logic exponentiation

我的电源功能出了什么问题?

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

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

3 个答案:

答案 0 :(得分:16)

你的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不是最后一次调用,无法优化仅使用一个堆栈帧。你应该将其重新制定为:

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

答案 1 :(得分:2)

Predicates
fac(Integer,Integer,Integer).
Clauses
fac(X,N,X):- N=1,!.
fac(X,N,M):- N1=N-1,fac(X,N1,M1), M= X*M1.
Goal
fac(5,3,X).

答案 2 :(得分: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).