2010-12-04 32 views

Répondre

14

Le prédicat integer/1 que vous avez utilisé est vrai ssi son argument est un entier. Étant donné que le terme truncate(sqrt(9)) est pas un entier, le prédicat ne   pas attente et donc ne pour ce terme  .

Il y a au moins deux façons d'obtenir ce que vous voulez:

Solution 1: rapide et cassé

Vous pouvez utiliser le prédicat (is)/2 pour la conversion entre les différentes représentations numériques. En particulier, consultez les fonctions arithmétique  round, truncate et ceiling. Par exemple:

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

Cependant, notez que l'utilisation de nombres à virgule flottante est toujours très problématique . Par exemple:

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

Il existe également d'autres problèmes tels que des erreurs d'arrondi et un sous-dépassement possible.

Solution 2:

rapide et générale

En raison des lacunes inhérentes aux nombres à virgule flottante, je vous recommande fortement d'utiliser des mécanismes plus généraux au lieu. Par exemple, plusieurs systèmes Prolog prennent en charge les nombres rationnels et les entiers avec une précision illimitée, tandis que les flottants sont toujours limités à la précision de la machine.

Si vous avez besoin entier racines carrées, utilisez par exemple contraintes de domaine finis. Avec des contraintes, il suffit de dire ce que détient pour un entier   X qui indique la place positif   racine:

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

Cette aussi œuvres pour les entiers plus grands:

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

Voir pour Plus d'information.