在Z3.py中的所有

时间:2015-06-13 14:05:52

标签: python z3 z3py

我有一个关于在Z3.py中使用ForAll的问题。我想在ForAll声明中创建一个局部变量,如下所示:

A = DeclareSort('A')
a0,a1,a2,a3 = Consts('a0 a1 a2 a3', A)

s = Solver()
f = Function('f', A, A, BoolSort())
s.add(ForAll ([a0],(f(a0, a0))))

print (s.check())
print (s.model())

结果应该应用于除a0之外的所有Consts,因为它是ForAll中的局部变量,但模型显示解决方案适用于所有Consts,包括a0。

可以在SMT中创建局部变量,但不能在python中创建局部变量。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

以下是该模型提供的内容:

sat
[elem!0 = A!val!0, f = [else -> True]]

它引入了一个名为" elem!0"具有独特的价值" A!val!0" (这是Z3产生新价值的方式")。 给出f的解释,使f始终为真。

如果要对列表中列出的变量而不是进行量化,那么您应该这样做 遍历被量化的公式并收集未包含在集合中的变量。行走表达时有三种情况需要考虑: 它可以满足以下属性之一:

 is_quantifier(e), is_app(e), is_var(e)

表达式' e'如果is_app(e)为True,则为未解释的常量, 子女数量为0(len(e.children())== 0), 此外,当访问e.decl()。kind()时,您将获得未解释的类型。

您可以使用" e.get_id()"检索对应于表达式的唯一标识符。这可以在python映射中使用(你不能将表达式本身用作python映射中的键,因为相等会被重载以构造 检查表达式语义相等的新表达式, 而不是检查表达式的句法相等性。)