Инвариант цикла
Инвариант цикла — это утверждение, которое остаётся истинным перед каждой итерацией цикла. Он помогает описать, что сохраняется во время выполнения [[cycle-algorithm:циклического алгоритма]], и используется для доказательства его правильности.
Как записывают инвариант
Инвариант обычно обозначают буквой \(P\). Для цикла важно проверить три свойства: \(P\) истинно до первой итерации; если \(P\) истинно перед итерацией, то оно остаётся истинным после неё; когда цикл заканчивается, инвариант вместе с условием завершения позволяет сделать вывод о результате.
Первое свойство называют инициализацией, второе — сохранением инварианта. Последний шаг связан с [[invariant-proof:доказательством инварианта]] и завершением цикла: сам по себе инвариант не гарантирует, что цикл когда-нибудь остановится.
Рассмотрим цикл, который последовательно складывает числа \(1,2,\ldots,n\). Перед каждой итерацией можно утверждать: «в переменной \(s\) хранится сумма уже обработанных чисел». В начале обработанных чисел нет и \(s=0\). После добавления очередного числа утверждение сохраняется. После обработки всех чисел получаем \(s=1+2+\cdots+n\).
Условие цикла отвечает на вопрос, нужно ли выполнять следующую итерацию, например \(i\le n\). Инвариант описывает свойство состояния переменных, которое сохраняется при переходе от одной итерации к другой. Условие может изменяться, а инвариант должен сохранять истинность.
Какое утверждение может быть инвариантом цикла поиска максимума в первых \(i\) элементах массива?
Зачем нужен инвариант
Инвариант позволяет объяснить работу цикла не перебором всех итераций, а общим рассуждением. В задачах на трассировку полезно искать, какая величина уже вычислена или какие элементы обработаны. Для полного доказательства правильности нужно также обосновать [[loop-termination:завершение цикла]].
Главное
- Инвариант цикла истинен перед началом и перед каждой итерацией.
- Его проверяют по трём этапам: начало, сохранение, использование после завершения.
- Инвариант описывает сохраняемое свойство, а условие цикла управляет продолжением работы.