我不太了解如何确定循环不变量。我理解它在循环之前,循环之后以及每次循环迭代期间都是正确的,但就此而言。以下是我正在研究的示例问题,您如何找到此循环不变量?
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;
答案 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
自然地,循环不变量应该与循环体及其执行的任务相关。循环不变量确保在循环的每个步骤中,循环体具有相同的条件。