我想在z3py中声明一个“必须存在的东西”的约束。我尝试使用“不(存在(...))”。一个简单的例子如下。我想为a和b找到一个赋值,这样c就不存在了。
from z3 import *
s = Solver()
a = Int('a')
b = Int('b')
c = Int('c')
s.add(a+b==5)
s.add(Not(Exists(c,And(c>0,c<5,a*b+c==10))))
print s.check()
print s.model()
输出
sat
[b = 5, a = 0]
这似乎是正确的。 但是当我在一个更复杂的问题中编写“Not(Exists(...))”约束时,如果不生成解决方案则需要数小时。 我想知道这是否是断言“不存在”约束的正确和最有效的方法?或者量词的这些问题本质上难以被任何求解器解决?
答案 0 :(得分:2)
你写这个约束的方式很好。并且Z3(或任何其他解算器)很难解决这样的问题也就不足为奇了,因为你有量词和非线性算术。这些问题本质上难以解决。
您可以查看Z3的nlsat
策略,这可能会让您感到宽慰:How does Z3 handle non-linear integer arithmetic?
或者,您可以尝试real
而不是整数或位向量(即机器整数)。当然,您是否可以实际使用这些类型取决于您的问题域。 (实际上,Reals会有&#34;小数&#34;值,并且bitvectors需要进行模运算。)