z3py:断言“不存在的东西”约束的正确方法是什么

时间:2015-07-12 18:44:35

标签: z3 exists smt z3py quantifiers

我想在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(...))”约束时,如果不生成解决方案则需要数小时。 我想知道这是否是断言“不存在”约束的正确和最有效的方法?或者量词的这些问题本质上难以被任何求解器解决?

1 个答案:

答案 0 :(得分:2)

你写这个约束的方式很好。并且Z3(或任何其他解算器)很难解决这样的问题也就不足为奇了,因为你有量词和非线性算术。这些问题本质上难以解决。

您可以查看Z3的nlsat策略,这可能会让您感到宽慰:How does Z3 handle non-linear integer arithmetic?

或者,您可以尝试real而不是整数或位向量(即机器整数)。当然,您是否可以实际使用这些类型取决于您的问题域。 (实际上,Reals会有&#34;小数&#34;值,并且bitvectors需要进行模运算。)