2010-12-04 138 views

回答

14

謂詞,您使用的integer/1是真的當且僅當參數是一個整數。由於長期truncate(sqrt(9))一個整數,謂語不  保持,因此失敗這個 項。

至少有兩種方法可以得到你想要的東西:

解決方案1:快速破

可以使用謂詞(is)/2針對不同數量的表示之間的轉換。特別是,請查看算術 函數round,truncateceiling。例如:

 
?- 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) 

爲見更多信息。