如何在prolog中将float转换为整数?
我试过了:
?- integer(truncate(sqrt(9))). false. ?- integer(round(sqrt(9))). false.
解决方法
如果其参数是整数,则使用的谓词整数/ 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.