prolog中的幂函数

The*_*One 7 math logic prolog exponentiation

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

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

?- pow(2,3,Z).
ERROR: Out of global stack
Run Code Online (Sandbox Code Playgroud)

ebo*_*ebo 17

你的Y没有减少,你不能使用像函数这样的谓词.您还必须将Z与乘法结果统一起来.

pow(_,0,1).

pow(X,Y,Z) :- Y1 is Y - 1,
              pow(X,Y1,Z1), Z is Z1*X.
Run Code Online (Sandbox Code Playgroud)

还有一个内置的电源功能,它会快得多:

pow2(X,Y,Z) :- Z is X**Y.
Run Code Online (Sandbox Code Playgroud)

另请注意,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).
Run Code Online (Sandbox Code Playgroud)