последовательными нарезками:
Свойство инварианта цикла состоит в том, что на каждом шаге прохождения цикла
Рис. 11.7. Аппроксимация массива последовательными нарезками
Ингредиенты доказательства корректности цикла
Простой пример вычисления максимума массива иллюстрирует общую схему циклических вычислений, применимую ко многим ситуациям. Вы определяете, что решением некоторой проблемы является элемент, принадлежащий
Рис. 11.8. Вычисление цикла (из [М 1990])
Вычисление цикла имеет следующие ингредиенты:
[x]. Цель
[x]. Инвариант цикла
[x]. Точку инициализации
[x]. Преобразование
[x]. Верхняя граница числа применений
Последовательные приближения один из главных инструментов численного анализа. Но там эта идея понимается шире. Важная разница состоит в том, что в чистой математике допускаются бесконечные вычисления, последовательность может иметь предел, даже если он не достигается конечным числом приближений. Последовательность
| Компьютерные реализации численных алгоритмов также требуют конечной сходимости. Даже когда математический алгоритм сходится на бесконечности, мы обрываем процесс сходимости, когда полагаем, что решение найдено с требуемой точностью. |
Практический способ гарантии завершения циклического процесса состоит в связывании с итерационным процессом целочисленной величины - варианта цикла, обладающего следующими свойствами:
[x]. Вариант всегда не отрицателен.
[x]. Любое выполнение тела цикла уменьшает вариант.
Так как целочисленная неотрицательная величина не может уменьшаться бесконечно, то наличие варианта позволяет гарантировать завершение цикла. Вариант является верхней границей, максимальным числом применений
[x]. Предусловие программы требует положительности
[x]. Любое выполнение тела цикла выполняет инструкцию
В этом примере цикл является простым итерированием на последовательности целых чисел в конечном интервале, известный в языках программирования, как 'цикл For' или 'цикл DO', завершение которого не трудно проверить. Для более изощренных циклов число требуемых итераций определить не так просто, выявление завершения становится сложной задачей, единственным универсальным способом является нахождение варианта.
Нам понадобится еще одно понятие, преобразующее только что набросанную схему в программный текст, описывающий цикл. Мы нуждаемся в простом способе определения того, что текущая итерация достигла цели (постусловия)
post = inv and exit
так что мы можем остановить цикл, - чьи промежуточные состояния по построению удовлетворяют
