[英]Are half-reified predicates considered part of the standard?
FlatZinc 文檔說只有非標准謂詞必須在 FlatZinc model 的頂部聲明:
model 中使用的非標准 FlatZinc 的謂詞必須在 FlatZinc model 的頂部聲明,在任何其他詞匯項之前。 謂詞聲明的形式
<predicate-item>::= "predicate" <identifier> "(" [ <pred-param-type>: <identifier> ","... ] ")" ";"
來源: 鏈接
顯然,mzn2fzn 編譯器在編譯文件的頂部添加了半具體化的謂詞聲明(請參閱: 此 github 問題):
predicate int_eq_imp(var int: a, var int: b, var bool: r);
我覺得這種行為有點令人困惑,因為半具體化的謂詞似乎是標准的一部分。
問:
“非標准”的定義在當前版本的文檔中可能沒有明確定義。 意思是所有不是FlatZinc Builtins的謂詞都將聲明在 FlatZinc model 的頂部。
由於 MiniZinc 最初是為約束規划求解器設計的,其想法是即使 FlatZinc 在某些情況下也可以與不同的求解器兼容。 假設所有求解器都至少支持所有必需的 FlatZinc 內置函數,然后求解器可以快速檢查聲明以查看它是否支持 FlatZinc model 中使用的所有其他謂詞。
如今,這與事實相去甚遠。 許多 MiniZinc 求解器不直接支持 FlatZinc 內置函數,而是重新定義。 即使像 Gecode 和 Chuffed 這樣的打包 CP 求解器實際上也沒有使用 MiniZinc model 中的聲明,而是在遇到使用未知謂詞時針對其內部注冊表處理約束並拋出錯誤。
如果 FlatZinc 標准要改變,那么我認為它要么提供 FlatZinc model 中使用的所有謂詞的聲明,要么包括任何聲明。 后者可能更有可能,因為我們不應該假設 FlatZinc 模型可以用於不同的求解器,因此該聲明幾乎沒有實際用途。
總結並直接回答您的問題。 這不是錯誤,盡管int_eq_imp
看起來很標准,但它不是 FlatZinc 內置函數的一部分。 目前沒有辦法抑制這些聲明,但求解器可以簡單地忽略所有包含謂詞聲明的行,並在處理約束時處理未知謂詞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.