循环不变(归纳)证明正确性

时间:2012-02-24 01:49:34

标签: php math proof loop-invariant

我编写了自己的小功能(为了方便而使用php),希望有人可以通过感应来帮助构建证据,这样我就能得到一个非常基本的东西。

function add_numbers($max) {
  //assume max >= 2
  $index=1;
  $array=array(0);
  while ($index != $max) {
     //invariant: ∀ k:1 .. index-1, array[k]=array[k-1]+1
     $array[$index] = $array[$index-1]+1;
     $index += 1;
  }
}

结果是每个索引的值与索引本身相同,但只是因为[0]被初始化为0。

我相信目标是(或者应该)证明不变量(可能本身就是可疑的,但希望得到重点)适用于k + 1.

由于

编辑:示例:http://homepages.ius.edu/rwisman/C455/html/notes/Chapter2/LoopInvariantProof.htm

1 个答案:

答案 0 :(得分:1)

这样的事,也许,虽然这有点迂腐。

不变量:当index = n时,对于n> = 1(在它检查条件的循环顶部),array [i] = i for 0< = i< Ñ

证明:证据是通过归纳证明的。在基本情况下n = 1,循环第一次检查条件,主体没有执行,并且我们有一个外部保证,即代码中较早的数组[0] = 0。假设不变量适用于所有n到k。对于k + 1,我们分配数组[k] =数组[k-1] + 1.从归纳假设,数组[k-1] = k-1,所以赋值数组[k]的值是(k-1) )+1 = k。因此,不变量适用于下一个,并通过归纳每个n的值(在循环的顶部)。

编辑:

function add_numbers($max) {
  //assume max >= 2
  $index=1;
  $array=array(63);
  while ($index != $max) {
     //invariant: ∀ k:1 .. index-1, array[k]=array[k-1]+1
     $array[$index] = $array[$index-1]+1;
     $index += 1;
  }
}

不变量:当index = n时,对于n> = 1(在它检查条件的循环顶部),array [i] = i + 63 for 0< = i< Ñ

证明:证据是通过归纳证明的。在基本情况下,n = 1,循环首次检查条件,正文尚未执行,并且我们有一个外部保证,即代码中较早的数组[0] = 63。假设不变量适用于所有n到k。对于k + 1,我们分配数组[k] =数组[k-1] + 1.从归纳假设,数组[k-1] =(k-1)+ 63 = k + 62,所以赋值数组[k]是(k + 62)+ 1 = k + 63。因此,不变量适用于下一个,并通过归纳每个n的值(在循环的顶部)。