单赋值程序验证形式化:原理与实践
1. 程序验证中的挑战
1.1 指数爆炸问题
在程序验证领域,指数爆炸是一个常见且棘手的问题。考虑一个由 $n$ 个条件语句组成的程序,每个条件语句都会使执行路径数量翻倍,所以该程序共有 $2^n$ 条执行路径。以 Hoare 逻辑的 (if) 规则为例,若采用反向传播策略,从给定的后置条件 $\psi$ 开始,它会通过最后一个条件语句的两个分支进行传播,产生两个断言 $\varphi_t$ 和 $\varphi_f$,这两个断言可能都包含 $\psi$ 的出现。它们会被组合成一个断言 $\varphi$,例如 $(\mathrm{b} \to \varphi_t) \land (\neg \mathrm{b} \to \varphi_f)$,其中 $\psi$ 可能出现两次。接着,(seq) 规则会将 $\varphi$ 作为程序前缀的后置条件,重复这个过程,从而产生指数模式。
类似地,在一系列赋值语句中,如果右侧包含同一变量的多次出现,通过复制变量而非断言也可能产生指数模式。例如,将包含单个 $z$ 出现的断言反向传播通过序列 y := x + x ; z := y + y ,会产生一个包含 4 个 $x$ 出现的公式。
1.2 适配不完全性
假设一个代码块已相对于某个规范被证明是正确的,例如三元组 ${n \geq 0 \land \mathrm{naux} = n} \ \mathrm{Fact} \ {f = \mathrm{naux}!}$,该规范使用了一个辅助变量 $\mathrm{naux}$。这些变量没有特殊地位,它们只是不作为程序变量使用,可以安全地
超级会员免费看
订阅专栏 解锁全文
1952

被折叠的 条评论
为什么被折叠?



