7

What is wrong with my power function?

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

?- pow(2,3,Z).
ERROR: Out of global stack
false
  • 10,264
  • 13
  • 101
  • 209
TheOne
  • 10,819
  • 20
  • 81
  • 119

3 Answers3

18

Your Y does not get decremented, you can not use predicates like functions. You also have to unify Z with the result of the multiplication.

pow(_,0,1).

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

There is also a builtin power function which will be much faster:

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

Also note that pow is not a last call and can not be optimized to use only one stack frame. You should reformulate it to:

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).
ebo
  • 8,985
  • 3
  • 31
  • 37
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).
Maik
  • 29
  • 1
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).
John Conde
  • 217,595
  • 99
  • 455
  • 496