Z3 SMT中的混合理论

Z3 SMT中的混合理论,z3,smt,dpll,Z3,Smt,Dpll,我想构造一个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

我想构造一个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,它会立即报告“未知”。但是如果我去掉它的整数部分,我会马上得到解,它满足变量“r”的约束。我认为这意味着非线性约束本身对解算器来说并不难。问题应该是混合整数上的(线性)约束和实数上的(非线性)约束


因此,我的问题如下。使用z3(如果有)处理此类混合配方的正确方法是什么?我对DPLL(T)的理解是,它应该能够针对不同的约束使用不同的理论解算器来处理此类公式。如果我错了,请纠正我。

正如George在评论中所说,Z3中的非线性解算器非常脆弱,开箱即用的性能也不太好。也就是说,stackoverflow上有许多关于此问题的问题和答案,例如,请参见以下内容:


根据我的经验,Z3中的非线性算术处理程序相当脆弱,能否工作取决于预处理过程是否成功。在许多情况下,您最好自己执行线性化(例如,用区间化替换非线性算术),谢谢!那么你认为这个问题与理论混合无关?是的,我就是这么想的。对于上面涉及的理论有两种合理的解释:混合实数和整数的理论,或者实数理论和整数理论的结合。AFAIK所有SMT解算器都将其解释为混合实数和整数的理论。QF非线性混合整数和实数理论包含希尔伯特第十个问题。所以有一个理论涉及其中,它是不可判定的,它超出了nlsat算法所解决的问题。你很可能在“我是否应用nlsat?”和线性混合解算器的防护之外。(克里斯托夫,亚历克赛怎么能证实这一点呢?)好的,谢谢!我知道非线性整数运算的不可判定性。但我不是SMT方面的专家。因此,我认为典型的SMT解算器应该能够以某种方式检测断言所属的理论,并使用相应的理论解算器处理该断言(例如,在我的例子中,线性整数解算器用于第一个断言,非线性实数解算器用于第二个断言)。这是我对DPLL(T)工作原理的理解。但在实践中可能并非如此(或者我的理解完全错误),如果可能的话,SMT解算器会尝试使用一个理论解算器来处理所有断言。谢谢!你是说这个问题与理论混合无关,是因为z3处理非线性约束的方式造成的吗?如果是,那么我会检查你列出的参考文献。非线性约束本身是脆弱的,但将它们与其他理论混合会使情况更糟。