我有一个关于在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中创建局部变量。
有人可以帮忙吗?
答案 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映射中的键,因为相等会被重载以构造 检查表达式语义相等的新表达式, 而不是检查表达式的句法相等性。)