确定循环不变量?

时间:2014-04-08 03:57:16

标签: loops loop-invariant

我不太了解如何确定循环不变量。我理解它在循环之前,循环之后以及每次循环迭代期间都是正确的,但就此而言。以下是我正在研究的示例问题,您如何找到此循环不变量?

i, temp : integer; 
values : array[1..100] of integer; 

x := 1; 

while x < 100 loop 

if values[x] > values[x+1] then begin 

temp := values[x]; 

 values[x] := values[x+1]; 

 values[x+1] := temp; 

 end if; 

 x := x + 1; 

end loop; 

3 个答案:

答案 0 :(得分:0)

简单来说,循环不变量是一些谓词(条件),它对于循环的每次迭代都保持良好(真实)。

在您的情况下,循环不变量将是:

x >= 1 && x < 100

鉴于终止条件,上述表达式在整个循环中始终保持true。如果它变为false,则循环结束。

答案 1 :(得分:0)

1 <= x <= 100是循环不变量。在每次循环重复之前和之后始终为真。

  

循环不变量在进入循环时应该是真的并且是有保证的   在循环的每次迭代后保持为真。这意味着   从循环中退出循环不变量和循环终止   条件得到保证。

使用简单的x&lt; 10循环示例查看Floyd-Hoare逻辑部分:http://en.wikipedia.org/wiki/Loop_invariant

答案 2 :(得分:0)

循环不变量的定义并不完全正确。基本上它应该在每次循环重复之前和之后都是正确的。 WikiPedia have nice definition

这个循环的不变量是:the values[x] and values[x + 1] are maybe not sorted or x is the last index它在每次循环迭代之前和之后都是真的。在循环与false循环条件结合后,它仍然是正确的

i, temp : integer; 
values : array[1..100] of integer; 

x := 1; 

while x < 100 loop 
    // the values[x] and values[x + 1] are maybe not sorted or x is the last index - true
    if values[x] > values[x+1] then begin 
        temp := values[x]; 
        values[x] := values[x+1]; 
        values[x+1] := temp; 
    end if; 
    x := x + 1; 
    // the values[x] and values[x + 1] are maybe not sorted or x is the last index - true
end loop; 

// the values[x] and values[x + 1] are maybe not sorted or x is the last index - true
// and x >= 100 - true

自然地,循环不变量应该与循环体及其执行的任务相关。循环不变量确保在循环的每个步骤中,循环体具有相同的条件。