如何在prolog中将浮点数转换为整数?
I tried:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
谓词integer/1
你使用的是真的iff它的参数是一个整数。自任期以来truncate(sqrt(9))
is not一个整数,谓词确实not保持,因此fails对于这个术语。
至少有两种方法可以得到你想要的:
解决方案1:快速且断断续续
您可以使用谓词(is)/2
用于不同数字表示形式之间的转换。特别是,请查看算术函数 round
, truncate
and ceiling
。例如:
?- X is round(sqrt(9)).
X = 3.
但是,请注意,始终使用浮点数问题很大。例如:
?- X is sqrt(2^10000).
ERROR: is/2: Arithmetic: evaluation error: `float_overflow'
还有其他问题,例如舍入误差和可能的下溢。
解决方案 2:快速且通用
由于浮点数固有的缺点,我强烈建议您使用更通用的机制反而。例如几个Prolog系统支持有理数以及具有无限精度的整数,而浮点数始终仅限于机器精度。
如果你需要integer平方根,例如使用有限域约束。在有限制的情况下,只需说明什么就足够了holds对于一个整数X
表示正平方根:
?- X*X #= 9, X #>= 0.
X = 3.
This also适用于更大的整数:
?- X*X #= 2^10000, X #>= 0.
X = 1412467032...(1496 digits omitted)
See clpfd /questions/tagged/clpfd了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)