Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Теоретическая информатика. Доказательство правильности. Учебное пособие
.pdf
2.2. МЕТОД ИНДУКТИВНЫХ УТВЕРЖДЕНИЙ
Все блок-схемы, о которых шла речь выше, содержали одинединственный цикл. Основным приемом при доказательстве правильности этих блок-схем было доказательство того, что при попадании во
входную точку цикла всегда будет справедливо некоторое утверждение (инвариант цикла). Чтобы доказать это, мы показывали, во-первых,
что это утверждение справедливо при
первом попадании на вход цикла, и, во-вторых, если мы попали в эту точку и утверждение справедливо, то после выполнения цикла и возврата во входную точку утверждение будет оставаться справедливым. Если структура блок-схемы
становится более сложной, например, за счет нескольких вложенных
циклов или если существует несколько
возможных путей между ключевыми точками, то рассмотренный выше метод уже трудно использовать для доказательства того, что при каждом входе в цикл справедливо соответствующее утверждение.
Предположим, например, что мы имеем дело с блок-схемой общего
вида, показанной на рис. 6.
Наш стандартный прием для доказательства справедливости любого
из двух утверждений
о циклах в данном случае может оказаться не всегда
пригодным. Доказать, что утверждение 1 справедливо при первом попадании в точку 1, вероятно, довольно просто. Однако может оказаться
сложным доказательство того, что если мы находимся в точке 1 и справедливо утверждение 1, то при проходе по циклу и возврате в точку
утверждение 1 останется справедливым. Трудность заключается в том,
что это не просто проход по элементарному циклу и возврат в точку 1.
Перед возвратом в точку 1 несколько раз будет выполняться внутренний
цикл. Следовательно, первым, вероятно, нужно доказать утверждение 2, а
затем уже использовать его для доказательства того, что при возврате в
точку
1 утверждение 1 останется справедливым. Пытаясь, однако, доказать справедливость утверждения 2 при каждом попадании в точку 2, мы
сталкиваемся с аналогичными трудностями. Фактически нужно показать,
что при любом попадании в точку 2 из точки 1 (не только в первый мо-
мент) будет справедливо утверждение 2. Но для этого скорее всего надо
будет
знать, что утверждение 1 справедливо, а этого-то мы еще и не до-
казали.
Для того чтобы устранить эту трудность и аналогичные ей, нужно
обобщить метод доказательства, рассмотренный выше. Обобщенный
метод мы назовем методом индуктивных утверждений. Прием, кото-
1
21

рым мы пользовались выше, есть просто некоторое упрощение этого
общего метода, приспособленное для программ, содержащих лишь
один-единственный цикл. При доказательстве правильности программ
методом индуктивных утверждений доказательство конечности программы (в смысле конечности времени выполнения программы, а не ее
размера) проводится отдельно от доказательства справедливости некоторых ключевых утверждений при достижении
соответствующих точек программы. Для уточнения использованных понятий дадим два
определения.
Рис. 6
Определение 1. Пусть А – некоторое утверждение, описывающее
предполагаемые свойства данных в программе (блок-схеме), а С –
утверждение, описывающее то, что мы по предположению должны
22

получить в результате процесса выполнения программы (т. е. утверждение о правильности). Будем говорить, что программа частично
правильна (по отношению к А и С), если при каждом выполнении ее с
данными, удовлетворяющими предположению А, будет справедливо
утверждение С при условии, что программа закончится. Другими словами, если выполнять программу с данными
, удовлетворяющими А, то
либо она не заканчивается, либо заканчивается и удовлетворяется
утверждение С.
Таким образом, программа может быть частично правильна, даже
если она не заканчивается при некоторых (или всех) входных данных,
удовлетворяющих А. Необходимо только, чтобы, если уж программа
заканчивается, было справедливо утверждение С с данными, удовле-
творяющими А.
Определение 2. Будем называть программу (блок-схему) пол-
ностью правильной (по отношению к А и С), если она частично правильна (по отношению к А и С) и заканчивается при всех данных, удовлетворяющих А.
Описание метода индуктивных утверждений
Для доказательства частичной правильности (по отношению к А
и С) программы (блок-схемы) поступим следующим образом. Свяжем
утверждение А с началом программы, а утверждение С – с конечной
точкой программы. Кроме этого, выявим некоторые закономерности,
относящиеся к значениям переменных, и свяжем соответствующие
утверждения с другими точками программы. В частности, свяжем такие
утверждения, по крайней мере, с одной из точек в каждом из замкнутых
путей в программе (в циклах). Для каждого пути в программе, ведущего
из точки I, связанной с утверждением А
утверждением A
(при условии, что на этом пути нет точек с какими-
J
, в точку J, связанную с
I
либо дополнительными утверждениями), докажем, что если мы попали
в точку I и справедливо утверждение А
, а затем прошли от точки I до
I
точки J, то при попадании в точку J будет справедливо утверждение A
. Для циклов точки I и J могут быть одной и той же точкой.
J
Чтобы убедиться, что таким способом мы действительно доказываем частичную правильность программы, докажем следующую теорему.
Теорема 1. Если можно выполнить все действия, предусмотренные
описанным методом индуктивных утверждений для некоторой программы, то эта программа частично правильна (относительно А и С).
23

Доказательство. Предположим, что мы выполнили доказательство
A
A
A
A
A
A
правильности методом индуктивных утверждений. Начнем выполнять
программу с начальными данными, удовлетворяющими допущению А.
Нам нужно доказать, что если выполнение программы закончится, то
утверждение С будет справедливо, но фактически мы докажем нечто
более общее. Мы покажем, что каждый раз, когда мы попадаем в некоторую точку
программы, с которой связано определенное утверждение, данное утверждение будет справедливым. Это, в частности, предполагает, что, если мы достигнем последней точки программы
(т. е. программа закончится), утверждение С будет справедливо. Доказательство проведем с помощью индукции по n – числу точек программы, через которые мы уже прошли (учитываются точки
, связан-
ные с некоторыми утверждениями).
1. Предположим, что в процессе выполнения программы мы попали в первую из этих точек (n = 1). Нужно показать, что связанное с
этой точкой утверждение справедливо. Но первая точка – это начальная точка программы, и с ней связано исходное допущение А. Мы знаем, что оно справедливо
, ибо речь идет о выполнении программы с
такими начальными данными, для которых оно выполняется.
2. Предположим, что мы дошли до некоторой точки (n-й), с кото-
рой связано утверждение
. Допустим, что это утверждение справед-
i
n
ливо (гипотеза индукции). Нужно показать, что если выполнение продолжается и мы попадаем из n-й точки в (n + 1)-ю, то связанное с ней
утверждение
будет также верным. Очевидно, что между n-й
i
1n
и (n + 1)-й точкой существует некоторый путь. Так как речь идет о методе
индуктивных утверждений, то, следовательно, мы уже рассматривали
этот путь и показали, что если находимся в n-й точке со справедливым
утверждением
достижении будет справедливо утверждение
с гипотезой о справедливости утверждения
нии в (n + 1)-ю точку справедливо утверждение
, а затем проходим из n-й в (n + 1)-ю точку, то при ее
i
n
. Из этого факта вместе
i
1n
следует, что при попада-
i
n
, т. е. то, что требо-
i
1n
валось доказать.
Таким образом, мы доказали по индукции, что если программа
удовлетворяет условиям метода индуктивных утверждений, то при достижении любой из точек программы, с которыми связаны определенные утверждения, соответствующие утверждения будут справедливы.
24

Следовательно, если будет достигнута конечная точка программы, то
будет справедливо утверждение о правильности, связанное с этой точкой, т. е. рассматриваемая программа является частично правильной.
Для доказательства полной правильности программы сначала методом индуктивных утверждений нужно доказать ее частичную правильность, а затем уже доказать, что программа когда-нибудь завершится
. Проиллюстрируем этот прием на нескольких примерах программ, содержащих вложенные циклы. Студенту рекомендуется самому попытаться доказать правильность одной из этих программ с помощью использованного выше ограниченного метода, для того чтобы
лучше оценить эффективность более общего метода.
Пример 2.4. Требуется доказать, что приведенная на рис. 7 блок-
схема устанавливает переменную XLGST равной максимальному значению в массиве X. Указанные на блок-схеме утверждения – индуктивные утверждения, необходимые для доказательства частичной правильности программы. Так как все эти утверждения имеют аналогичную форму и начинаются с фразы: «При достижении этой точки справедливо…»,
то это начало фразы мы опускаем. Утверждение о конечности программы мы не помещаем на блок-схеме, поскольку доказательство этого утверждения проводится отдельно от доказательства
частичной правильности.
Для доказательства частичной правильности нужно исследовать
все пути программы. Рассмотрим их по порядку.
1. Путь из точки 1 в точку 2. Предположим, что мы находимся
в
точке 1 и связанное с ней утверждение справедливо, т. е. данные удовлетворяют исходному допущению. Перейдем из точки 1 в точку 2.
Нужно показать, что после прихода в точку 2 связанное с этой точкой
утверждение будет справедливо. Если мы попали в точку 2 из точки 1,
то имеем I = 1
1 I = 1 M + 1. Поскольку XLGST = X
и XLGST = X
. Так как M 1, то очевидно, что
1,1
и I = 1, утверждение о
1,1
XLGST справедливо.
2. Путь из точки 2 в точку 3. Предположим, что мы находимся в
точке 2 и справедливо связанное с нею утверждение. Перейдем из точки 2 в точку 3. Требуется показать, что при попадании в точку 3 будет
справедливо утверждение, связанное с этой точкой. Если мы
дошли до
точки 3 (из точки 2), то имеем J = 1, а значение XLGST осталось
неизменным. Так как N 1, 1 J = 1 N + 1, а значение I после точ-
ки 2 не изменялось, то 1 I M + 1. Однако если мы пришли из точ-
ки 2 в точку 3, то известно, что проверка
I M была истинной, и,
25

комбинируя это отношение с 1 I M + 1, получаем 1 I M. Если
I = 1 и J = 1, то из утверждения 2 получим XLGST = X
. В против-
1,1
ном случае (т. е. при I 1) из утверждения 2 получаем, что XLGST
равно максимальному из значений элементов в первых I – 1 строках
массива X или, более точно, максимальному из значений элементов в
первых I – 1 строках и из значений первых J – 1 = 1 – 1 = 0 элементов
в I-й строке. Таким образом, очевидно, что при переходе
из точки 2
в точку 3 утверждение, связанное с точкой 3, оказывается справедливым.
Рис. 7
3. Путь из точки 3 через точки 4, 5 к точке 3. Предположим, что
мы находимся в точке 3 и справедливо утверждение, связанное с этой
26

точкой. Пройдем через точки 4, 5 к точке 3. Нужно показать, что при
I
I
I
I
I
I
возврате в точку 3 соответствующее утверждение останется справедливым. Пусть I и J в исходном положении в точке 3 принимают значения I
точку 3 через точки 4 и 5 получим I
тельно, опять имеем 1 I
ти, то проверка J
ния 1 J
точку 3 снова имеем 1< 2 J
и JN. Мы имеем 1 IN M и 1 JN N + 1. При возврате в
N
= IN и J
N+1
= IN M. Если мы проходим по этому пу-
N+1
N была истинной. Из этого, а также из соотноше-
N
N + 1 получаем 1 JN N. Таким образом, при возврате в
N
= JN + 1 N + 1. На всем пути перехо-
N+1
= JN + 1. Следова-
N+1
да в точку 3 значение XLGST не изменялось, и известно, кроме того,
что истинна проверка
X
XLGST. Если учесть истинность
,
J
NN
утверждения о XLGST до «прохода» по указанному пути, то данное
утверждение остается истинным и при возврате в точку 3 с I
и J
= JN + 1. Так как
N+1
X
XLGST, то неизменное значение
,
J
NN
N+1
= IN
XLGST снова будет максимальным из значений элементов в первых
I
– 1 = IN – 1 строках и из значений первых J
N+1
элементов в I
-й строке массива X.
N
– 1 = (JN + 1) – 1 = JN
N+1
4. Путь из точки 3 через точки 4, 6 в точку 3. Рассуждения для
этого пути аналогичны приведенным для предыдущего пути, за
исключением того, что при возврате в точку 3 XLGST будет иметь
значения
X
NN
Таким образом,
первых I
X
XLGST была ложной и, следовательно, XLGST <
,
J
– 1 строк и JN – 1 элементов в IN-й строке. Отсюда следу-
N
. Кроме того, поскольку выбран этот путь, проверка
,
J
NN
X
больше максимального из значений элементов
,
J
NN
X
,
J
NN
.
ет, что при возврате в точку 3 значение XLGST остается максимальным из значений элементов первых I
– 1 = (JN + 1) – 1 = JN элементов в IN-й строке массива X.
J
N+1
– 1 = I
N+1
– 1 строк и первых
N
5. Путь из точки 3 через точку 7 в точку 2. Предположим, что мы
находимся в точке 3 и справедливо соответствующее утверждение.
Перейдем из точки 3 через точку 7 в точку 2. Нужно показать, что при
возврате в точку 2 будет справедливо связанное с нею утверждение.
Из точки 3
в точку 7 мы попадем только тогда, когда ложна проверка
J N. Но из утверждения, относящегося к точке 3, известно, что
1 J N + 1. Отсюда можно заключить, что J = N + 1. Пусть I в точ-
ке 3 принимает значение I
. Утверждение в точке 3 гласит: 1 IN M
N
27

и XLGST равно максимальному из значений элементов в первых
– 1 строках и первых J – 1 = (N + 1) – 1 = N элементов в IN-й стро-
I
N
ке массива X. Но так как в массиве X существует только N столбцов, то XLGST равно максимальному из значений элементов в
I
строках массива X. Значение XLGST между точками 3 и 2 не из-
N
менялось, а значение I изменилось и стало равным I + 1. Так как в
точке 3 было справедливо отношение 1 I
1 < 2 I
= IN + 1 M + 1 справедливо в точке 2. Следовательно, при
N+1
M, то это означает, что
N
достижении точки 2 будет справедливо утверждение: XLGST равно
максимальному из значений элементов в первых I – 1 = (I
+ 1) – 1 = IN
N
строках массива X.
6. Путь от точки 2 в точку 8. Предположим, что мы находимся в
точке 2, справедливо соответствующее утверждение, и мы переходим в
точку 8. Необходимо показать, что при достижении точки 8 будет
справедливо связанное с нею утверждение. Из точки 2 мы перейдем в
точку 8, если была ложной проверка
I M. Однако в точке 2 было
справедливо неравенство 1 I M + 1; следовательно, можно заклю-
чить, что I = M + 1. Значение XLGST при переходе из точки 2 в точку 8 не изменялось, и, таким образом, из утверждения, относящегося
к точке 2, можно заключить, что при попадании в точку 8 XLGST
максимальному из значений элементов в первых I – 1 =
равно
= (M + 1) – 1 = M строках массива X. Но массив X содержит только M строк; следовательно, XLGST равно максимальному из значений элементов X.
Таким образом, мы доказали частичную правильность нашей программы. Нам еще осталось удостовериться, что программа закончится.
Отметим, что единственными местами в программе
, где изменяются I
и J, являются «изолированные» части двух итерационных блоков,
управляющие увеличением параметра цикла. Так как значение J увеличивается на 1, а значение N при выполнении внутреннего цикла не
изменяется (путь через точки 3, 4, 5, 3 или через точки 3, 4, 6, 3), то
значение J должно в конце концов превысить значение N. Таким
образом, попадая в точку 3, мы когда-нибудь (после конечного числа выполнений внутреннего цикла) должны попасть в точку 7, а затем в точку 2. При каждом попадании в точку 2 мы затем попадем либо в точку 8 и процесс закончится, либо в точку 3. Если мы попали
в точку 3,
мы только что видели, как в конце концов дойдем до точки 7 и вернемся в точку 2. При этом значение I будет увеличиваться на 1, а значе-
28

ние M останется неизменным. Следовательно, после конечного числа
шагов значение I станет больше значения M. В этот момент мы перейдем из точки 2 в точку 8 и программа закончится. Таким образом,
мы доказали конечность нашей программы. Если это доказательство
объединить с предыдущим доказательством частичной правильности,
то отсюда следует полная правильность
программы.
2.3. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
1. Докажите, что программа (рис. 8) вычисляет и печатает значение
M! = 1 2 3 (M – 1) M при условии, что M – положительное це-
лое число.
2. Докажите, что если в программу (рис. 9) в качестве значений I
и J вводятся I
ния I и J будут 0 и J
и J0, причем 0 I0, то печатаемые в конце значе-
0
+ 2I0.
0
START
M
START
I < 2
J < 1
I M
T
J < J I
I < I + 1
J
F
STOP
I, J
I > 0
T
J < J + 2
I < I – 1
I, J
F
STOP
Рис. 8 Рис. 9
3. Постройте блок-схему алгоритма подсчета количества отрицательных элементов в матрице A
(M, N 1), содержащей целые
MN
числа, и докажите ее правильность методом индуктивных утверждений.
29

2.4. КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 2
Тема 1. «Доказательство правильности блок-схем»
Тема 2. «Доказательство правильности блок-схем
методом индуктивных утверждений»
1. Сколько и каких индуктивных утверждений надо сформулировать для доказательства правильности блок-схем?
2.
Что такое инвариант цикла?
3.
Что называется утверждением о правильности?
4.
Что такое утверждение о конечности цикла?
5.
Как можно получить и как можно доказать инвариант цикла?
6.
Сколько и каких шагов включает доказательство правильности
блок-схемы?
7.
В чем заключается метод индуктивных утверждений?
8.
Может ли начало и конец замкнутого пути быть одной точкой?
9.
Определение частично правильной программы.
10.
Определение полностью правильной программы.
11.
В чем отличие частично правильной программы от полностью
правильной?
12.
Частичную или полную правильность программы доказывает
метод индуктивных утверждений?
13.
Для доказательства полной правильности программы метод ин-
дуктивных утверждений является необходимым или достаточным
условием?
14.
Какое из индуктивных утверждений (о входных данных, инва-
риант цикла, о конечности цикла, о правильности) не используется в
методе индуктивных утверждений и почему?
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
