Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_5_14_apr (1) / 2 к Л5 Схема проектирования цикла.pptx
Скачиваний:
7
Добавлен:
23.05.2015
Размер:
106.75 Кб
Скачать

Схема проектирования цикла с помощью инварианта (проектная модель)

Понятие инварианта оказывается очень полезным не только для доказательства

корректности готового цикла,

но и для его проектирования в процессе

разработки программы.

Инвариант цикла лежит в основе некоторой схемы проектирования циклов,

которую естественно и назвать схемой

проектирования цикла с помощью инварианта.

сентябрь 2008

Лекция 4.3

1

Пусть для написания некоторой программы требуется разработать цикл while с заданной спецификацией (P, Q) :

{P} S0; while (B) S; {Q},

где S – тело цикла, S0 – операторы инициализации

цикла, а предикат B в соответствии с семантикой цикла while есть условие продолжения цикла.

Пусть X – множество переменных программы, X0

– их начальные значения, установленные действием

S0.

Не ограничивая общности, представим тело цикла в виде X = f(X), где f – функция, описывающая преобразование переменных в теле цикла S.

сентябрь 2008

Лекция 4.3

2

Введем обозначения: M – множество; X M;

P: M Boolean, где Boolean = {true, false}; т. е. P

предикат, выражающий предусловие;

Q: M Boolean, т. е. Q – предикат, выражающий постусловие.

Кроме того, обозначим множества:

P = {X M : P(X) = true}; Q = {X M : Q(X) = true};

B= {X M : B(X) = true};

B* = {X M : B(X) = false}.

Рассмотрим предикат inv : M Boolean и множество I = {X M : inv (X) = true}. Кроме того, введем некоторую целочисленную функцию переменных программы t: I N0, где N0 – множество

неотрицательных целых чисел.

сентябрь 2008

Лекция 4.3

3

Предположим, что существуют предикат inv и функция t такие, что справедливы следующие утверждения:

inv & !B Q; {P} S0 {inv}

{inv & B } S {inv};

inv (X) & B(X) (t(X) > 0);

{inv (X) & B(X) & t0 = t(X)} S {0 t(X) < t0}. Тогда по теореме об инварианте цикл while завершается и имеет «заявленное» свойство {P} S0; while (B) S; {Q}.

Интерпретация этого факта в терминах преобразования f переменных в теле цикла:

свойство {inv & B } S {inv} тела цикла детализируется как {inv (X) & B(X) } X = f(X) {inv(X)},

и по правилу вывода для оператора присваивания имеем inv (X) & B(X) inv(f(X)),

т.е. преобразование f на множестве I B сохраняет инвариант inv.

сентябрь 2008

Лекция 4.3

4

Геометрическая интерпретация схемы цикла с инвариантом

M

P

f f f

f

f

f

 

 

X0

I

 

B * Q

 

 

 

 

 

 

 

P = {X M : P(X) = true};

Q = {X M : Q(X) = true};

B * = {X M : B(X) = false

}.

I = {X M : inv (X) = true}

inv (X) & not B (X) Q

(X)

сентябрь 2008

Лекция 4.3

5

Итак, последовательность преобразований f за число шагов не более чем t (X0) гарантировано приведет

к достижению в множестве M точки

X I B * и при этом I B * Q , т. е. X Q и следовательно Q(X) = true.

сентябрь 2008

Лекция 4.3

6

Схема проектирования цикла с помощью инварианта

На практике разработка цикла с заданными пост- и предутверждениями состоит в следующем.

Начинают с придумывания общей стратегии решения задачи и основной идеи алгоритма.

При этом на неформальном уровне следует решить, что будет происходить в цикле, какие программные объекты будут изменяться при выполнении цикла.

Затем надо:

сформулировать условие продолжения цикла B (или завершения !B);

попытаться придумать инвариант цикла inv и вариант var.

Если это удалось, то набросок цикла можно записать в виде:

сентябрь 2008

Лекция 4.3

7

//Предусловие: P Фрагмент A //Инвариант: inv //Вариант: var While (B) {

} ТЕЛО ЦИКЛА

Фрагмент Б //Постусловие: Q

После этих действий остается:

1.обеспечить при заданном

предусловии выполнение инварианта перед началом цикла, написав фрагмент А;

2.построить тело цикла, сохраняющее инвариант и уменьшающее

ограничивающую функцию;

3.обеспечить выполнение

постусловия после завершения цикла, написав фрагмент Б.

сентябрь 2008

Лекция 4.3

8