Пролог Функтор - Вычислительный x ^ y - PullRequest
3 голосов
/ 29 декабря 2011

Я новичок в прологе и пытаюсь научиться программировать. Я хочу знать, как вычислить x^y в Прологе, оба являются целыми числами.

Я точно знаю, что это выглядит примерно так:

% exp(y,x,z) <- z is x**y

1 Ответ

10 голосов
/ 29 декабря 2011

Попробуйте:

?- [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.

...