z3求解器解决方案问题

时间:2014-04-08 21:29:28

标签: python constraints z3 z3py

p = Int('p')
q = Int('q')

s = Solver()
s.add(1<=p<=9, 1<=q<=19, 5<(3*p-4*q)<10)
s.check() 
print s.model()

返回sat,并给出解决方案

[p = 0, q = 0]

不满足约束条件。如果我删除最后的约束,它将返回 一个明智的对,满足前两个(微不足道的)约束。发生了什么事?

永久链接可以在线试用:http://rise4fun.com/Z3Py/fk4


编辑:我是z3的新手,所以我有可能做错了,请告诉我。

1 个答案:

答案 0 :(得分:5)

Z3不支持使用Python的比较链,即a < b < ca < b and b < c相同。如果不重载and,则无法使Z3支持它,这在Python中是不可能的。 所以a < b < c应该写成:

b_ = b
Z3.And(a < b_, b_ < c)

仅评估表达式b一次。


s.add行替换为:

s.add(1<=p, p<=9, 1<=q, q<=19, 5<(3*p-4*q), (3*p-4*q)<10)

我明白了:

[p = 6, q = 3]

所以你必须把它们拆开,就像我上面为解算器做的那样。


Python将1<=p<=9扩展为1<=p and p<=9,当解释为p<=9 bool(1 <= p)Trues.add(p<=9, q<=19, (3*p-4*q)<10) 时,问题中的代码会导致求解为:

[p = 0, q = 0]

{{1}}是其中一种解决方案。