我有一个关于declare-const
smtlib 的问题。
例如,
在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 的函数符号,该命令将报告错误。
所以排序s
包含在 的整个签名中x
,对吗?
但为什么会这样呢?其背后的动机是什么?
在我的理解中,x
is 是变量标识符,一般来说(例如在一些通用编程语言中)我们不允许用不同的类型声明同一个变量。所以我觉得上面的代码最好是报错。
我曾经认为也许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")
那么上面的代码肯定是错的,为什么不早点报错呢?
PS。如果我使用相同的排序,那么它会报错(那太好了,我希望Bool
案例也能报错):
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")
谢谢。