0

我必须写一段序言,我必须计算数组中的哪个位置用于存储值。然而,这些计算的结果应该返回一个整数,所以我使用floor/1谓词来获取值的整数,但这在我的代码中不起作用。它不断返回一个带小数点的数字,例如 3.0 而不是 3

以下是我的代码:

assign_value(El, NumberArray, RowNumber, I) :-
    ground(El),
    Number is NumberArray[El],
    Col is I/3,
    Row is RowNumber/3*3,
    Sum is floor(Col + Row + 1),
    subscript(Number, [Sum], El).
assign_value(_, _, _, _).

的结果Sum is floor(Col + Row + 1)永远不是整数,我不知道为什么。谁能帮我这个?

4

3 回答 3

2

在 ISO Prolog 中,可评估函子floor/1具有签名(ISO/IEC 13211-1 中的 9.1.1):

F层→I层

所以它需要一个浮点数并返回一个整数。

但是,我不相信首先从整数中创建浮点数,然后将它们放回整数是您想要的,而是考虑使用(div)/2它来代替(/)/2一直使用整数。

于 2014-04-15T17:17:34.520 回答
1

来自 floor/2 的文档(http://www.eclipseclp.org/doc/bips/kernel/arithmetic/floor-2.html

结果类型与参数类型相同。要将类型转换为整数,请使用integer/2.

例如:

...,
Floor is floor(Col+Row+1), Sum is integer(Floor).
于 2014-04-15T17:01:04.773 回答
1

阅读文档floor/2,我们看到

[ floor/2] 适用于所有数字类型。结果值是小于 Number 的最大整数值(向下舍入到负无穷大)。

结果类型与参数类型相同。要将类型转换为整数,请使用integer/2.

所以你得到的类型与你提供的参数相同。进一步查看您的谓词,我们看到了/运算符的使用。进一步阅读文档,我们看到

'/'/3ECLiPSe 编译器使用它来扩展可计算的算术表达式。所以调用/(Number1, Number2, Result)相当于

Result is Number1 / Number2

这应该是便携性的首选。

除法的结果类型取决于全局标志 prefer_rationals 的值。当它关闭时,结果是一个浮点数,当它打开时,结果是一个有理数。

您的除法运算永远不会返回整数,这意味着事情会向上转换为浮点数。

如果要执行整数除法,则应使用运算符//div

于 2014-04-15T17:07:59.413 回答