|
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТСтр 1 из 4Следующая ⇒
Е.Л. Веретельникова
сборник задач
Часть 1. доказательство правильности программ
Утверждено Редакционно-издательским советом университета НОВОСИБИРСК Рецензенты: канд. техн. наук И.А. Полетаева, доц. каф. ПМт; Работа подготовлена на кафедре автоматики Веретельникова Е.Л. сборник задач по курсу «теория вычислительных процессов»: Часть 1. Доказательство правильности программ: сборник задач / Е.Л. Веретельникова. – Новосибирск: Изд-во НГТУ, 2006. – 48 с. В работе изложены теоретический материал и практические задания для освоения основных принципов и приемов доказательства правильности программ, представленных блок-схемами или записанных на языках высокого уровня. Материал подразделен на восемь основных тем и сгруппирован таким образом, чтобы изучению одной темы соответствовало одно-два аудиторных занятия. В рамках каждой темы предлагаемые принципы доказательства иллюстрируются примерами, а затем предлагаются упражнения для самостоятельной работы. Пособие будет полезно для студентов заочной формы обучения и для студентов других специальностей, изучающих программирование и интересующихся вопросами доказательства правильности программ.
© Новосибирский государственный
Тема 1. МАТЕМАТИЧЕСКАЯ ИНДУКЦИЯ в основу многих приемов доказательства правильности, в том числе и доказательства правильности программ для вычислительных машин, положен принцип математической индукции. Математическая индукция представляет собой некоторый общий способ доказательства в математике. Рассмотрим на примерах различные виды математической индукции как фундаментального способа доказательства в математике. Начнем с самых простых версий этого метода – простой индукции – необходимой для понимания сути методов доказательства правильности программ, после чего перейдем к более строгой версии индукции, а в качестве приложения (в качестве задач повышенной сложности) приведем обобщение этого метода на случай любых вполне упорядоченных множеств, а не только положительных чисел. Принцип простой индукции Обычно математическую индукцию вводят как метод доказательства утверждений о положительных числах. Пусть S(n) — некоторое высказывание о целом числе n и требуется доказать, что S(n) справедливо для всех положительных чисел n. Согласно простой математической индукции, для этого необходимо 1. Доказать, что справедливо высказывание S(1). 2. Доказать, что если для любого положительного числа n справедливо высказывание S(n),то справедливо и высказывание S(n +1). Пример использования простой индукции для доказательства правильности некоторого утверждения о положительных числах можно посмотреть в [1]. Принцип модифицированной простой индукции Иногда необходимо доказать, что высказывание S(n) справедливо для всех целых n³n0. Для этого можно довольно легко модифицировать принцип простой индукции. Чтобы доказать, что высказывание S(n) справедливо для всех целых n, необходимо: 1. Доказать, что справедливо S(n0). 2. Доказать, что если S(n) справедливо для всех целых n³n0, то справедливо и S(n+1). В частности, если требуется доказать справедливость некоторого высказывания S(n) для любых положительных целых n (т. е. для n³0), то необходимо: 1. Доказать, что справедливо S(0). 2. Доказать, что для всех неотрицательных целых n справедливо S(n+1), если справедливо S(n). Рассмотрим пример использования модифицированной простой индукции. ПРИМЕР 1.1. Для любого неотрицательного числа n доказать, что 20 + 21 + 22 + … + 2n = 2n+1 – 1. Используя простую индукцию, мы должны 1. Доказать, что 20 = 20+1 – 1. Это очевидно, так как 20 = 1 = 20+1 – 1 = 21 – 1= 2 – 1 = 1. 2. Доказать, что если для всех неотрицательных целых n справедлива формула 20 + 21 + 22 + … + 2n = 2n+1 – 1, то справедлива и формула 20 + 21 + 22 + … + 2n + 2n+1 = 2(n+1)+1 – 1. Высказывание 20 + 21 + 22 + ... + 2 n = 2n+1 – 1 называется гипотезой индукции. Второе положение доказывается следующим образом: 20 + 21 + 22 + … + 2n + 2n+1 = (20 + 21 + 22 + … + 2n ) + 2n+1 = = (2n+1 – 1) + 2n+1 = ( 2n+1 + 2n+1 ) – 1 =2×2n+1 – 1 = 2n+2 – 1 = 2(n+1)+1 – 1. (По гипотезе индукции) Что и требовалось доказать. Поскольку мы доказали справедливость двух утверждений, то по индукции формула 20 + 21 + 22 + … + 2n = 2n+1 – 1. считается справедливой для любого неотрицательного числа n. Упражнения 1. Докажите, что дня любого положительного числа n справедливы формулы: 1) 3) Обратите внимание, что из двух последних формул вытекает справедливость такой интересной формулы: 2. Приведенные на рис. 1.1 графы представляют собой примеры полных двоичных графов уровней 0, 1, 2 и 3. Полный двоичный граф уровня n подобен приведенным графам: из каждой его вершины, кроме вершин уровня п, выходят по два ребра. Вершины уровня п называются концевыми вершинами или листьями дерева. С помощью индукции по уровню n докажите, что число концевых вершин в полном двоичном дереве уровня п равно 2n. Напишите формулу для числа всех вершин в полном графе (как концевых, так и неконцевых) и докажите ее справедливость для любого положительного числа п.
3. На рис. 1.2 даны примеры полных графов, содержащих 1-5 вершин. Полный граф из п вершин аналогичен приведенным: пара любых его вершин соединена ребром. Напишите формулу для числа всех ребер в полном графе с п вершинами и докажите ее справедливость с помощью индукции по п.
4. Доказать, что сумму п первых членов арифметической прогрессии можно вычислить по формуле 5. 4. Доказать, что сумму п первых членов геометрической прогрессии можно вычислить по формуле
7. Найдите ошибку в следующем доказательстве. Доказать, что
1. Для п = 1 формула справедлива, ибо 2. Предположим, что формула справедлива для п, т.е.
Покажем, что эта формула справедлива и для п + 1:
(По гипотезе индукции) Таким образом, утверждение справедливо и для п + 1. Хотя доказательство выглядит как будто правильно, тем не менее оно неверно, так как для п = 4
Однако 8. Найдите ошибку в следующем доказательстве. Доказать, что в любой куче камешков все камешки одного цвета. Используем индукцию по числу камешков в куче. 1. Для п = 1 это высказывание очевидно, т.к. вся куча состоит из одного камешка и поэтому в куче есть камешки только одного цвета. 2. Предположим, что наше высказывание справедливо для любой кучи из п камешков. Покажем, что оно справедливо и для кучи из (п + 1) камешков. Кучу камешков можно представить следующим образом (рис. 1.5). Если же мы уберем (п + 1)-й камешек из этой кучи, то останется куча из п камешков (рис. 1.6). По гипотезе индукции все камешки в такой куче имеют один цвет. Представим себе, что вместо последнего мы выбрасываем первый камешек из кучи (рис. 1.7). Но здесь то же число п камешков и, следовательно, все они одного цвета. Отсюда следует, что и (п + 1) камешков будут одного цвета, т.к. известно, что камешки (рис. 1.8) одного цвета, а (п + 1)-й камешек того же цвета, что и п-й (даже больше, его цвет совпадает с цветом второго, третьего и т.д.). Отсюда и следует справедливость нашего утверждения.
Рис. 1.5 Рис. 1.6 Рис. 1.7 Рис. 1.8 При доказательствах некоторых высказываний о целых числах иногда требуется более строгая версия принципа индукции. Принцип строгой индукции Пусть S(n) – некоторое высказывание о целом числе n и требуется доказать, что S(n) справедливо для всех положительных n. Для этого необходимо: 1) доказать, что справедливо S(1); 2) доказать, что если справедливы S(1), S(2), S(3), ..., S(n) для всех положительных n, то справедливо и S(n + 1). Рассмотрим пример использования строгой индукции, когда предположений простой индукции оказывается недостаточно для доказательства. Пример 1.2. Рассмотрим последовательность чисел, называемых числами Фибоначчи. В нее входят f0 = 0, f1 = 1, f2 = 1, f3 = 2, , f4 = 3, f5 = 5, f6 = 8, ... , где (n + 1)-е число Фибоначчи определяется как fn + 1= fn + fn – 1 (для n ³ 1). Пусть a = (1 + 1. Для n = 0 необходимо показать, что f0 £ a0 – 1 . Это справедливо, так как f0 = 0 2. Предположим, что fm £ am – 1 справедливо для всех неотрицательных целых чисел m = 0, 1, 2, ... , n. Нужно показать, что fn+1 £ a(n + 1) – 1 также справедливо. По гипотезе индукции fn £ an – 1 и fn–1 £ a(n – 1) – 1. Поэтому fn + 1 = fn + fn – 1 £an – 1 + an – 2 = an – 2 × (a+1). Обратите внимание, что a2 Фактически мы так и выбирали a, чтобы выполнялось условие a + 1 = a2. Поэтому мы получаем fn + 1 = fn + fn – 1 £ an – 2 × (a+1) = an – 2 × a2 = an = a(n + 1) – 1 . что и требовалось доказать. Отметим, что необходимо было знать, что и fn, и fn–1 удовлетворяют гипотезе индукции. Только в этом случае доказательство возможно. Одного только знания о справедливости высказывания для fn недостаточно. Таким образом, строгая индукция нам необходима по существу. Отметим также, что в данном частном случае нам потребовалось доказывать, что f0 £ a0 и f1 £ a1; мы не можем записать f1 как f0 + f–1 , так как f–1 не существует. Упражнения 9. Простым числом называется положительное число, делящееся без остатка только на 1 и на само себя. Попытаться доказать самостоятельно, что каждое положительное число n можно представить в виде произведения одного и более простых чисел, используя строгую индукцию по n. (Подробное решение этой задачи приведено в [2], [3].) 10. Изменить приведенный в данном разделе принцип индукции для доказательства справедливости высказывания S(n) для целых чисел n, удовлетворяющих условию n ³ n0, а не только для любых положительных целых чисел. 11. Используя простую индукцию, докажите справедливость следующих формул: а) б) в) 12. Используя метод строгой индукции, докажите справедливость следующих формул: а) б) 13. Найдите ошибку в следующем доказательстве. Мы хотим доказать, что a n – 1 = 1 для любого положительного числа n. Используем строгую индукцию: 1. Для п = 1 эта формула справедлива, так как a n – 1 = a 1 – 1 = a 0 = 1. 2. Предположим, что высказывание справедливо для 1, 2, 3, ..., п, т.е. a 0 = 1, a 1 = 1, a 2 = 1, a n – 1 = 1. Нужно показать, что a (n +1) – 1 = 1: a (n +1) – 1 = a n = a 1 · a n – 1 = 1 · 1 = 1. (По гипотезе индукции) Тема 2. ДОКАЗАТЕЛЬСТВО ПРАВИЛЬНОСТИ ![]() Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|