Ответ в теме: Неотрицательная степень целого числа

      Комментарии к записи Ответ в теме: Неотрицательная степень целого числа отключены
#1827

В вашем решении используются свойства логарифмов, а именно:
a * log(b) = log(b^a)
Это быстро и эффективно, особенно для дробных степеней.
Не для всех чисел может быть вычислен логарифм, поэтому в начале ваша функция выполняет соответствующие проверки.
Логарифм нельзя вычислить для отрицательного числа, поэтому если число, возводимое в степень меньше нуля — то вычисляется (-a) * log(-b).

Более понятное, но менее эффективное решение:

predicates
pow(integer, integer, integer) % Nummer, Degree, Number^Degree
clauses
pow(Number, Degree, Result):-
Degree < 0, !, fail;
Degree = 0, !, Result = 1;
NextDegree = Degree - 1, pow(Number, NextDegree, NextResult), 
Result = NextResult * Number.

Тут используется тот факт, что Number^Degree = Number * Number^(Degree-1) для целых положительных степеней.
Функция проверяет корректность исходных данных и, если они не корректны — завершается неудачей.
Если требуется возвести в нулевую степень — функция возвращает единицу.
Во всех остальных случаях вычисляет результат рекурсивно.