我尝试使用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策略或其他内容?
答案 0 :(得分:4)
Z3有量词消除策略。我们可以通过使用以下方法创建求解器来启用它:
s = Then('qe', 'smt').solver()
此命令将创建首先应用量词消除的解算器,然后调用SMT求解器。然而,Z3对量化消除非线性公式的支持非常有限。您的示例是非线性的,因为它包含:A * i + B * j + C * k + D <= 0
。
因此,qe
策略将无法消除量词。
如果能够为非线性算法实现更好的QE支持,那就太棒了。