半具体化的谓词是否被视为标准的一部分?

Are half-reified predicates considered part of the standard?

FlatZinc 文档说只有非标准 谓词必须在 FlatZinc 模型的顶部声明:

Predicates used in the model that are not standard FlatZinc must be declared at the top of a FlatZinc model, before any other lexical items. Predicate declarations take the form

<predicate-item> ::= "predicate" <identifier> "(" [ <pred-param-type> : <identifier> "," ... ] ")" ";"

source: link

显然,mzn2fzn 编译器在编译文件的顶部添加了 half-reified predicate 声明(参见:this github issue):

predicate int_eq_imp(var int: a, var int: b, var bool: r);

我觉得这种行为有点令人困惑,因为 半具体化谓词 似乎是 standard.

的一部分

问:

"non-standard" 的定义在当前版本的文档中可能没有明确定义。意思是所有不是FlatZinc Builtins的谓词都将在FlatZinc模型的顶部声明。

由于 MiniZinc 最初是为约束规划求解器设计的,其想法是即使 FlatZinc 在某些情况下也可以与不同的求解器兼容。假设所有求解器都至少支持所有必需的 FlatZinc 内置函数,然后求解器可以快速检查声明以查看它是否支持 FlatZinc 模型中使用的所有其他谓词。

如今,这与事实相去甚远。许多 MiniZinc 求解器不直接支持 FlatZinc 内置函数,而是提供重新定义。即使像 Gecode 和 Chuffed 这样的打包 CP 求解器实际上并不使用 MiniZinc 模型中的声明,而是在遇到未知谓词的使用时针对其内部注册表处理约束并抛出错误。

如果 FlatZinc 标准曾经发生变化,那么我认为它要么提供 FlatZinc 模型中使用的所有谓词的声明,要么包含任何声明。后者可能更有可能,因为我们不应该假设 FlatZinc 模型可以重复用于不同的求解器,因此该声明几乎没有实际用途。

总结并直接回答您的问题。这不是错误,尽管 int_eq_imp 看起来很标准,但它不是 FlatZinc 内置函数的一部分。目前没有办法抑制这些声明,但求解器可以简单地忽略所有包含谓词声明的行,并在处理约束时处理未知谓词。