2010-12-04 33 views

Respuesta

14

El predicado integer/1 que utilizó es cierto si y sólo si su argumento es un entero. Dado que el término truncate(sqrt(9)) es no un número entero, el predicado hace   no espera y por lo tanto falla para este   plazo.

Hay al menos dos maneras de conseguir lo que quiere:

Solución 1: Rápido y roto

Usted puede utilizar el predicado (is)/2 para la conversión entre diferentes representaciones numéricas. En particular, consulte aritmética   funcionesround, truncate y ceiling. Por ejemplo:

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

Sin embargo, tenga en cuenta que el uso de números de punto flotante es siempre muy problemático . Por ejemplo:

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

También hay otros problemas, como errores de redondeo y posible subdesbordamiento.

Solución 2: rápida y general

Debido a las limitaciones inherentes de los números de punto flotante, recomiendo encarecidamente que use mecanismos más generales lugar. Por ejemplo, varios sistemas Prolog admiten números racionales y números enteros con precisión ilimitada, mientras que los flotantes siempre están limitados a la precisión de la máquina.

Si necesita número entero raíces cuadradas, utiliza por ejemplo restricciones del dominio finitos. Con limitaciones, basta con señalar lo sostiene un entero   X que denota el positivo cuadrada   raíz:

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

Este también obras para números enteros mayores:

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

Ver de más información.