使用Z3 Python消除量词

时间:2013-02-19 01:18:28

标签: z3 z3py

我尝试使用g = And(ForAll([i, j, k], Implies(And(k <= 0, A * i + B * j + C * k + D <= 0), k + i - j <= 0)),Not(And(A==0,B==0,C==0)))找到满足公式solve(g)的A,B,C,D的值。这有许多可能的解决方案,一个是A=1,B=-1,C=D=0但是Z3似乎无法做到这一点(solve(g)没有终止)。

Z3可以做这种非线性(但很简单)的公式吗?也许我可以为此指定一些QE策略或其他内容?

1 个答案:

答案 0 :(得分:4)

Z3有量词消除策略。我们可以通过使用以下方法创建求解器来启用它:

s = Then('qe', 'smt').solver()

此命令将创建首先应用量词消除的解算器,然后调用SMT求解器。然而,Z3对量化消除非线性公式的支持非常有限。您的示例是非线性的,因为它包含:A * i + B * j + C * k + D <= 0。 因此,qe策略将无法消除量词。

如果能够为非线性算法实现更好的QE支持,那就太棒了。