【发布时间】:2013-01-07 17:29:48
【问题描述】:
在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 real arithmetics and data types theories integrating not that well
请注意,该方法似乎工作得很好,但是当尝试添加更多约束并重用求解器时,就会出现此问题。可能是检测错了求解方法?
【问题讨论】:
-
请注意,不鼓励仅链接答案。你的代码 sn-p 真的很小,你应该把它包含在一个问题中