请参阅http://rise4fun.com/Z3Py/GTYu上的 PyZ3 程序。第一次调用check()
工作正常,但如果我们向求解器添加约束并check()
再次调用,我们会得到一个不一致的模型!
sy_i = Bool('sy_i')
s0_v, s1_v, s2_v, sx_v, sy_v = Reals('s0_v s1_v s2_v sx_v sy_v')
c = [s0_v >= 1,
sx_v >= 1,
s1_v >= s0_v * sx_v,
sy_v >= 1,
Or(Not(sy_i), s1_v == RealVal(0.0)),
s2_v >= s1_v * sy_v
]
solver = Solver()
solver.add(c)
print solver.check()
print solver.model()
solver.add(True)
solver.check()
print solver.model()
有人知道发生了什么吗?
不稳定的 Z3 版本得到相同的结果。
附加上下文:
该程序是使用组合nlsat
和bool
求解器的更大程序的简化,遵循答案的重要建议:Z3 真实算术和数据类型理论集成不太好
请注意,该方法似乎工作得很好,但是当尝试添加更多约束并重用求解器时,就会出现这个问题。也许它错误地检测到了解决方法?