你的 Y 不会递减,你不能使用像函数这样的谓词。您还必须将 Z 与乘法结果统一。
pow(_,0,1).
pow(X,Y,Z) :- Y1 is Y - 1,
pow(X,Y1,Z1), Z is Z1*X.
还有一个内置的 power 函数,速度会快得多:
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).