【发布时间】:2020-11-06 09:52:12
【问题描述】:
我注意到 python 的 Z3 Solver library 没有正确报告我正在处理的涉及指数的问题的可满足性。具体来说,它报告说在我知道有效解决方案的情况下找不到解决方案——除非我添加了有效地“告诉它答案”的约束。
我简化了问题以隔离它。在下面的代码中,我要求它找到q 和m 这样q^m == 100。有了约束0 <= q < 100,你当然有q=10, m=2。但是使用下面的代码,它报告找不到解决方案 (raise Z3Exception("model is not available")):
import z3.z3 as z
slv = z.Solver()
m = z.Int('m')
q = z.Int('q')
slv.add(100 == (q ** m))
slv.add(q >= 0)
slv.add(q < 100)
slv.add(m >= 0)
slv.add(m <= 100)
slv.check()
但是,如果将slv.add(m <= 100)) 替换为slv.add(m <= 2)(或slv.add(m == 2)!),则找到(q=10, m=2)的解决方案没有问题。
-
我是否以某种方式使用了 Z3 错误?
-
我认为,如果它证明没有解决方案,它只会报告不可满足性(“模型不可用”),否则会在搜索解决方案时挂起。那是错的吗?没想到只有在你缩小搜索空间的情况下才能找到解决方案。
除了求幂(例如加法、取模等)之外,我在任何其他运算中都没有遇到过这个问题。
【问题讨论】:
标签: python constraints z3 solver exponent