程序验证(九):程序正确性规范
什么是程序的正确性?应当在指定的前提下,进行预定的行为,达到指定的结果。
部分正确性(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 TZ∪TA
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