Ваш 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).