簡體   English   中英

解析時選項類型的實例是什么?

[英]What is an instance of Option Type at parsing time?

關於選項類型 ,Minizinc的規范 (第6.6.3節)說:

概述。 使用opt類型構造函數定義的選項類型定義可能存在或可能不存在的類型。 它們類似於Haskell的Maybe類型,即為該類型隱式添加一個新值<>

[...]

初始化。 opt類型變量不需要在實例時初始化。 未初始化的opt類型變量會自動初始化為<>

我想使用兩種opt類型來解析和處理以下約束

predicate alternative(var opt int: s0, var int: d0,
                      array[int] of var opt int: s,
                      array[int] of var int: d);

但是,我不確定解析此約束時作為參數s0s值應該期望什么。

我可以簡單地忽略opt修飾符的存在,並假設約束簽名等於下一個嗎?

predicate alternative(var int: s0, var int: d0,
                      array[int] of var int: s,
                      array[int] of var int: d);

如果沒有,我應該如何處理?

在MiniZinc中,變量選項類型被視為可能不存在的變量。 在編譯器中,將對這些變量進行轉換,並以FlatZinc輸出僅包含實際變量的方式來解釋和重寫這些變量。 通常,這意味着為每個變量添加一個布爾變量,如果且僅當變量“存在”時才為true。

對於庫編寫者,可以選擇用一種方式重寫它,以使您的求解程序能夠最好地處理。 在標准庫中, alternative定義為:

predicate alternative(var opt int: s0, var int: d0,
                  array[int] of var opt int: s,
                  array[int] of var int: d) =
          assert(index_set(s) = index_set(d),
                 "alternative: index sets of third and fourth argument must be identical",
          sum(i in index_set(s))(bool2int(occurs(s[i]))) <= 1 /\
          span(s0,d0,s,d)
      );

注意, occurs內在函數用於測試變量是否存在。 在MiniZinc庫中可以找到有關變量類型的更多內在函數: http : //www.minizinc.org/doc-lib/doc-optiontypes.html 如有必要,您還可以使用let表達式創建額外的變量,然后將該謂詞映射到求解器固有謂詞。

即使您的求解程序沒有更好地分解可選類型謂詞,但仍然可以在沒有選項類型的情況下實現謂詞。 由於MiniZinc的重載,每當用非選項變量類型的數組調用謂詞時,都將使用該實現。 (盡管請注意, alternative謂詞專門用於“可選任務”,不太可能那樣稱呼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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