是否存在通过Z3表达式定义集合操作的函数,例如set, intersection, union, members
等?此外,还有功能可以检查公式是cnf
还是dnf
?
如果没有,我可以尝试在z3utils文件中实现它们。
答案 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
来避免这种不便。
关于dnf
和cnf
识别器。此功能未在外部API中公开。