设置Z3表达式的操作

时间:2013-01-11 22:21:36

标签: z3

是否存在通过Z3表达式定义集合操作的函数,例如set, intersection, union, members等?此外,还有功能可以检查公式是cnf还是dnf

如果没有,我可以尝试在z3utils文件中实现它们。

1 个答案:

答案 0 :(得分:1)

我们可以使用Python集来编码表达式集。唯一的问题是Z3Py表达式的运算符__eq__将构建一个新表达式,而不是比较表达式是否相等。要解决这个问题,我们可以使用一个调用正确比较Z3表达式的包装器。以下是一个示例(可在rise4fun在线获取)。

class AstRefKey:
    def __init__(self, n):
        self.n = n
    def __hash__(self):
        return self.n.hash()
    def __eq__(self, other):
        return self.n.eq(other.n)
    def __repr__(self):
        return str(self.n)

def askey(n):
    assert isinstance(n, AstRef)
    return AstRefKey(n)

x = Int('x')
s = set()
s.add(askey(x+1))
s.add(askey(x))
print s
print askey(x + 1) in s
s2 = set()
s2.add(askey(x+2))
s2.add(askey(x))
print s2
print s.union(s2)

唯一的不便是我们必须继续使用askey。我们可以通过定义包含Python ASTSet对象的类set来为我们调用askey来避免这种不便。

关于dnfcnf识别器。此功能未在外部API中公开。