我正在为以下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) )
答案 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