循环不变量证明



我遇到了一个后置条件的问题,并显示了这段代码的部分正确性。

{ m = A ≥ 0 }
  x:=0; odd:=1; sum:=1;
  while sum<=m do
    x:=x+1; odd:=odd+2; sum:=sum+odd
  end while
{ Postcondition }

我不是在寻找答案,因为这是学校的作业,只是洞察力和一些指向正确方向的东西。我已经构造了一个值表,但是不能写出循环不变式。

x   odd sum m   (x + 1)^2   odd - x (odd - x)^2
0   1   1   30    1            1        1
1   3   4   30    4            2        4
2   5   9   30    9            3        9
3   7   16  30    16           4        16
4   9   25  30    25           5        25
5   11  36  30    36           6        36
sum = (odd - x)^2

我知道循环的结果是m后面的完全平方,但我不确定如何写。

一如既往,感谢所有的帮助。

循环不变量为:

odd = 2x+1
sum = (x+1)^2

证明:

归纳基数:平凡。

感应步骤:

new_x = x+1
new_odd = odd+2 = 2(x+1)+1 = 2*new_x+1
new_sum = sum+new_odd = (x+1)^2+2(x+1)+1 = new_x^2+2*new_x+1 = (new_x+1)^2

最新更新