繁体   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