MiniZinc:类型错误:未找到具有此签名的函数或谓词:`floor(var int)'

时间:2019-02-12 08:20:46

标签: minizinc

我正在尝试使用Minizinc IDE 2.2.3和Geocode 6.1.0 [内置]在Mac OS / X上运行以下代码:

var 1..10: x;
var float: y = x div 4;

constraint y == floor(y);

solve minimize( (x - 7)^2 );

output ["\(x) \(y)"]

我收到的错误是:

  

MiniZinc:类型错误:找不到带有此签名的函数或谓词:`floor(var float)'

我已经看过这个similar question,但是,我正在遵循selected answer中的建议并使用:

  • 浮动决策变量
  • 地理代码求解器

因此,这个问题不同于另一个问题。

1 个答案:

答案 0 :(得分:1)

documentation (v. 2.2.3)floor()需要类型为float的参数:

  

4.1.11.6。强制操作

     

将浮点数分别朝向+∞,-∞和最接近的整数。

int: ceil (float)
int: floor(float)
int: round(float)
     

从一个类型实例向另一个类型对象的显式转换。

    int:          bool2int(    bool)
var int:          bool2int(var bool)
    float:        int2float(    int)
var float:        int2float(var int)
array[int] of $T: set2array(set of $T)

在模型中,您将var float而不是float传递给函数floor,因此会出现类型错误


如上所述,在您的示例中,floor()函数似乎不是必需的。即使您将y声明为var float,也只能为其分配一些 integral 值,因为 integer除法的结果始终是整数

function var int: 'div'(var int: x, var int: y)

因此,我的建议是完全删除floor()

示例

var 1..10: x;
var float: y = x div 4;

constraint 1.5 <= y;

solve minimize( (x - 7)^2 );

output ["\(x) \(y)"]

收益

~$ minizinc t.mzn 
8 2.0
----------
==========