Есть две проблемы с кодом.
- Чтобы сделать арифметику в прологе, вы должны использовать / 2 вместо =
- Переменные в умножении пришлось поменять местами (Z - Z1 * X)
- Вы должны установить охрану, чтобы показатель был положительным, в противном случае вы можете столкнуться с ситуациями, когда программа не прекратит работу.
Вот фиксированный код:
pow(_,0,1).
pow(B,E,R) :- E > 0,!, E1 is E -1, pow(B,E1,R1), R is B * R1.
Вот вторая, хвостовая рекурсивная версия с использованием аккумулятора
powa(B,E,R) :- powa(B,E,1,R).
powa(_,0,A,A).
powa(B,E,A,R) :- E > 0, !, E1 is E - 1, A1 is B * A, powa(B,E1,A1,R).