【发布时间】:2021-02-03 04:51:45
【问题描述】:
我正在阅读这篇研究论文:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.365.9467&rep=rep1&type=pdf
因此,总而言之,他们正在通过实例化(通过 E 匹配)将量化的 horn 子句转换为无量词的 horn 子句,并在论文的图 6 中给出了生成的验证条件 (VC)。
根据我的理解,本文建议将图 6 中生成的 VC 传递给任何 SMT 求解器,因为 VC 现在没有量词并且可以由任何 SMT 求解器求解。 (如果我在这方面错了,请纠正我。)
因此,根据这种理解,我尝试使用 z3py 编写图 6 VC。
编辑: 我的目标是找到图 6 中 VC 的解决方案。我应该添加什么作为 z3 推断的不变 P 的返回类型?有没有更好的方法使用 z3 来做到这一点?感谢您的宝贵时间!
代码如下:
from z3 import *
Z = IntSort()
B = BoolSort()
k0, k1, k2, N1, N2 = Ints('k0, k1, k2, N1, N2')
i0, i1, i2 = Ints('i0, i1, i2')
P = Function('P', B, Z)
a0 = Array('a0', Z, B)
a1 = Array('a1', Z, B)
a2 = Array('a2', Z, B)
prove(And(Implies(i0 == 0, P( Select(a0,k0), i0) ),
Implies(And(P(Select(a1, k1),i1), i1<N1), P(Select(Store(a1, i1, 0)), i1+1) ),
Implies(And(P(Select(a2,k2), i2), not(i2<N2)), Implies(0<=k2<=N2, a2[k2]) )))
【问题讨论】:
-
Function('P', B, Z)是一个从 B 到 Z 的函数;声明缺少第二个参数或返回类型。 -
真的!我错过了返回类型。根据我在问题中引用的研究论文,这是一个要推断的不变量。正如论文中提到的那样,我不确定求解器将如何推断它,以及不变量的返回类型是什么。
标签: z3 z3py quantifiers first-order-logic hoare-logic