Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Теоретическая информатика. Доказательство правильности. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Министерство образования и науки Российской Федерации
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
__________________________________________________________________________
Е.Л. ВЕРЕТЕЛЬНИКОВА
ТЕОРЕТИЧЕСКАЯ
ИНФОРМАТИКА
ПРАВИЛЬНОСТИ
Утверждено Редакционно-издательским советом университета
в качестве учебного пособия
НОВОСИБИРСК
2016
1
УДК 004.42(075.8)
В 316
Рецензенты:
канд. техн. наук, доцент И.Л. Еланцева
канд. техн. наук, доцент Г.В. Саблина
Работа подготовлена на кафедре автоматики для студентов
1 курса АВТФ, обучающихся по направлению 27.03.04
«Управление в технических системах»
Веретельникова Е.Л.
В 316 Теоретическая информатика. Доказательство правильности:
учеб. пособие / Е.Л. Веретельникова. – Новосибирск: Изд-
во
НГТУ, 2016. – 51 с.
ISBN 978-5-7782-2875-7
В работе изложен теоретический материал и рассмотрены много­численные примеры для освоения основных принципов и приемов до­казательства правильности программ, представленных блок-схемами или записанных на языках высокого уровня. Материал подразделен на четыре основные темы и сгруппирован таким образом, чтобы изуче­нию одной темы соответствовали одно-два аудиторных занятия. В рамках ной работы и контрольные вопросы.
вание и интересующихся вопросами доказательства правильности программ.
каждой темы предлагаются упражнения для самостоятель-
Пособие будет полезно для студентов, изучающих программиро-
УДК 004.42(075.8)
ISBN 978-5-7782-2875-7 © Веретельникова Е.Л., 2016
© Новосибирский государственный
технический университет, 2016
2
Глава 1. МАТЕМАТИЧЕСКАЯ ИНДУКЦИЯ
Математическая индукция представляет собой некоторый общий способ доказательства в математике. Он, хотя об этом не всегда явно говорят, положен в основу всех приемов доказательства правильности программ для вычислительных машин. Настоящая глава знакомит чи­тателя с математической индукцией – фундаментальным способом до­казательства в математике.
Обычно математическую индукцию вводят как метод доказатель­ства утверждений о положительных числах. В данном пособии сфор­мулированы и проиллюстрированы на примерах самые простые версии этого метода – простая и строгая индукция, необходимые для понима­ния сути методов доказательства правильности программ. Обобщение этого метода на случай любых вполне упорядоченных множеств рас­смотрено в других учебных пособиях [1, 3].
1.1. ПРОСТАЯ ИНДУКЦИЯ
Принцип простой индукции
Пусть S(N) – некоторое высказывание о целом числе N и требуется доказать, что S(N) справедливо для всех положительных чисел N.
Согласно простой математической индукции, для этого необхо­димо:
1) доказать, что справедливо высказывание S(1);
2) доказать, что если для любого положительного числа N справед-
ливо высказывание S(N
Из приведенных выше двух утверждений вытекает, что S(N) спра­ведливо для всех положительных чисел. Этот факт интуитивно очеви­ден, хотя при аксиоматической трактовке целых чисел сам принцип в такой формулировке следует рассматривать как аксиому. Из первого положения индукции следует, что справедливо S(1), а
), то справедливо и высказывание S(N + 1).
из второго – что
3
справедливо S(2), если справедливо S(1). Но S(1) справедливо, сле­довательно, должно быть справедливо и S(2). Из второго положения индукции вытекает также, что справедливо S(3), если справедливо S(2). Таким образом, поскольку мы знаем, что S(2) справедливо, следова­тельно, справедливо S(3) и т. д. Отсюда интуитивно видно, что эти два положения вместе доказывают
справедливость S(1), S(2), S(3), ...,
S(N)....
Рассмотрим пример использования простой индукции.
Пример 1.1. Мы хотим доказать, что для любого положитель­ного числа п сумма первых положительных целых чисел равна
(п + 1)/2, т. е.
п
1 + 2 + ... + n = n  (n + 1)/2
для любого положительного числа N. Используя простую индукцию, необходимо только доказать, что:
1) «сумма» верна для n = 1, т. е. 1 = 1 (1 + 1)/2. Это очевидно;
2) Если сумма первых п положительных целых чисел равна
п (п + 1)/2, то сумма первых п + 1 положительных целых
чисел равна
(п +1) [(п + 1)+1]/2, т. е. мы предполагаем, что формула 1 + 2 + ...+ n = = п (п + 1)/2 справедлива. Это гипотеза индукции. На ее основании мы должны попытаться доказать, что справедлива формула
1 + 2 + ...+ n + (п + 1) = (п + 1) [(п + 1) + 1]/2.
Докажем это следующим образом:
1 + 2 + ...+ n + (п + 1) = (1 + 2 + ...+ n ) + (п + 1) =
| По гипотезе индукции |
= [п  (п + 1)/2] + (п + 1) = [(п
2
= [(п
+ п)/2] + [(2п + 2)/2] = (п2 + 3п + 2)/2 =
= (п + 1)  (п + 2)/2 = (п + 1) [(п + 1) + 1]/2.
Что и требовалось доказать.
Поскольку мы доказали справедливость двух утверждений, по ин­дукции формула 1 + 2 + ... + п = п  (п + 1)/2 считается справедливой для любого положительного числа п.
2
+ п)/2] + (п +1) =
4
Принцип модифицированной простой индукции
Иногда необходимо доказать, что высказывание S(N) справедливо для всех целых N N
. Для этого можно довольно легко модифициро-
0
вать принцип простой индукции. Чтобы доказать, что высказывание S(N) справедливо для всех целых N, необходимо:
1) доказать, что справедливо S(N
2) доказать, что если S(N) справедливо для всех целых N N
);
0
, то
0
справедливо и S(N + 1);
В частности, если требуется доказать справедливость некоторого высказывания S(N) для любых положительных целых N (т. е. для
N  0), то надо:
1) доказать, что справедливо S(0);
2) доказать, что для всех неотрицательных целых п справедливо
S(N + 1), если справедливо S(N).
Пример 1.2. Для любого неотрицательного
0
+ 21 + 22 + … + 2N = 2
2
числа п доказать, что
N+1
– 1.
Используя простую индукцию, мы должны:
1) доказать, что 2
– 1 = 2
1
– 1= 2 – 1 = 1;
0
= 2
0+1
– 1. Это очевидно, так как 20 = 1 = 2
2) доказать, что если для всех неотрицательных целых N справед-
ливо
0
2
+ 21 + 22 + … + 2N = 2
N+1
– 1,
то справедлива и формула
0
2
Высказывание 2
+ 21 + 22 + … + 2N + 2
0
+ 21 + 22 + ... + 2 N = 2
N+1
(N+1)+1
= 2
N+1
– 1.
– 1 называется гипотезой
индукции. Второе положение доказывается следующим образом:
0
+ 21 + 22 + … + 2N + 2
2
N+1
= (2
– 1) + 2
N+1
= (20 + 21 + 22 + … + 2N ) + 2
N+1
= ( 2
N+1
+ 2
N+1
) – 1 =
N+1
=
| По гипотезе индукции |
N+1
= (22
+ 2
N+1
) – 1 = 2
Иногда нужно доказать справедливость высказывания S(N) для це­лых п, удовлетворяющих условию N
N+2
– 1 = 2
N M0. Так как между N0 и M0
0
(N+1)+1
– 1.
5
0+1
–
находится конечное число целых чисел, то справедливость S(N) можно доказать простым перебором всех возможных вариантов. Однако лег­че, а иногда и необходимо (если, например, мы не знаем конкретных значений N
и M0) доказать S(N) по индукции. В этом случае можно
0
воспользоваться одним из двух вариантов индукции.
Простая нисходящая индукция
1. Доказать, что справедливо S(N0).
2. Доказать, что если справедливо S(N), то для любых целых
N M0 – 1 справедливо и S(N + 1).
N
0
Простая восходящая индукция
1. Доказать, что справедливо S(M
).
0
2. Доказать, что если справедливо S(N), то для любых целых
+ 1 N M0 справедливо и S(N – 1).
N
0
Интуитивно понятно, что этого достаточно для доказательства справедливости S(N) при любых N, удовлетворяющих условию
N M0.
N
0
1.2. СТРОГАЯ МАТЕМАТИЧЕСКАЯ ИНДУКЦИИ
При доказательствах некоторых высказываний о целых числах иногда требуется более строгая версия принципа индукции.
Принцип строгой индукции
Пусть S(n) – некоторое высказывание о целом числе n и требуется доказать, что S(n) справедливо для всех положительных n. Для этого необходимо:
1) доказать, что справедливо S(1);
2) доказать, что если справедливы S(1), S(2), S(3), ..., S(n) для всех
положительных n, то справедливо и S(n + 1).
Отметим, что
эта версия индукции почти идентична простой ин­дукции, за одним исключением: при доказательстве второго положе­ния в качестве гипотезы предполагается не просто справедливость вы­сказывания S(n), а справедливость высказываний S(1), S(2), S(3), … …, S(n). Исходя из этой более строгой гипотезы, необходимо, как и выше, доказать справедливость S(n + 1).
Интуитивно
ясно, что эти два положения подразумевают справед-
ливость S(n) для любого положительного числа n. Из первого положе-
6
ния известно, что S(1) справедливо, а из второго следует, что если
справедливо S(1), то справедливо и S(2). Так как S(1) действительно справедливо, следовательно, то же можно сказать и о S(2). Затем, так как и S(1), и S(2) справедливы, из второго положения следует справед­ливость S(3). Из справедливости высказываний S(1), S(2), S
(3) и второ-
го утверждения вытекает справедливость высказывания S(4) и т. д.
Рассмотрим несколько примеров, в которых полезно использовать
принцип строгой индукции.
Пример 1.3. Простым числом называется положительное число, делящееся без остатка только на 1 и на само себя. Мы хотим доказать, что каждое положительное число n можно представить в виде произ­ведения
одного и более простых чисел. Докажем это с помощью стро-
гой индукции по n:
1) если n = 1, то это число является простым и, следовательно, его
можно представить как «произведение» одного простого числа;
2) предположим, что каждое из чисел 1, 2, ..., n может быть записа-
но в виде произведения простых чисел. Необходимо показать, что
чис­ло n + 1 также можно представить в виде произведения простых чисел. Если n + 1 является простым числом, то очевидно, что его можно запи­сать в виде произведения одного простого числа на 1. Если n + 1 – не простое число, тогда существует некоторое положительное число a, такое, что 1 < a < n + 1, и оно делит n + 1 без остатка
Другими словами,
1n
, или n + 1 = a b.
b
.
a
Каждое из чисел a и b меньше n. Следовательно, по гипотезе ин­дукции и a, и b можно представить в виде произведения простых чи­сел. Отсюда очевидно, что и n + 1 можно записать как произведение этих же простых чисел, так как n + 1 = a b.
Следует
отметить, что в этом примере, по существу, требуется строгая индукция. О числах a и b известно лишь только то, что они меньше n. Поэтому, для того чтобы использовать индукцию, необхо­димо знать, что каждое из положительных чисел 1, 2, ..., n может быть представлено в виде произведения простых чисел. Одного предполо­жения о том
, что n можно записать в виде произведения простых чи-
сел, оказывается недостаточно.
Пример 1.4. Рассмотрим последовательность чисел, называемых
числами Фибоначчи. В нее входят f
= 5, f6 = 8, ... , где (n + 1)-е число Фибоначчи определяется как f
f
5
= 0, f1 = 1, f2 = 1, f3 = 2, f4 = 3,
0
=
n + 1
7
= fn + f
f
n
(для n 1). Пусть = (1 +5)/2 и требуется доказать, что
n – 1
n – 1
для любого неотрицательного числа n. Для доказательства используем метод строгой индукции по n. Так как доказывается выска­зывание о неотрицательных числах, а принцип индукции сформулиро­ван для положительных, используем модификацию метода.
1. Для n = 0 необходимо показать, что f
так как f
= 0
0
15
когда
n = 1. Здесь мы имеем f
2. Предположим, что
ных целых чисел
2
m = 0, 1, 2, ... , n. Нужно показать, что f
–1
. Необходимо рассмотреть особый случай,
=
= 1 1=0 =
1
m – 1
f
m
справедливо для всех неотрицатель-
также справедливо. По гипотезе индукции
0
1–1
f
n
0 – 1
. Это справедливо,
.
и f
n+1
n–1
n – 1
(n + 1) – 1
(n – 1) – 1
Поэтому
f
n + 1
= fn + f
n – 1
n – 1
+
n – 2
=
n – 2
(+1).
Обратите внимание, что

15 12556253515
2
 

 
Фактически мы так и выбирали , чтобы выполнялось условие
2
+ 1 =
. Поэтому мы получаем
f
n + 1
2

24422
= fn + f
n – 1
n – 2
( + 1) =
n – 2
2 = n =
1
(n + 1) – 1
= + 1.
,
.
что и требовалось доказать.
Отметим, что необходимо было знать, что и
, и f
n
удовлетво-
n–1
f
ряют гипотезе индукции. Только в этом случае доказательство воз­можно. Одного только знания о справедливости высказывания для
f
недостаточно. Таким образом, строгая индукция нам необходима по существу. Отметим также, что в данном частном случае нам потребо-
f
валось доказывать, что
f
+ f–1, так как f–1 не существует.
0
0 и f1 1; мы не можем записать f1 как
0
В качестве упражнения по данной теме попробуйте изменить при­веденный в настоящем разделе принцип индукции для доказательства справедливости высказывания
n n
ющих условию
, а не только для любых положительных целых
0
S(n) для целых чисел n, удовлетворя-
чисел.
8
n
1.3. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
1. Докажите, что для любого положительного числа n справедливы
формулы:
012
333 3
  
а)
nn
31
; б)
2
33 3
12

22
(1)
nnn
4
1
2. Докажите, что сумму п первых членов арифметической прогрес-
()
aan
1
сии можно вычислить по формуле
S
n
член последовательности определяется как
n
, учитывая, что п-й
2
aa dadn
nn
 
11
3. Докажите, пользуясь принципом простой индукции, что для любого по­ложительного числа п общее число ша­ров в пирамиде из п рядов (рис. 1) рав-
(1)
nn
но
.
2
уровень 1 уровень 2 уровень 3 уровень
4. Используя простую индукцию, докажите справедливость формулы
fff f f

246 2 21
nn
1
Рис. 1
.
(1)
.
4
для любого положительного числа n, где f
, f1, f2, …, fn – последова-
0
тельность чисел Фибоначчи.
5. Используя метод строгой индукции, докажите справедливость
1
n
7

формулы
f
n

4

всех неотрицательных n.
1.4. КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 1 Тема «Математическая индукция»
1. Что такое математическая индукция?
2.
В чем заключается принцип простой индукции?
3.
Что называется гипотезой индукции? Что такое простая нисходящая индукция?
4.
5.
Что такое простая восходящая индукция?
6.
Чем отличается принцип модифицированной простой индукции
от простой индукции?
В чем заключается принцип строгой индукции?
7.
9
8. В чем отличие принципа строгой индукции от простой индук-
ции?
Что такое обобщенная индукция?
9.
Сформулируйте принцип обобщенной индукции
10.
Глава 2. ДОКАЗАТЕЛЬСТВО ПРАВИЛЬНОСТИ
БЛОК-СХЕМ ПРОГРАММ
При составлении программы для вычислительной машины мы стремимся к тому, чтобы программа решала некоторую определенную задачу. Однако каждый программист отчетливо и с горечью осознает, что большинство наших программ содержит ошибки. Мы тратим обычно много времени на тестирование и отладку созданных нами не­правильных программ. Даже закончив тестирование и отладку про­граммы, мы не можем быть уверены, что она совершенно правильна. Все, что можно сказать о ней, это то, что программа дает правильные результаты для тех частных данных, которые использовались при ее тестировании. Позже, когда программа будет работать с новыми ис­ходными данными, могут обнаружиться и другие ошибки. Каждый опытный программист знает может работать без ошибок и кажется совершенно правильной, и вдруг внезапно, таинственным образом появляется очередная ошибка. По­этому независимо от интенсивности тестирования никогда нельзя по­ручиться за правильность программы.
Было бы идеально, если бы мы могли доказать правильность про­граммы, а не ссылаться только если даже удастся доказать, что программа правильна, то нельзя быть в этом абсолютно уверенным. В доказательстве, как и в программе, так­же могут быть ошибки. Тем не менее усилия, затраченные на доказа­тельство правильности программы, способствуют всестороннему по­ниманию программы. Ведь чтобы доказать, что программа правильна,
очень хорошо в ней разобраться. Опыт показывает, что именно
надо поэтому доказательство правильности весьма полезно и способствует обнаружению тех ошибок, которые могли быть пропущены, если бы доказательство не проводилось.
Если бы можно было формализовать доказательство правильно­сти и проводить его абсолютно надежным образом (автоматически
, что программа в течение долгого периода
на проведенное тестирование. Конечно,
10
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]