【发布时间】:2013-07-28 01:59:57
【问题描述】:
我试图找到一个循环不变量,以便我们可以证明这个程序部分正确:
{ n >= 1 } pre-condition
i = 1;
z = 1;
while (i != n) {
i = i + 1;
z = z + i*i;
}
{ z = n*(n+1)*(2*n + 1)/6 } post-condition
我真的被困住了。到目前为止,我尝试过的一些不变量是:
z <= n*(n+1)*(2*n + 1)/6 ^ i <= n
和
z = i*(i+1)*(2*i + 1)/6 ^ i <= n
我真的很感激一些建议。
【问题讨论】:
-
会不会是你的后置条件有错字?
... = 6看起来很奇怪(因为它说z总是等于固定数字6)。 -
顺便说一句:您帖子中的符号
^是否代表“求幂”(就像我的回答中所做的那样),或者您是否尝试将符号近似为逻辑“和”(我宁愿写为&&或/\)。我只是问,因为z = ... && i <= n比替代解释更有意义。
标签: while-loop proof correctness formal-verification loop-invariant