
- •2.6. Заключение .............................................................................................................. 22
- •4. Язык исчисления вычислимых предикатов,
- •4.12. Однозначность предикатов .......................................................................................... 45
- •5. Семантика языка предикатного программирования.
- •6.9. Формулы .......................................................................................................................... 78
- •6.9. Процессы ......................................................................................................................... 79
- •6.11. Императивное расширение .......................................................................................... 82
- •7.8. Заключение ................................................................................................................... 108
- •Введение в курс предикатного программирования
- •1. Общее понятие программы
- •1.1. Автоматическая вычислимость
- •1.2. Спецификация программы
- •1.3. Формы спецификации программы
- •Список литературы
- •2. Корректность программ с предикатной спецификацией
- •2.1. Предикатная спецификация программы
- •2.2. Логическая семантика языка программирования
- •2.3. Модель корректности программы
- •2.4. Система правил доказательства корректности операторов
- •2.4.1. Правила для корректного оператора
- •2.4.2. Правила корректности для параллельного оператора
- •2.4.3. Правила корректности для оператора суперпозиции
- •2.4.4. Правила корректности для условного оператора
- •2.5. Система правил вывода программы из спецификации
- •2.5.1. Однозначность предикатов
- •2.5.2. Теорема тождества спецификации и программы
- •2.5.3. Правила корректности для параллельного оператора
- •2.5.4. Правила корректности для оператора суперпозиции
- •2.5.5. Правила корректности для условного оператора
- •2.6. Заключение
- •Список литературы
- •3. Математические основы
- •3.1. Отношения порядка
- •3.2. Наименьшая неподвижная точка
- •3.3. Математическая индукция
- •Список литературы
- •4. Язык исчисления вычислимых предикатов, его логическая и операционная семантика
- •4.1. Структура программы на языке ccp
- •4.2. Система типов данных
- •4.3. Логическая и операционная семантика языка ccp
- •4.4. Семантика вызова предиката
- •4.5. Оператор суперпозиции
- •4.6. Параллельный оператор
- •4.7. Условный оператор
- •4.8. Конструктор предиката
- •4.9. Конструктор массива
- •4.10. Программа
- •4.11. Рекурсивные определения предикатов
- •4.12. Однозначность предикатов
- •Список литературы
- •5. Семантика языка предикатного программирования. Методы доказательства корректности предикатных программ
- •5.1. Язык p1: подстановка определения предиката на место вызова
- •5.2. Язык p2: оператор суперпозиции и параллельный оператор общего вида
- •5.3. Язык p2: другое обобщение оператора суперпозиции
- •5.4. Язык p3: выражения
- •5.5. Методы доказательства корректности рекурсивных программ
- •6. Язык предикатного программирования
- •6.1. Введение
- •6.2. Лексемы
- •6.3. Предикаты
- •6.3.1. Определение предиката
- •6.3.2. Спецификация предиката
- •6.3.3. Вызов предиката
- •6.4. Программа
- •6.5. Операторы
- •6.6. Выражения
- •6.7. Типы
- •6.8. Массивы
- •6.8.1. Описание типа массива
- •6.8.2. Вырезка массива
- •6.8.3. Определение массива
- •6.8.4. Объединение массивов
- •6.9. Формулы
- •6.10. Процессы
- •6.11. Императивное расширение
- •Список литературы
- •7. Технология предикатного программирования
- •7.1. Подстановка определения предиката на место вызова
- •7.2. Замена хвостовой рекурсии циклом
- •7.3. Склеивание переменных
- •7.4. Метод обобщения исходной задачи
- •7.5. Трансформация кодирования структурных объектов
- •7.6. Пример. Сортировка простыми вставками
- •7.7. Гиперфункции
- •7.8. Заключение
- •Список литература
Список литературы
1. Программа // Краткая российская энциклопедия. М.: Большая российская энциклопедия ОНИКС 21 век, 2003.
2. Марков А. А., Нагорный Н.М. Теория алгорифмов. М.: Наука, Физматлит, 1984. 432 с.
3. Минский М. Вычисления и автоматы: Пер. с англ. М.: Мир, 1971. 364 с.
4. Питерсон Дж. Теория сетей Петри и моделирование систем. М.: Мир, 1984. 264 с.
5. Gosling J., Joy B., Steele G. The Java Language Specification. Pre-Release Version 1.0, Draft 5.2 July 3, 1996.
6. Kain R. Y. Automata Theory: Machines and Languages. McGraw-Hill, N. Y., 1972. 301 p.
7. Gurevich Y. Sequential Abstract State Machines capture Sequential Algorithms // ACM Transactions on Computational Logic. 2000. Vol. 1, N 1. P. 77111.
8. Шелехов В. И. Инвариант языка программирования // Средства и инструменты окружений программирования. Новосибирск, 1995. С. 622.
9. Мир Лиспа: Пер. с англ. М.: Мир, 1990. Т. 2. Методы и системы программирования. 318 с.
10. Клини С. К. Введение в метаматематику, пер. с англ., М., 1957.
11. Ершов А .П., Шура-Бура М. Р. Пути развития программирования в СССР. Новосибирск, 1976. (Препринт ВЦ СО АН СССР, №12)
12. Hoare C. A. R. Communicating Sequential Processes. Prentice-Hall, 1985.
13. Watt D.A. Programming Language Concepts and Paradigms. Prentice Hall, 1990. 322 p.
14. Лавров С.С. Программирование. Математические основы, средства, теория. СПб: БХВ-Петербург, 3001. 320 с.
15. Meyer B. Introduction to the Theory of Programming Languages. Prentice Hall, 1990. 448 p.
16. Zamulin A. V. Algebraic Semantics of an Imperative Programming Language as a Compiler Abstract Model // Joint NCC\&ISS Bull., 20. Comp. Science, 2004. P. 113128.
17. Замулин А. В. Алгебраическая семантика императивного языка программирования // Программирование. 2003, № 6. С. 114.
2. Корректность программ с предикатной спецификацией
Для класса программ с предикатной спецификацией рассматривается программа вместе со своей спецификацией. Введенное в предыдущем разделе понятие предикатной спецификации уточняется следующим образом: спецификация есть формула P(x) & Q(x, y), где P(x) предусловие, истинное перед исполнением программы, а Q(x, y) постусловие, истинное после исполнения программы. Программа S со спецификацией записывается в виде известной тройки Хоара {P(x)} S {Q(x, y)}, см. [9].
Представление о правильности программы принято формулировать в виде понятия корректности программы. Корректность определяется условиями корректности, которые должны быть истинны для правильной программы. Истинность постусловия после завершения исполнения программы, безусловно, является условием корректности программы. Однако данное условие имеет смысл, если программа завершается. Условие того, что программа завершается, также является условием корректности. Поэтому истинность постусловия принято считать частичным условием корректности. Истинность постусловия вместе с условием завершения программы определяет условие полной (или тотальной) корректности программы.
Чтобы полностью записать условие корректности, определяющее истинность постусловия, следует в математическом виде представить эффект исполнения программы. Необходимым инструментом для этого является формальная семантика языка программирования. Различаются следующие виды формальной семантики: денотационная [8], аксиоматическая [9, 10] и операционная [11]. Мы будем использовать новый вид формальной семантики логическую семантику [2].
Используя логическую семантику, можно построить формулу тотальной корректности программы.
Нашей задачей является разработка методов доказательства корректности программы «вручную», чтобы программист, разработав программу и спецификацию, мог бы доказать ее корректность в традиционном математическом стиле. Здесь необходима техника доказательства снизу вверх: если оператор S состоит из операторов A и B, то сначала следует доказать корректность операторов A и B, а затем по определенным правилам доказывать корректность оператора S. Мы построим систему правил доказательства для трех базисных операторов: оператора суперпозиции A; B, параллельного оператора A || B и условного оператора if (C) A else B.