Автор работы: Пользователь скрыл имя, 30 Января 2013 в 19:35, курсовая работа
В настоящее время в области доказательства правильности программ проводятся интенсивные исследования. Для простоты обсуждения выделим среди этих исследований три основных направления:
1. Методы доказательства (частичной) правильности или конечности.
2. Проблемы разработок программ и создания языков программирования.
1. Теоретический материал 5
2. Практические задания 6
Литература 19
федеральное агенство
связи уральский
Курсовая работа
по дисциплине
«Теория вычислительных процессов»
Г. ЕКАТЕРИНБУРГ, 2013 ГОД
Содержание
1. Теоретический материал 5
2. Практические задания 6
Литература 19
В настоящее время в области доказательства правильности программ проводятся интенсивные исследования. Для простоты обсуждения выделим среди этих исследований три основных направления:
1. Методы доказательства (частичной) правильности или конечности.
2. Проблемы разработок программ и создания языков программирования.
Эти направления перекрываются, и мы их рассматриваем не для того, чтобы уточнить области исследований, а просто как некоторое средство организации обсуждения. Само обсуждение будет очень кратким: мы попытаемся лишь выявить характер исследований в данном направлении и отметить некоторых из специалистов, которые работают в этих направлениях. Более подробно студенты могут ознакомления с тем или иным направлением исследований, работая самостоятельно.
В наших учебных пособиях
(и в курсе теории вычислительных
процессов) мы сконцентрировали внимание
на двух основных методах: методе индуктивных
утверждений и структурной
Существуют и другие методы доказательства правильности программ. Различные методы доказательства полной правильности итеративных программ приводятся в работах Базу, Бурсталла, Дейкстры, Манны и др. В работе Бурсталла рассмотрен алгебраический подход к доказательству правильности. В работах Бурсталла и Вегбрейта обсуждаются методы доказательства правильности программ, использующих сложные структуры или модифицирующие структуру данных. В работах Манны показано, как можно использовать метод индуктивных утверждений для доказательства правильности недетерминированных программ. В работах Ашкрофта, Келлера, Липтона рассматриваются методы доказательства правильности параллельных программ.
Такой метод доказательства,
как метод индуктивных
Для доказательства правильности рекурсивных программ было предложено много индуктивных методов. В работах Маккарти, Морриса и Парка предлагаются индуктивные методы, в которых индукция ведется по уровню рекурсии. Эти методы отличаются от доказательства методом структурной индукции, описанного в нашей книге, где индукция ведется по структуре данных, с которыми работает программа. В работе Манны, Леса и Виллемина проведено сравнение многих из предложенных индуктивных методов доказательства правильности рекурсивных программ.
В работе Манны «Математическая теория вычислений» дается некоторый формальный подход ко многим известным методам доказательства правильности программ. Рассмотрены методы доказательства правильности и конечности для итеративных и рекурсивных программ.
Желание создавать программы, для которых было бы легко удостовериться в их правильности, привлекло внимание к проблеме конструирования программ и разработки языков программирования. Работа «Конструктивный подход к проблеме правильности программ» была одной из первых работ, относящихся к проблемам конструирования программ и доказательству их правильности. Другая его работа «Программирование без Goto» также была одной из первых, где вопросы разработки языка связывались с проблемами правильности (речь шла об исключении операторов перехода). Эти же проблемы обсуждались и в других его работах.
Большинство последних работ, где проблемы построения программ связываются с проблемами их правильности, посвящены структурному программированию. Основное внимание в них уделяется таким методам создания программ, которые позволяли бы программисту следить (неформально убеждаться) за правильностью программы на всех этапах процесса программирования. Этой теме посвящены работы Дейкстры и Хоара «структурное программирование», а также работа Макхована и Келли «Стратегии структурного программирования «сверху вниз» и «снизу вверх». Вирт в книге «Системное программирование: введение» написал введение в программирование, где он так же рассматривает структурное программирование и проблемы доказательства правильности. В работе Хоара «Доказательство правильности структурированных программ» приводится детальное доказательство правильности для одной структурированной программы. Миллс («Новые пути компьютерного программирования» и «Как написать правильную программу и доказать это») и Бакер («Структурное программирование в создании программного обеспечения») рекомендуют использовать структурное программирование при создании программного обеспечения. Проблемы структурного программирования и использования оператора перехода рассматриваются и в работе Кнута «Структурное программирование с оператором go to».
После знаменитого письма
Дейкстры об операторе перехода (GO ТО)
появились работы, где прослеживается
влияние проблемы доказательства правильности
на разработку языка программирования.
Среди языков, в которых проявилось влияние
вопросов доказательства правильности,
следует отметить такие языки, как Паскаль,
А1рharh, Сlu, Nucleus. В работе Хоара «Процедуры
и параметры: аксиоматический подход»
обсуждаются возможные ограничения на
процедуры и параметры, которые могли
бы облегчить доказательство правильности.
Морисс «Верификационно-
Книга Дейкстры «Дисциплина программирования» посвящена методам доказательства правильности и конструированию программ и языков. В ней вводится новый формализм для проведения доказательства правильности и новый минимальный язык, на котором написаны все примеры программ в книге. Этот язык специально создавался для того, чтобы ограничить программирование очень простыми, но «мощными» конструкциями, приспособленными в то же время и для методов верификации, использованных в работе. Основное содержание книги – программы, для которых автор очень подробно разбирает вопросы их создания и доказательства правильности.
Целью многих исследований в области доказательства правильности программ является формализация и в конце концов механизация таких доказательств. Если можно будет создать работающую систему механической верификации, то это сыграет важную роль в вычислительной технике. Хотя неформальное доказательство правильности, подобное тому, о котором шла речь в наших учебных пособиях, и является полезным, но ведь здесь возможны и ошибки. Хорошо было бы иметь некоторую механическую систему верификации, которая либо помогала проводить доказательство правильности в интерактивном режиме, либо работала как непогрешимый контролер для доказательств. На каком из этих направлений будет достигнут успех – пока неясно. Однако сейчас уже предпринимаются первые попытки построить такие системы.
Если мы хотим использовать механическую систему верификации при проведении доказательства правильности, то нужно каким-то образом формализовать и индуктивные утверждения, и сами доказательства. Чаще всего для формализации используется исчисление предикатов первого порядка, хотя такой способ не всегда пригоден для выражения некоторых утверждений и для доказательств. В работах Бурсталла и Манны есть примеры формализованных доказательств правильности на основе нотации исчисления предикатов первого порядка. В работе Лискова и Зиллеса «Программирование с абстрактными типами данных» исследуются различные методы спецификации, которые можно было бы использовать для формальной записи индуктивных утверждений.
Большинство уже построенных систем механической верификации основывается на методе индуктивных утверждений. Такие системы в качестве входных данных рассматривают исходную программу, которую нужно верифицировать, и вместе с ней сформулированные программистом индуктивные утверждения. Основываясь на «заложенных в ней знаниях» синтаксиса и семантики языка программирования, система прослеживает все пути, по которым может идти выполнение программы, и формирует множество условий верификации, которые должны обеспечить верификацию всей программы. В главе 2 мы уже показали, как можно формировать такие формализованные условия верификации: для этого используются программы алгебраических и логических упрощений и «доказыватель» (программа) теорем исчисления предикатов первого порядка. Из-за того что программа, доказывающая механически теоремы, скорее всего будет при некоторых доказательствах обнаруживать ошибки, системы обычно делаются интерактивными и позволяют пользователю вмешиваться в те части доказательств, где обнаруживаются неточности. Системы механической верификации такого типа описываются в работах Гуда, Кинга, Судзуки и др. Системы механической верификации обсуждаются также в работах Куппера, Лондона, Игараши, Левитта, Вандингера.
Боуер и Мур описывают систему механической верификации для доказательства теорем о программах на Лиспе. Эта система существенно отличается от названных выше систем. Так как она предназначена для доказательства теорем о рекурсивных по определению программах, то в качестве основного метода в ней используется не метод индуктивных утверждений, а метод структурной индукции.
Во всех системах механической
верификации, использующих метод индуктивных
утверждений, требуется, чтобы индуктивные
утверждения задавал
Некоторые идеи и методы систем механической верификации используются в более ограниченных системах, которые создаются для того, чтобы помочь программисту систематически тестировать и отлаживать свою программу. Реализации таких систем описываются в работах Кинга («Корректное доказательство правильности программ», «Подход к программному тестированию»), Элсписа Левитта и Валдингера («Интерактивная система для верификации компьютерных программ».
1. Доказать с помощью простой индукции, что для любого положительного n
2 + 4 + 6 + … + (2n – 2) + 2n = n(n + 1)
Используя простую индукцию, мы должны:
1. Доказать, что 2 = 1(1 + 1). Это очевидно, т.к. 2 = 1*2.
2. Доказать, что если для всех положительных n справедлива формула
2 + 4 + 6 + … + (2n – 2) + 2n = n(n + 1)
то справедлива и формула
2 + 4 + 6 + … + (2n – 2) + 2n + 2(n + 1) = (n+1)((n + 1) + 1)
Первая формула будет являться гипотезой индукции , а вторую необходимо доказать:
2+4+6+…+(2n–2)+2n+2(n+1)= (2+4+6+…+(2n–2)+2n)+2(n+1)=
n(n+1)+2(n+1)=(n+1)(n+2)=(n+1)
(по гипотезе
индукции)
Что и требовалось доказать. Поскольку доказана справедливость двух утверждений, то по индукции формула
2 + 4 + 6 + … + (2n – 2) + 2n = n(n + 1)
Считается справедливой для любого положительного n.
2. Доказать
правильность блок-схемы
Сначала необходимо доказать, что при попадании в точку 2 J = 2I .
1. При первом попадании в точку 2 при переходе из точки 1имеем I = 0 и J = 1. Таким образом, утверждение J = 2I = 20 = 1справедливо.
2. Предположим, мы попали в точку 2 и утверждение J = 2I справедливо. Пусть I и J в этой точке принимают значения In и Jn, т.е. Jn = 2In. Если I ¹ N ложно, то это уже обеспечивает конечный результат. Предположим, что мы прошли по циклу, что возможно только при выполнении условия I ¹ N. При возвращении в точку 2 I и J принимают новые значения In+1 и Jn+1, которые можно представить следующим образом:
In+1 = In + 1,
J n+1 = 2 * Jn = 2 * 2In = 2In+1 =
Следовательно, при очередном попадании в точку 2 высказывание
J = 2I вновь справедливо, что и требовалось доказать, т.е. при любом попадании в точку 2 справедливо высказывание J = 2I.
Теперь необходимо доказать, что в конце концов попадем в точку 2 со значением I = N. При первом попадании в точку 2 имеем I = 0. При последующих попаданиях, если таковые есть, I каждый раз увеличивается на 1. Так как значение N нигде в программе не изменяется, и мы предположили, что N ³ 0, то очевидно, что в какой-то момент I станет равным N.
Если мы попадем в точку 2 при I = N, то будет верно и J = 2I = 2N. Отношение I ¹ N в этот момент ложно, и мы попадаем по стрелке с пометкой F (FALSE – ложь) в точку 3 с J = 2N. На этом доказательство правильности программы заканчивается.
Информация о работе Курсовая работа по «Теории вычислительных процессов»