2010-12-04 2 views

ответ

14

Предикат integer/1, который вы использовали верно тогда и только тогда ее аргумент является целым числом. Поскольку термин truncate(sqrt(9)) является не целого числа, предикат делает   не захвата и поэтому терпит неудачу для этого   срока.

Есть по крайней мере два способ, чтобы получить то, что вы хотите:

Решение 1: Быстрые и сломано

Вы можете использовать предикат (is)/2 для преобразования между различными представлениями числа. В частности, проверьте арифметические функции  round, truncate и ceiling. Например:

 
?- X is round(sqrt(9)). 
X = 3. 

Однако, обратите внимание, что использование чисел с плавающей запятой всегда весьма проблематичной. Например:

 
?- X is sqrt(2^10000). 
ERROR: is/2: Arithmetic: evaluation error: `float_overflow' 

Есть также другие проблемы, такие как ошибки округления и возможное недополнение.

Решение 2: Быстрое и общее

Из-за присущие им недостатки чисел с плавающей точкой, я настоятельно рекомендую вам использовать более общих механизмы вместо этого. Например, несколько систем Prolog поддерживают рациональные номера и целые числа с неограниченной точностью, тогда как поплавки всегда ограничены точностью машины.

Если вам нужно целое квадратные корни, использовать, например конечных ограничений домена. С ограничениями, достаточно сказать, что имеет для целого   X, обозначающего положительный квадратный   корень:

 
?- X*X #= 9, X #>= 0. 
X = 3. 

Это также работает для больших целых чисел:

 
?- X*X #= 2^10000, X #>= 0. 
X = 1412467032...(1496 digits omitted) 

См для больше информации.

Смежные вопросы