ForAll in Z3.py



我有一个关于在 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 以外的所有常量,因为它是 ForAll 中的局部变量,但模型显示该解决方案适用于所有常量,包括 a0。

在SMT中创建局部变量是可能的,但在python中则不行。

谁能帮忙?

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

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 映射中的键,因为构造时会重载相等用于检查表达式语义相等性的新表达式,而不是检查表达式的句法相等性)。

最新更新