簡體   English   中英

半具體化的謂詞是否被視為標准的一部分?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM