是否有SMT语言或Z3扩展的全局forall结构?

时间:2016-02-13 07:47:35

标签: constraints z3 solver smt

默认情况下,全局变量被视为存在量化。 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"参数全局,并在后续断言中引用它。

1 个答案:

答案 0 :(得分:2)

那是不可能的。在SMT求解器中,所有最外层变量都是存在的,但没有人强迫您仅使用最外层变量。如果您只有一个量词范围,则一种流行的方法是否定查询,即,不是检查forall x . phi(x)的可满足性,而是检查exists x . not phi(x)的不可满足性。