在MiniZinc中输出缺少的可选枚举

时间:2017-11-30 23:41:09

标签: minizinc

如何输出可选的枚举?

enum Foo = { A, B };
var opt Foo: foo;
output [ "foo: \(foo)" ];
solve satisfy;

输出失败:

Compiling test.mzn
MiniZinc: flattening error: 
  function _toString_Foo is used in output, par version needed
Finished in 29msec

如果我将Foo改为一组int

set of int: Foo = 1..2;
var opt Foo: foo;
output [ "foo: \(foo)" ];
solve satisfy;

然后它起作用

Compiling test.mzn
Running test.mzn
foo: <>
----------
Finished in 136msec

这里缺少的值显然不是问题。

即使我检查解决方案是否存在,它仍然会失败

set of int: Foo = 1..2;
var opt Foo: foo;
output [ "foo: " ++
     if (occurs(fix(foo))) then "present" else "absent" endif
                                          ];
solve satisfy;

失败了

Compiling test.mzn
Running test.mzn
MiniZinc: evaluation error: undeclared identifier '_absent'
unknown file
Finished in 39msec

实际上,即使是一组int也失败了。

1 个答案:

答案 0 :(得分:2)

更新:问题已在MiniZinc编译器的develop分支上解决。在下一个版本中,> 2.1.6,应该可以在输出中使用可选参数。

因为枚举在求解器输入中表示为整数,所以将特殊的映射函数插入到输出模型中以确保输出正确。

将求解器输出转换为MiniZinc输出是solns2out可执行文件的任务。这是使用输出模型(.ozn)完成的。

您得到的错误是因为找不到将整数映射回枚举所需的函数,这是编译器中的错误。仅在两天前,枚举集的_toString_函数被添加到开发分支中,似乎仍然缺少可选类型的版本。

我建议你在GitHub上创建一个问题,这个问题可能会在下一个MiniZinc版本中得到解决:https://github.com/MiniZinc/libminizinc/issues