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

how i can find the loop invariant and prove 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

在正式开始之前,根据 "what stays the same" 和 "what changes" 考虑循环 有时会有所帮助。* 对于编写的循环,我们有这些感兴趣的变量:

  • A - 要求和的数字数组
  • n - A.
  • 中元素的整数个数
  • t - 如所写,我认为最终会成为 sum-of-positives
  • i - 索引变量;有时称为变体

那么每次迭代都有什么变化?数组 A 不变。数组中的元素个数n不变。如所写,总和 t 可能会改变。索引变量i改变。

关于循环,那么,人们通常说i变体。它在每次迭代时递增,并将它与 n 进行比较是退出循环的原因。

我感兴趣的不变式是 t 将始终代表 calculated-so-far sum-of-positives。例如,在第一次迭代中:

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

但是,如所写,return 语句排除了超出数组第一个元素的任何处理。从理论到实践,您将如何解决实施问题?

* For the pedantic, the qualifier is important because strictly speaking an "invariant" is something that does not vary -- does not change, or always holds true -- for every iteration of the loop. So? Lots of statements are invariant with respect to the loop! For example, my mother's name is invariant for the loop!