Опубликован: 27.09.2006 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный индустриальный университет
Лекция 8:

Проектирование цикла при помощи инварианта

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >

Теория воздушного шарика

До сих пор мы использовали для построения программ готовые, не ясно откуда взявшиеся инварианты. На практике, конечно, постановка задачи не включает в себя инвариант. Однако любая корректная постановка задачи содержит ее пред- и постусловия: \{Q\}\ "S0;while(e)S;"\ \{R\}, поэтому они и должны послужить основой для построения инварианта.

Теперь нужно понять, какой именно из двух предикатов Q и R более важен для построения инварианта. Приведем два аргумента в пользу постусловия R.

Первый таков: предусловие Q достаточно часто имеет вид T, что соответствует отсутствию ограничений на начальные условия, в которых должна правильно работать программа. Понятно, что в этом случае инвариант можно строить только исходя из постусловия R.

Второй аргумент: представим себе R в виде цели, которой должен достичь путник на местности, а Q в виде точки его начального расположения. Инвариант, который мы хотим построить, должен помочь путнику достичь нужной ему цели. Можно ли надеяться на это, полностью проигнорировав R?

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

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

Рассмотрим геометрическую иллюстрацию стоящей перед нами задачи, изобразив на множестве X всех значений программных переменных подмножества X_{S0} и X_R, второе из которых задается постусловием R, а первое представляет собой множество, которое может быть получено из X_Q после выполнения совокупности простых присваиваний S0. Искомому инварианту цикла I на рисунке 8.1 должно соответствовать какое-то неизвестное нам пока множество X_I.

Теория воздушного шарика

Рис. 8.1. Теория воздушного шарика

Существует весьма красивое описание того, что происходит с множеством переменных программы в процессе выполнения цикла, называемое теорией воздушного шарика. Рассмотрим последовательность предикатов P_0, P_1, \ldots, P_n, описывающих множества переменных до начала цикла, после его первой итерации, \ldots, после n -ой (последней) итерации.

Множества, определяемые этими предикатами, представляют последовательность вложенных друг в друга множеств, причем X_{P_0} = X_I, а X_{P_n} = X_R. Удобно представлять себе эти множества как последовательные состояния изначально надутого воздушного шарика, из которого на каждой очередной итерации цикла выпускают немного воздуха.

Используя эту модель, можно сказать, что построение инварианта требует так надуть шарик, находящийся в состоянии X_R, чтобы он стал содержать множество X_{S0}. С математической точки зрения необходимо ослабить предикат R до такой степени, чтобы истинность этого ослабленного предиката (который и будет взят в качестве инварианта I ) могла быть получена из истинного Q с помощью простых начальных присваиваний S0.

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

Реально применяются три первых из следующих ниже приведенных методов построения инварианта.

  1. Устранение конъюнктивного члена. Предикат A\land B\land C можно ослабить до A\land C.
  2. Замена константы переменной. Предикат (\forall j\ 0\leqslant j < n\ x \leqslant b[j])

    может быть ослаблен до

    (0 \leqslant i \leqslant n) \land 
(\forall j\ 0\leqslant j < i\ x \leqslant b[j]), где i — новая переменная.
  3. Расширение области значений переменной. Предикат 5\leqslant i<10 можно ослабить до 0\leqslant i<10.
  4. Добавление дизъюнктивного члена. Предикат A можно ослабить до A\lor B, где B — некоторый другой предикат.

Причина того, что четвертый метод не применяется, весьма проста — он не содержит никаких рекомендаций по поводу того, как именно выбрать предикат B. Остальные методы построения инварианта цикла будут проиллюстрированы в последующих секциях данного параграфа в процессе решения различных задач.

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Анастасия Халудорова
Анастасия Халудорова
екатерина яковлева
екатерина яковлева