在 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
如何输出一个可选的枚举?
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