Z3的qe策略返回的公式的范式

时间:2018-11-11 07:09:44

标签: z3 smt z3py quantifiers

我正在通过Z3py使用Z3的量词消除策略,并尝试了以下示例。

from z3 import *
x,y,xp,yp = Ints('x y xp yp')
t = Tactic('qe')

t(Exists((xp, yp), And(xp==x+1, yp==y+2, xp<=8, xp >=1, yp<=12, yp>=2)))
#returns: [[y <= 10, y >= 0, x <= 7, x >= 0]]

t(Exists((xp, yp), Implies(x<10 , And(xp==x+1, yp==y+2, xp<=8, xp >=1, yp<=12, yp>=2))))
#returns: [[Or(10 <= x, And(y <= 10, y >= 0, And(x <= 7, x >= 0)))]]

我认为生成的公式是无量词的DNF(这是我需要的),但是我在API文档中找不到任何可以保证它的内容。有人知道qe是否总是以DNF返回公式吗?

我(如果有的话)在哪里可以找到有关战术的此类细节,而不必深入研究原始源代码?

编辑:所有公式都限于线性整数运算。

1 个答案:

答案 0 :(得分:1)

通过设计,策略可以“尽力而为”。也就是说,尽管qe旨在消除量词,但最终可能会失败,从而使目标堆栈保持不变。

请注意,消除量词不仅是一种策略,而且是它们的完整集合,具体取决于基准测试中涉及的其他理论。查看目录:https://github.com/Z3Prover/z3/tree/master/src/qe