我遇到了一个奇怪的情况,其中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()
然而,我并不完全清楚指明那些而不仅仅是默认求解器的含义。
答案 0 :(得分:1)
Z3在非线性实际问题上的开箱即用表现并不是很好,它肯定需要花些时间才能找到你需要的所有解决方案。我的第一次尝试总是切换到NLSAT求解器(应用qfnra-nlsat
策略,或者从中做出求解器)。这个解算器在QF_NRA问题上通常要好得多,但它并不支持任何理论组合,即,如果你有其他类型的变量,它将会纾困。
此外,搜索" Z3"的堆栈溢出并且"非线性",对其各个方面存在大量问题和答案。