程序验证(十二):完全正确性

程序验证(十二):完全正确性

完全正确性

完全正确性(total correctness),写作: [ P ] c [ Q ] [P]c[Q] [P]c[Q],意思是:

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

良基关系(Well-Founded Relations)

集合 S S S上的一个二元关系 ≺ \prec 是一个良基关系,当且仅当:

  • S S S中不存在无限序列 s 1 , s 2 , s 2 , … s_1,s_2,s_2,\dots s1,s2,s2,,使得对于所有 i > 0 i>0 i>0都有 s i + 1 ≺ s i s_{i+1}\prec s_i si+1si
  • 也就是说, S S S中每个下降序列都是有限的

词法意义上的良基关系

给定集合 S 1 , … , S n S_1,\dots ,S_n S1,,Sn和关系 ≺ 1 , … , ≺ n \prec_1 ,\dots ,\prec_n 1,,n,令 S = S 1 × ⋯ × S=S_1\times\dots\times S=S1××
定义关系 ≺ \prec :
( s 1 , … , s n ) ≺ ( t 1 , … , t n ) ⇔ ⋁ i = 1 n ( s i ≺ i t i ∧ ⋀ j = 1 i − 1 s j = t j ) (s_1 ,\dots ,s_n)\prec (t_1 ,\dots ,t_n)\Leftrightarrow \bigvee ^n_{i=1} (s_i\prec_i t_i\wedge\bigwedge ^{i-1}_{j=1} s_j=t_j) (s1,,sn)(t1,,tn)i=1n(siitij=1i1sj=tj)
解释一下, ( s 1 , … , s n ) ≺ ( t 1 , … , t n ) (s_1 ,\dots ,s_n)\prec (t_1 ,\dots ,t_n) (s1,,sn)(t1,,tn)当且仅当:

  • 在某一位置 i i i s i ≺ i t i s_i\prec_i t_i siiti
  • 而对于所有之前的位置 j j j s j = t j s_j=t_j sj=tj

证明完全正确性

为了证明程序终止,我们需要:

  • 在程序的状态上构造一个良基关系 ≺ \prec
  • 证明每一个基础路径的的输出状态都“小于”输入状态
    如果满足以上两点,那么程序一定终止,否则就存在一个程序状态的无限序列,这可以被映射到 ≺ \prec 上的一个无限下降序列
    与以上两步相对应,我们需要:
  • 找到一个函数 δ \delta δ将程序状态映射到一个带有已知良基关系 ≺ \prec 的集合 S S S
  • 证明 δ \delta δ在每一个基础路径上依据 ≺ \prec 都是下降的
    函数 δ \delta δ被称为秩函数(ranking function)

对于秩函数的注释

我们用带有 ↓ \downarrow 的代码注释秩函数
需要在函数的循环头位置注释

v c vc vc

v c vc vc即为
P → w l p ( c 1 ; …   ; c n , δ ( x ) ≺ δ ( x ′ ) ) [ x / x ′ ] P\to wlp(c_1;\dots ;c_n,\delta (x)\prec \delta (x'))[x/x'] Pwlp(c1;;cn,δ(x)δ(x))[x/x]
计算的时候用 x ′ x' x代表开始时 x x x的值,计算完毕后再换回来。

你可能感兴趣的:(数学与逻辑)