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
答案 0 :(得分:5)
Z3不支持使用Python的比较链,即a < b < c
与a < 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)
为True
为s.add(p<=9, q<=19, (3*p-4*q)<10)
时,问题中的代码会导致求解为:
[p = 0, q = 0]
{{1}}是其中一种解决方案。