默认情况下,全局变量被视为存在量化。 E.g。
(declare-const x Int)
(assert (exists ((y Int)) (and (= x y) (= x y))))
(check-sat)
(get-model)
给出
sat
(model
(define-fun y!0 () Int
0)
(define-fun x () Int
0)
)
如何将x
视为forall x
,就像在此查询中一样:
(assert (forall ((x Int)) (exists ((y Int)) (and (= x y) (= x y)))))
(check-sat)
(get-model)
获取值y
取决于x
:
sat
(model
(define-fun y!0 ((x!1 Int)) Int
x!1)
)
这应该只是语法问题。是否有可能在z3?在另一个SMT求解器中?
我想要实现的目标是执行如下脚本:
(declare-forall-const x Int)
(declare-const y Int)
(assert (and (= x y) (= x y)))
(check-sat)
(get-model)
得到的反应如下:
sat
(model
(define-fun y!0 ((x!1 Int)) Int
x!1)
)
换句话说,我想宣布" forall"参数全局,并在后续断言中引用它。
答案 0 :(得分:2)
那是不可能的。在SMT求解器中,所有最外层变量都是存在的,但没有人强迫您仅使用最外层变量。如果您只有一个量词范围,则一种流行的方法是否定查询,即,不是检查forall x . phi(x)
的可满足性,而是检查exists x . not phi(x)
的不可满足性。