В документации (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
, ему может быть присвоено только некоторое целое значение, поскольку результатом целочисленного деления всегда является целое число :
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
----------
==========