程序验证(九):程序正确性规范
什么是程序的正确性?应当在指定的前提下,进行预定的行为,达到指定的结果。
部分正确性(Partial Correctness)
部分正确性指的是一个程序的停止行为
我们将部分正确性用霍尔三元组(Hoare triples)表达:
{
P}c{
Q}\{P\}c\{Q\}{
P}c{
Q}
这里:
- ccc是一个程序
- PPP和QQQ是一阶逻辑的断言(assertion)
- PPP, QQQ的自由变量可以在程序的变量中随意选择
- PPP是先验条件(precondition),QQQ是后验条件(postcondition)
{ P}c{ Q}\{P\}c\{Q\}{ P}c{ Q}的含义: - 在一个满足PPP的环境中开始执行ccc
- 如果ccc终止
- 那么它的最终环境将满足QQQ
注意,部分正确性没有排除以下两点: - 程序执行不终止
- 程序没有从PPP开始执行
完全正确性(Total Correctness)
部分正确性没有要求终止
完全正确性是一个更强的声明,写作:
[P]c[Q][P]c[Q][P]c[Q]
[P]c[Q][P]c[Q][P]c[Q]的含义:
- 如果我们从一个满足PPP的环境开始执行ccc
- 那么ccc一定终止
- 而且它最终的环境满足QQQ
断言
给定三元组
{
P}c{
Q}\{P\}c\{Q\}{
P}c{
Q}
公式PPP与QQQ是一阶断言
对于Imp,有用的理论是TZ∪TAT_Z\cup T_ATZ∪TA
PPP或QQQ中的变量包括程序变量、量词变量、其他逻辑变量,即
vars(Q)=pvars(Q)∪qvars(Q)∪lvars(Q)vars(Q)=pvars(Q)\cup qvars(Q)\cup lvars(Q)vars(Q)=pvars(Q)∪qvars(Q)∪lvars(Q)
断言的语义
由于lvars(Q)lvars(Q)lvars(Q)的存在,我们不能仅依据环境σ\sigmaσ来判断QQQ的值
所以,令α\alphaα为lvars(Q)lvars(Q)lvars(Q)的变量的一个赋值,那么
(α∪σ)(x)≡{
α(x)if x∈ασ(x)if x∈σ(\alpha \cup\sigma)(x)\equiv \begin{cases} \alpha(x) &if~x\in\alpha\\ \sigma(x) &if~x\in\sigma\end{cases}(α∪σ)(x)≡{
α(x)σ(x)if x∈αif x∈σ
断言的可满足性与永真性:
σ⊨αQ(σ∪α)⊨TQσ satisfies Q under α\sigma \models_{\alpha}Q\qquad(\sigma\cup\alpha)\models_TQ\qquad \sigma~satisfies~Q~under~\alphaσ⊨αQ(σ∪α)⊨TQσ satisfies Q under α
σ⊨Q∀α.(σ∪α)⊨TQQ is valid in σ\sigma\models Q\qquad \forall \alpha. (\sigma\cup\alpha)\models_TQ\qquad Q~is~valid~in~\sigmaσ⊨Q∀

本文探讨了程序的正确性,包括部分正确性和完全正确性,并使用霍尔三元组进行形式化表达。重点讲解了断言的语义、部分正确性的逻辑以及如何通过霍尔逻辑进行三元组的证明,涉及跳过、赋值、逻辑加强与削弱、条件和while循环等。此外,文章还讨论了可靠性和完备性在程序验证中的重要性。
最低0.47元/天 解锁文章

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



