如何找到循环不变的java

时间:2013-06-09 09:25:05

标签: java invariants loop-invariant

我正在尝试找到循环的不变量(例如,在以下代码中) 我真的不知道如何找到一般的不变量。 任何人都可以帮我找到一个不变量,并帮助我找到以下代码? 感谢

public static int div(int a, int b)
{
   int q = 0;
   while(a >= b)
   {
      a -= b;
      q++;
   }

   return q;
}

3 个答案:

答案 0 :(得分:4)

关于循环不变量的首要注意事项是它们有很多。其中一些更有用,而另一些则不太有用。由于不变量用于证明程序的正确性,因此选择不变量取决于您要证明的内容。

例如,q >= 0是循环的不变量。如果要证明函数返回正数,这就是您所需要的。如果你想证明一些更复杂的东西,你需要一个不同的不变量。

由于Java中的参数是按值传递的,并且由于程序修改了参数a的值,因此我们使用a0来表示a参数的初始值。现在您可以编写以下不变表达式:

a == a0 - (b * q)

通过观察每次q增加a时,b也减少了a0,从而得出这个不变量。因此,b在循环的每次迭代中都会q完全减少q == a0 / b次。

此不变量可用于证明循环产生a,并且a0 % b的结束值等于{{1}}。

答案 1 :(得分:1)

循环不变量是一种条件,对于循环的每次迭代都适用。

在你的循环中,谓词q >= 0是一个循环不变量,因为它始终是真的。分析循环不变量的需求是,当您从循环中退出时,可以保证循环不变量和循环终止条件。因此,在退出循环时,我们可以确定q >= 0a < b

答案 2 :(得分:0)

循环不变量是一个条件,它为循环的每次迭代保存 true

在你的情况下,一个不变量是:

q&gt; = 0