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

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

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

部分正确性(Partial Correctness)

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

  • c c c是一个程序
  • P P P Q Q Q是一阶逻辑的断言(assertion)
  • P P P, Q Q Q的自由变量可以在程序的变量中随意选择
  • P P P是先验条件(precondition), Q Q Q是后验条件(postcondition)
    { P } c { Q } \{P\}c\{Q\} { P}c{ Q}的含义:
  • 在一个满足 P P P的环境中开始执行 c c c
  • 如果 c c c终止
  • 那么它的最终环境将满足 Q Q Q
    注意,部分正确性没有排除以下两点:
  • 程序执行不终止
  • 程序没有从 P P P开始执行

完全正确性(Total Correctness)

部分正确性没有要求终止
完全正确性是一个更强的声明,写作:
[ P ] c [ Q ] [P]c[Q] [P]c[Q]
[ P ] c [ Q ] [P]c[Q] [P]c[Q]的含义:

  • 如果我们从一个满足 P P P的环境开始执行 c c c
  • 那么 c c c一定终止
  • 而且它最终的环境满足 Q Q Q

断言

给定三元组
{ P } c { Q } \{P\}c\{Q\} { P}c{ Q}
公式 P P P Q Q Q是一阶断言
对于Imp,有用的理论是 T Z ∪ T A T_Z\cup T_A TZTA
P P P Q Q Q中的变量包括程序变量、量词变量、其他逻辑变量,即
v a r s ( Q ) = p v a r s ( Q ) ∪ q v a r s ( Q ) ∪ l v a r s ( Q ) vars(Q)=pvars(Q)\cup qvars(Q)\cup lvars(Q) vars(Q)=pvars(Q)qvars(Q)lvars(Q)

断言的语义

由于 l v a r s ( Q ) lvars(Q) lvars(Q)的存在,我们不能仅依据环境 σ \sigma σ来判断 Q Q Q的值
所以,令 α \alpha α l v a r s ( Q ) lvars(Q) lvars(Q)的变量的一个赋值,那么
( α ∪ σ ) ( x ) ≡ { α ( x ) i f   x ∈ α σ ( x ) i f   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 ( σ ∪ α ) ⊨ T Q σ   s a t i s f i e s   Q   u n d e r   α \sigma \models_{\alpha}Q\qquad(\sigma\cup\alpha)\models_TQ\qquad \sigma~satisfies~Q~under~\alpha σαQ(σα)TQσ satisfies Q

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值