如何通过非标准 FlatZinc 扩展获得有理数的精确无限精度表示?

How to obtain an exact infinite-precision representation of rational numbers via a non-standard FlatZinc extension?

默认情况下 mzn2fzn 自动计算 MiniZinc 模型中浮点除法的结果,并将其存储为常量 float 结果 FlatZinc 模型中的值。

示例:

文件test.mzn

var float: x;
constraint      1.0 / 1000000000000000000000000000000000.0 <= x;
constraint x <= 2.0 / 1000000000000000000000000000000000.0;
solve satisfy;

翻译为

mzn2fzn test.mzn

等于

var 1e-33..2e-33: x;
solve satisfy;

我们想要获得***的是 FlatZinc 文件,其中包含以下几行:

var float: x;
var float: lb;
var float: ub;
constraint float_div(1.0, 1000000000000000000000000000000000.0, lb);
constraint float_div(2.0, 1000000000000000000000000000000000.0, ub);
solve satisfy;

其中 float_div() 引入的非标准 FlatZinc 约束。

是否可以使用 std 约束目录的变体来生成原始问题的这种编码,或者这种编码是否需要对 [=14] 的源代码进行更重大的更改=] 工具?在后一种情况下,我们可以得到一些指导吗?


***:我们有一些公式不适合使用有限精度浮点表示,因为它会将 SAT 结果更改为 UNSAT

目前无法无限精确地生成 FlatZinc。虽然这个想法已经讨论过几次,但它需要使用可以提供这些无限精确类型的库来重写或附加 MiniZinc 的大部分内容。像这样的库,例如 Boost interval 库,似乎缺少选项,并且目前无法为分布 MiniZinc 的所有机器目标编译。无限精确类型似乎有各种有趣的案例,但在 MiniZinc 编译器的实现中,我们仍在寻找一种合适的实现方式。

虽然无限精度不上table。 MiniZinc 编译器确实打算根据浮点标准是正确的。请随时报告 MiniZinc Issue Tracker.

可能出现的任何问题