如何找到此代码的最强循环不变性?

时间:2019-03-20 22:34:52

标签: validation formal-verification loop-invariant proof-of-correctness

我正在为以下while循环想出一个循环不变式,但遇到了一些麻烦。

确定了循环不变式后,我想将证明表放在一起,并显示所有中间断言

ASSERT(k >= 0)
{i = 1;
 sum = 1;
 while (i <= k) { 
     sum = sum + 2*i + 1;
     i = i+1;
 } //end-while
}
ASSERT( sum == (k+1)*(k+1) )

2 个答案:

答案 0 :(得分:1)

INV(1) = {sum == (n+1)*(n+1)}  
INV(2) = {0<=n<=k}

sum = 1适用于n = 0
现在,尝试证明它确实适用于n + 1(如果对n适用),直到n达到k(在您的情况下,我的n是您的i

答案 1 :(得分:0)

请注意,当循环存在时,let childrenPlusGrandchildrenCount = parent.childs.flatMap { $0.grandchilds }.count + parent.childs.count 的值为i,即似乎是一个很好的不变性:

k+1