我如何找到循环不变性并证明正确性?
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 == 0
和t
也正确为0
- 迭代后,
i == 1
和t
对于第一个元素将是正确的。
但是,如所写,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!
我正在学习正确性并努力寻找合适的循环不变量并证明其正确性。
我认为循环不变量应该是正值的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-positivesi
- 索引变量;有时称为变体
那么每次迭代都有什么变化?数组 A
不变。数组中的元素个数n
不变。如所写,总和 t
可能会改变。索引变量i
将改变。
关于循环,那么,人们通常说i
是变体。它在每次迭代时递增,并将它与 n
进行比较是退出循环的原因。
我感兴趣的不变式是 t
将始终代表 calculated-so-far sum-of-positives。例如,在第一次迭代中:
- 迭代前,
i == 0
和t
也正确为0 - 迭代后,
i == 1
和t
对于第一个元素将是正确的。
但是,如所写,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!