MiniZinc:打印出生成的约束?

时间:2018-03-30 17:01:54

标签: constraint-programming minizinc

使用MiniZinc,有没有办法打印出以编程方式生成的约束?例如:

constraint exists (i in 1..3) (
     foo != i
);

我想确认它正在生成:

constraint (foo != 1 \/ foo != 2 \/ foo !=3);

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

enter image description here

答案 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 */ 命令行选项。