Mar*_*nas 6 floating-point integer prolog clpfd
如何在prolog中将float转换为整数?
我试过了:
?- integer(truncate(sqrt(9))).
false.
?- integer(round(sqrt(9))).
false.
Run Code Online (Sandbox Code Playgroud)
mat*_*mat 15
如果它的参数是一个整数integer/1,那么你使用的谓词是真的.由于术语是不是一个整数,谓语也 未持有,因此无法对这个词.truncate(sqrt(9))
至少有两种方法可以满足您的需求:
您可以使用谓词(is)/2进行不同数字表示之间的转换.特别是,检查算术函数 round,truncate和ceiling.例如:
?- X is round(sqrt(9)). X = 3.
但请注意,使用浮点数始终存在很大问题.例如:
?- X is sqrt(2^10000). ERROR: is/2: Arithmetic: evaluation error: `float_overflow'
还有其他问题,例如舍入错误和可能的下溢.
由于浮点数的固有缺点,我强烈建议您使用更通用的机制.例如,几个Prolog系统支持具有无界精度的有理数和整数,而浮点数总是限于机器精度.
如果需要整数平方根,请使用例如有限域约束.用的限制,它足以说明什么保持为一个整数 X,它表示正平方根:
?- X*X #= 9, X #>= 0. X = 3.
这也适用于更大的整数:
?- X*X #= 2^10000, X #>= 0. X = 1412467032...(1496 digits omitted)
有关更多信息,请参阅clpfd.