在 MiniZinc 中输出一个不存在的可选枚举

Output an absent optional enum in 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 也会失败。

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


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

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

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

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