使用MiniZinc,有没有办法打印出以编程方式生成的约束?例如:
constraint exists (i in 1..3) (
foo != i
);
我想确认它正在生成:
constraint (foo != 1 \/ foo != 2 \/ foo !=3);
答案 0 :(得分:2)
尽管MiniZinc并未提供直接打印限制。 MiniZinc确实提供trace(string: s, var $T: expr)
功能。可用于调试MiniZinc型号。 trace
是一个print语句,在编译器中评估时将其内容打印到命令行。因此,它可以用于打印您希望看到的信息,但您必须自己格式化以显示约束。
如果你的存在循环你可以使用:
constraint exists(i in 1..3) (
trace("foo != \(i)" ++ if i != max(1..3) then " \\/ " else "\n" endif,
foo != i)
);
这会将foo != 1 \/ foo != 2 \/ foo != 3
打印到命令行。
答案 1 :(得分:0)
要了解生成的约束,您可以查看生成的FlatZinc
文件。 MiniZinc
编译器会将MiniZinc
源转换为FlatZinc
。然后将其移交给Gecode
Chuffed
的求解器后端。
MiniZinc
输入:
var int: foo;
constraint exists (i in 1..3) (
foo != i
);
solve satisfy;
已创建FlatZinc
:
var int: foo:: output_var;
var bool: X_INTRODUCED_0_ ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_1_ ::var_is_introduced :: is_defined_var;
var bool: X_INTRODUCED_2_ ::var_is_introduced :: is_defined_var;
constraint array_bool_or([X_INTRODUCED_2_,X_INTRODUCED_1_,X_INTRODUCED_0_],true);
constraint int_ne_reif(foo,1,X_INTRODUCED_0_):: defines_var(X_INTRODUCED_0_);
constraint int_ne_reif(foo,2,X_INTRODUCED_1_):: defines_var(X_INTRODUCED_1_);
constraint int_ne_reif(foo,3,X_INTRODUCED_2_):: defines_var(X_INTRODUCED_2_);
solve satisfy;
要查看FlatZinc
表单,您可以在--output-fzn-to-stdout
的{{1}}标签中添加参数Configuration
:
答案 2 :(得分:0)
MiniZinc在将表达式编译为FlatZinc时会经历一系列步骤,因此在决定问题的中间表示的哪一步之后决定不是那么容易。
要查看生成的FlatZinc,您还可以从MiniZinc菜单中选择“Compile”,而不是使用/* CSS to allow text wrapping */
.ui-grid-viewport .ui-grid-cell-contents {
word-wrap: break-word;
white-space: normal !important;
}
.ui-grid-row, .ui-grid-cell {
height: auto !important;
}
.ui-grid-row div[role=row] {
display: flex ;
align-content: stretch;
}
/* End of CSS to allow text wrapping */
命令行选项。