簡體   English   中英

為什么 smtlib/z3/cvc4 允許多次聲明同一個常量?

[英]Why does smtlib/z3/cvc4 allow to declare the same constant more than once?

我對 smtlib 中的declare-const有疑問。

例如,

在z3/cvc4中,以下程序不報錯:

C:\Users\Chansey>z3 -in
(declare-const x Int)
(declare-const x Bool)

在 smt-lib-reference 中,它說

(declare-fun f (s1... sn) s)... 如果名稱為 f 的 function 符號已經存在於當前簽名中,該命令將報告錯誤。

所以 sort s包含在x的整個簽名中,對嗎?

但為什么會這樣呢? 其背后的動機是什么?

在我的理解中, x是變量標識符,通常(例如在某些通用編程語言中)我們不允許用不同類型聲明相同的變量。 所以我覺得上面的代碼最好報錯。

我曾經想過也許z3/smtlib可以支持重定義?,但不...

C:\Users\Chansey>z3 -in
(declare-const x Int)
(declare-const x Bool)
(assert (= x true))
(error "line 3 column 11: ambiguous constant reference, more than one constant with the same sort, use a qualified expre
ssion (as <symbol> <sort>) to disambiguate x")

那么上面的代碼肯定是錯誤的,為什么不早點報錯呢?

附言。 如果我用同樣的sort,那么就會報錯(那太好了,希望Bool case也能報錯):

C:\Users\Chansey>z3 -in
(declare-fun x () Int)
(declare-fun x () Int)
(error "line 2 column 21: invalid declaration, constant 'x' (with the given signature) already declared")

謝謝。

在 SMTLib 中,符號不僅通過其名稱來標識,還通過其類別來標識。 使用相同的名稱完全沒問題,只要您有不同的類型,正如您觀察到的那樣。 這是一個例子:

(set-logic ALL)
(set-option :produce-models true)
(declare-fun x () Int)
(declare-fun x () Bool)

(assert (= (as x Int) 4))
(assert (= (as x Bool) true))
(check-sat)
(get-model)
(get-value ((as x Int)))
(get-value ((as x Bool)))

這打印:

sat
(
  (define-fun x () Bool
    true)
  (define-fun x () Int
    4)
)
(((as x Int) 4))
(((as x Bool) true))

請注意我們如何使用as結構來消除兩個x之間的歧義。 這在 http 的第 3.6.4 節中有解釋://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf

話雖如此,我確實同意你引用的文件部分對此不是很清楚,也許可以使用一些澄清文本。

關於允許這種用法的動機是什么:有兩個主要原因。 第一個是簡化 SMTLib 的生成。 請注意,SMTLib 通常不適合手寫。 它通常由在底層使用 SMT 求解器的更高級別的系統生成。 因此,當您將 SMTLib 用作高級系統和求解器本身之間的中間語言時,只要可以通過顯式排序注釋區分它們,就可以靈活地允許符號共享名稱。 但是,當您手動編寫 SMTLib 時,如果可以的話,您可能應該避免這種重復,至少為了清楚起見。

第二個原因是允許使用有限形式的“重載”。 例如,想想 SMTLib function distinct 這個 function 可以對 object 的任何類型( IntBoolReal等)進行操作,但它總是被稱為distinct (我們沒有distinct-intdistinct-bool等)求解器通過做一些分析來“區分”你的意思,但如果它不能,你也可以通過as聲明來幫助它. 因此,可以以這種方式重載理論符號, =+*等也是如此。當然,SMTLib不允許用戶定義此類重載名稱,但正如文檔在第 29 頁腳注中所述91,將來可能會取消此限制。

暫無
暫無

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

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