在SMT中混合理论

时间:2016-05-11 10:20:59

标签: z3 smt

我想构造一个SMT公式,它在整数线性算术和布尔变量上有许多断言,以及在实际非线性算术和布尔变量上的一些断言。整数和实数的断言只共享布尔变量。例如,请考虑以下公式:

(declare-fun b () Bool)
(assert (= b true))

(declare-fun x () Int)
(declare-fun y () Int)
(declare-fun z () Int)
(assert (or (not b) (>= (+ x y) (- x (+ (* 2 z) 1)))))

(declare-fun r () Real)
(assert (or (not b) (= (+ (* r r) (* 3 r) (- 4)) 0)))

如果我用这个公式喂z3,它会立即报告" unknown"。但是如果我删除它的整数部分,我立即得到解决方案,它满足变量" r"的约束。我认为这意味着求解器本身的非线性约束并不难。问题应该是对整数的混合(线性)约束和对实数的(非线性)约束。

所以我的问题如下。使用z3处理这种混合公式的正确方法是什么(如果有的话)?我对DPLL(T)的理解是它应该能够使用不同的理论求解器来处理这些公式以适应不同的约束。如果我错了,请纠正我。