Пролог-функтор — вычисление x^y

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

Я точно знаю, что это происходит примерно так:

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

person Amjad    schedule 29.12.2011    source источник
comment
Заголовок stackoverflow.com/questions/8240952/   -  person m09    schedule 29.12.2011
comment
кстати, используйте предикат вместо функтора.   -  person m09    schedule 29.12.2011
comment
Спасибо @Mog, интересный ответ. Я также хочу знать, как проверить это в GNU Prolog. Любая помощь, пожалуйста? Спасибо!   -  person Amjad    schedule 29.12.2011
comment
Ну, я не вижу каких-либо нестандартных предикатов, поэтому вы можете проверить их как есть. Если вам нужен базовый совет о том, как скомпилировать / обратиться к файлу в прологе gnu, доступно множество руководств, и Google должен помочь вам так же быстро, как и я.   -  person m09    schedule 29.12.2011
comment
Спасибо, я узнал, как это сделать.   -  person Amjad    schedule 29.12.2011


Ответы (1)


Попробуй это:

?- [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 может быть неточным.

до свидания

P.S.: Есть предложение для собственной целочисленной функции степени, она будет использовать оператор (^)/2. Для получения дополнительной информации см.:

http://www.complang.tuwien.ac.at/ulrich/iso-prolog/dtc2#pow

Собственная функция мощности может давать лучшие результаты, когда приведенная выше реализация может столкнуться с переполнением или неточными результатами. Вот пример с другими результатами (SWI Prolog 5.11.33):

?- X круглое (123,0 ** 45,0).
X = 11110408185131957010659080963921001637101840276079092263812695592440203675146350059871151325184.

?- X is 123^45.
X = 11110408185131956285910790587176451918559153212268021823629073199866111001242743283966127048043.

person Mostowski Collapse    schedule 29.12.2011
comment
Предложение для (^)/2 стало стандартным! - person false; 17.02.2012