2010-12-04 94 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) 

为见更多信息。