Определить инвариант цикла?

Я не совсем понимаю, как определить инвариант цикла. Я понимаю, что это то, что верно до цикла, после цикла и во время каждой итерации цикла, но это все. Вот примерная проблема, над которой я работаю, как бы вы нашли инвариант этого цикла?

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 ответа

1 <= x <= 100 является инвариантом цикла. Всегда верно до и после каждой повторения цикла.

Инвариант цикла должен быть истинным при входе в цикл и гарантированно оставаться истинным после каждой итерации цикла. Это означает, что при выходе из цикла могут быть гарантированы как инвариант цикла, так и условие завершения цикла.

См. Раздел логики Флойда-Хоара с простым примером цикла x<10: http://en.wikipedia.org/wiki/Loop_invariant

Проще говоря, инвариант цикла - это некоторый предикат (условие), который сохраняет значение true (true) для каждой итерации цикла.

В вашем случае инвариант цикла будет:

x >= 1 && x < 100

Учитывая условие завершения, приведенное выше выражение всегда будет оставаться true на протяжении всего цикла. Если это станет falseцикл заканчивается.

Вы определение цикла инварианта не совсем правильно. По сути, это должно быть верно только до и после каждого повторения цикла. У WikiPedia есть хорошее определение.

Инвариант этого цикла будет: 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

естественно, инвариант цикла должен быть связан с телом цикла и задачей, которую он выполняет. Инвариант цикла гарантирует, что на каждом шаге цикла у вас есть одинаковые условия для выполнения тела цикла.

Другие вопросы по тегам