Floating point 在prolog中将浮点转换为整数

Floating point 在prolog中将浮点转换为整数,floating-point,integer,prolog,clpfd,Floating Point,Integer,Prolog,Clpfd,如何在prolog中将浮点转换为整数 我试过: ?- integer(truncate(sqrt(9))). false. ?- integer(round(sqrt(9))). false. 如果参数为整数,则使用的谓词integer/1为true。由于术语truncate(sqrt(9))不是整数,因此谓词不成立,因此对于该术语无效 至少有两种方法可以满足您的需求: 解决方案1:快速和破碎 您可以使用谓词(is)/2在不同的数字表示之间进行转换。特别是,请查看算术函数舍入、截断和上限。例

如何在prolog中将浮点转换为整数

我试过:

?- integer(truncate(sqrt(9))).
false.

?- integer(round(sqrt(9))).
false.

如果参数为整数,则使用的谓词
integer/1
为true。由于术语
truncate(sqrt(9))
不是整数,因此谓词不成立,因此对于该术语无效

至少有两种方法可以满足您的需求:

解决方案1:快速和破碎 您可以使用谓词
(is)/2
在不同的数字表示之间进行转换。特别是,请查看算术函数
舍入
截断
上限
。例如:

?- X is round(sqrt(9)). X = 3. ?- X is sqrt(2^10000). ERROR: is/2: Arithmetic: evaluation error: `float_overflow' 这也适用于较大的整数:

?- X*X #= 2^10000, X #>= 0. X = 1412467032...(1496 digits omitted) ?-X*X#=2^10000,X#>=0。 X=1412467032…(省略1496位)
有关更多信息,请参见。

许多Prolog系统提供了一个附加的可计算函数
integer/1
,与可计算函数
truncate/1
相比,当后者像FPU指令一样实现时,它返回一个整数而不是浮点

FPU语义在两个Prolog系统中可用,如ECLiPSe Prolog和Jekejeke Prolog。对于大量用户,可以看到不同的行为:

/* with float semantics */
?- X is truncate(3.0E100).
X = 3.0E100

/* with integer semantics */
?- X is integer(3.0e100).
X = 299999999999999985344178410670684
7048562051886831693752693714362110399
5064698733443536124752361947136
此函数
integer/1
在ISO核心标准中找不到。我在测试:

?- X is integer(3.1415).
X = 3
我可以找到以下支持:

System          Available
GNU Prolog      No
Ciao Prolog     Yes
YAP Prolog      Yes
SICStus Prolog  Yes
ECLiPSe Prolog  Yes (1)
SWI-Prolog      Yes (2)
Jekejeke Prolog Yes
(1) 如果参数不是
已经是整数了。因此需要与truncate/1等结合使用。
另一种选择是使用fix/1,尽管有
是不推荐使用fix/1的声明

(2) SWI Prolog不进行截断,而是进行循环。

有人声称integer/1本身已被弃用。

在ISO Prolog中,此功能由
truncate/1
提供。见truncateF→9.1.6中的I关于当前的big num GMP的de factor标准,如果您喜欢不必要地用零填充内存字节,您可能希望对大浮点使用整数语义。您的意思是?-X是圆形(sqrt(9)),整数(X)。您不能直接调用integer/1,integer/1的参数将不会被计算。您还应该讨论浮点数的好处。他们不需要太多的空间。如果需要,还可以使用自适应浮动,这将使其精度适应当前的问题。不确定某些中电(R)是否已经可以做到这一点。
System          Available
GNU Prolog      No
Ciao Prolog     Yes
YAP Prolog      Yes
SICStus Prolog  Yes
ECLiPSe Prolog  Yes (1)
SWI-Prolog      Yes (2)
Jekejeke Prolog Yes