z3 Real Exponentiation

时间:2016-04-07 22:13:40

标签: python python-3.x z3 z3py

我遇到了一个奇怪的情况,其中z3py为逻辑上相同的问题产生两个单独的答案。

版本1:

>>> import z3
>>> r, r2, q = z3.Reals('r r2 q')
>>> s = z3.Solver()
>>> s.add(r > 2, r2 == r, q == r2 ** z3.RealVal(0.5))
>>> s.check()
unknown

第2版

>>> import z3
>>> r, r2, q = z3.Reals('r r2 q')
>>> s = z3.Solver()
>>> s.add(r > 2, r2 == r, q * q == r2)
>>> s.check()
sat

如何更改我正在使用的版本1,以便产生准确的结果?这些约束是即时生成的,如果我试图在运行中重新编写它们,可能会大大增加应用程序的复杂性。此外,在根是真正的符号的情况下,Python本身根本无法解决该问题。

编辑:我发现如果我为我的解算器使用以下设置,它将成功解决(虽然有点慢):

z3.Then("simplify","solve-eqs","smt").solver()

然而,我并不完全清楚指明那些而不仅仅是默认求解器的含义。

1 个答案:

答案 0 :(得分:1)

Z3在非线性实际问题上的开箱即用表现并不是很好,它肯定需要花些时间才能找到你需要的所有解决方案。我的第一次尝试总是切换到NLSAT求解器(应用qfnra-nlsat策略,或者从中做出求解器)。这个解算器在QF_NRA问题上通常要好得多,但它并不支持任何理论组合,即,如果你有其他类型的变量,它将会纾困。

此外,搜索" Z3"的堆栈溢出并且"非线性",对其各个方面存在大量问题和答案。