程序验证(九):程序正确性规范

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序验证(九):程序正确性规范

什么是程序的正确性?应当在指定的前提下,进行预定的行为,达到指定的结果。

部分正确性(Partial Correctness)

部分正确性指的是一个程序的停止行为
我们将部分正确性用霍尔三元组(Hoare triples)表达:
{ P}c{ Q}\{P\}c\{Q\}{ P}c{ Q}
这里:

  • ccc是一个程序
  • PPPQQQ是一阶逻辑的断言(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}
公式PPPQQQ是一阶断言
对于Imp,有用的理论是TZ∪TAT_Z\cup T_ATZTA
PPPQQQ中的变量包括程序变量、量词变量、其他逻辑变量,即
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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值