python - z3 Solver 解决问题

标签 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 的新手,所以我有可能做错了一些可怕的事情,请告诉我。

最佳答案

Z3 不支持使用 Python 的比较链,即 a < b < ca < b and b < c相同.不重载就不能让Z3支持它and这在 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<=91<=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]是解决方案之一。

关于python - z3 Solver 解决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22948557/

相关文章:

z3 - "quantifier free logic"在 SMT 上下文中是什么意思?

python - Z3py:打印包含 144 个变量的大型公式

python - 无法分配 "40": "Group.groupParent_id" must be a "Group" instance

python - 分别改变并行进程中的不同python对象

python - 比较两个电子表格并提取值

sql-server - SQL Server : Unique Composite Key that looks order

基于 Scala 约束的类型和文字

python - 使用 pyparsing 累积

c# - C#-将参数约束为Type的实例

java - Z3 Java : simplify a distributive expression