将非线性Real与线性Int结合起来

时间:2013-10-29 14:45:59

标签: z3

我已阅读有关非线性算术和未解释函数的帖子。我对SMT世界还很陌生,如果我没有使用正确的词汇,那么道歉,或者这是一个糟糕的问题。

对于以下代码,有一些断言放在不相关的顶级断言(assert (> i 10))上方的堆栈上。但是,对于Reals的情况,Z3返回不满(第一次推送到第一个pop)。我认为这与Z3尝试使用Int解算器有关,因为第一个断言是在Int上,而Z3将e1赋给(/ 1.0 2.0),这是一个没有Int表示的数字,因为约束{{ 1}}(如果我删除此约束,它可以工作)。使用(assert (< e3 1))解决了Reals的问题,但是对于Ints的情况返回(check-sat-using qfnra-nlsat),但是,我仍然可以获得满足约束的Int情况的模型。

unknown

是否有单独的调用来检查我是否可以在所有情况下使用,或者我是否需要使用(set-option :global-decls false) (declare-const i Int) (assert (> i 10)) (push) (declare-const e1 Real) (declare-const e2 Real) (define-fun e3 () Real (/ e1 e2)) (assert (> e1 0)) (assert (> e2 0)) (assert (< e3 1)) ;(check-sat-using qfnra-nlsat) (check-sat) (pop) (push) (declare-const e1 Int) (declare-const e2 Int) (define-fun e3 () Int (div e1 e2)) (assert (> e2 0)) (assert (> e3 0)) ;(check-sat-using qfnra-nlsat) (check-sat) (pop) ,具体取决于所声明的类型?

1 个答案:

答案 0 :(得分:3)

由于您正在混合实数和整数排序,我认为您需要使用check-sat-using。来自How does Z3 handle non-linear integer arithmetic?

“非线性实数算术(NLSat)求解器默认不用于非线性整数问题。它通常对整数问题非常无效。但是,我们可以强制Z3甚至对整数问题使用NLSat。”

你强迫Z3在(check-sat-using qfnra-nlsat)的整数约束上使用非线性实数算术求解器。以下是使用z3py在Python中执行此操作的方法:z3 fails with this system of equations

我想在未来的某个时刻(尽管开发者可以证实)你不必这样做,但我听到的最后一次(见mixing reals and bit-vectorsUsing Z3Py online to prove that n^5 <= 5 ^n for n >= 5),非线性真实算术求解器策略尚未与其他解算器完全集成。