Попробуйте:
?- [user].
exp(X,Y,Z) :- Z is round(X**Y).
Yes
?- exp(3,4,R).
R = 81
Разница с вашим решением:
1) Оператор (: -) / 2 обычно используется в Прологе для определения правил, а не (->) / 2 оператор.
2) (* *) / 2 возвращает число с плавающей точкой.Есть несколько возможностей преобразовать число с плавающей точкой в целое число.Помимо floor / 1 и truncate / 1, функция round / 1, вероятно, лучше всего работает здесь, так как результат (**) / 2 может быть неточным.
Пока
PS: естьпредложение для нативной целочисленной степенной функции, оно будет использовать оператор (^) / 2.Для получения дополнительной информации см .:
http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#pow
Собственная функция питания может дать лучшие результаты, если приведенная выше реализация может привести к переполнению или неточным результатам.Вот пример с другими результатами (SWI Prolog 5.11.33):
? - X является круглым (123,0 ** 45,0).
X = 1111040818513195701065908096392100163710184027607909226381269559244020367514635005984. * * 35005984 * X * - 10 * - X = X123 ^ 45.
X = 11110408185131956285910790587176451918559153212268021823629073199866111001242743283966127048043.