2010-12-04 9 views

Antwort

14

Das Prädikat integer/1, die Sie iff ihr Argument eine ganze Zahl ist, ist wahr verwendet. Da der Begriff truncate(sqrt(9))nicht eine ganze Zahl ist, hat das Prädikat   nicht halten und daher nicht für diesen   Begriff.

Es gibt mindestens zwei Möglichkeiten, zu bekommen, was Sie wollen:

Lösung 1: Schnelle und gebrochen

Sie das Prädikat (is)/2 für die Konvertierung zwischen verschiedenen Zahlendarstellungen verwenden können. Insbesondere die Arithmetik   Funktionenround, truncate und ceiling überprüfen. Zum Beispiel:

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

Beachten Sie jedoch, dass Gleitkommazahlen mit immer höchst problematisch. Zum Beispiel:

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

Es gibt auch andere Probleme wie Rundungsfehler und möglichen Unterlauf.

Lösung 2: Schnelle und allgemeine

Aufgrund der inhärenten Mängel von Gleitkommazahlen, empfehle ich Ihnen allgemeinere Mechanismen stattdessen verwenden. Zum Beispiel unterstützen mehrere Prolog-Systeme rationale Zahlen und ganze Zahlen mit unbegrenzter Genauigkeit, während Floats immer auf Maschinengenauigkeit beschränkt sind.

Wenn Sie integer Quadratwurzeln müssen, verwenden Sie beispielsweise endlichen Bereich Einschränkungen. Mit Einschränkungen genügt es zu sagen, was für eine ganze Zahl   X hält, die die positive quadratische   Wurzel bezeichnet:

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

Diese auch Werke für größere Zahlen:

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

Siehe für Mehr Informationen.