我如何才能找到循环不变性并证明其正确性?

时间:2019-04-06 08:06:46

标签: algorithm correctness

我正在学习正确性,并努力寻找适当的循环不变性并证明其正确性。

我认为循环不变性应该是正值的t = sum,但我不知道如何正确编写它,或者是否还有其他循环不变性?

SumPos(A[0..n - 1])
// Returns the sum of the positive numbers in an array A of length n. We
// assume that the sum of the numbers in an array of length zero is 
zero.
t = 0
i = 0
while i != n do
 if A[i] > 0
 t = t + A[i]
 i = i + 1
 return t

1 个答案:

答案 0 :(得分:0)

在正式使用之前,对于循环,考虑“保持不变”和“发生什么变化” 有时会有所帮助。*对于编写的循环,我们具有以下变量:兴趣:

  • A-要求和的数字数组
  • n-A中元素的整数。
  • t-按照书面规定,我认为最终的肯定和是
  • i-索引变量;有时称为变体

那么每次迭代有什么变化?数组A不变。数组中元素n的数量不变。如前所述,总和t可能会发生变化。索引变量i 将会更改。

关于循环,人们通常会说i变体。它会增加每次迭代的次数,并将其与n进行比较才能退出循环。

对我而言,不变的是t将始终表示到目前为止计算出的肯定和。例如,在第一次迭代中:

  • 在迭代之前,i == 0t也正确为0
  • 迭代之后,对于第一个元素,i == 1t将是正确的。

但是,按照书面形式,return语句排除了数组第一个元素之外的任何处理。从理论转向实践,那么您如何解决该实现?

  

*对于pedantic来说,限定符很重要,因为严格来说,“不变式”对于循环的每次迭代都不会改变-不会改变,或者始终成立。所以? 很多语句在循环方面是不变的!例如,我母亲的名字在循环中是不变的!