
- •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.3. Формы спецификации программы
Распространена точка зрения, что спецификацию программы можно представить в виде функции. Поскольку это не всегда так, возникает вопрос о классификации форм, которые может принимать спецификация программы. Определим следующие три формы спецификации программы: предикатную, процессную и процессорную.
Спецификация называется предикатной, если она эксплицируема в виде формулы на языке исчисления предикатов 2. Такая экспликация возможна для спецификации, представленной в математической форме. Для программы с предикатной спецификацией характерна простая схема взаимодействия программы с окружением: ввод входных данных происходит в начале исполнения программы, вывод результирующих данных в конце, а других взаимодействий с окружением нет. В данной схеме спецификация определяет функцию, отображающую значения входных данных в значения результатов.
Предикатная спецификация есть условие математической задачи, исходными данными которой являются входные данные программы, а неизвестными результаты программы. Программа является реализацией алгоритма решения математической задачи. Алгоритм строится с использованием свойств (утверждений, лемм, теорем), доказуемых из условия задачи строгими математическими методами. Описание алгоритма обычно является содержательным, хотя доказательство правильности алгоритма остается математически строгим. Программа является результатом кодирования алгоритма на языке программирования.
Спецификация называется процессной, если эффект исполнения программы определяется в виде процесса. Процесс исполнения программы обычно определяется как бесконечный. При исполнении программа обменивается информацией с окружением, причем взаимодействие программы с окружением может быть произвольной сложности. Довольно часто процессная спецификация определяется в виде набора взаимодействующих параллельных процессов. Структура спецификации описывается следующими моделями: машиной конечных состояний [6], сетью Петри [4], моделью CSP [12] Т. Хоара, машиной абстрактных состояний [7] Ю. Гуревича и др. Предикатная спецификация может рассматриваться как частный случай процессной. Однако большинство процессных спецификаций нельзя представить в виде предикатных.
Разработка программы с процессной спецификацией является частью более общей задачи по созданию системы, функционирование которой реализует базовый процесс. В отличие от математических задач спецификация обычно не существует изначально и вырабатывается в процессе конструирования системы. Принято считать, что спецификация является результатом этапа определения требований в разработке системы и программы как ее части.
Спецификация называется процессорной, если она описывает функционирование процессора некоторого языка программирования. Спецификация определяет единую форму множеств исполнений произвольной программы на данном языке. Спецификация процессора является частью спецификации языка программирования и определяется семантикой исполнения программы. В пользовательском описании языка программирования спецификация процессора представлена частично и неявно. Формализованное описание семантики исполнения, абстрагированное от синтаксиса и статической семантики 3, применяется для проектирования внутреннего представления программы в трансляторе [8].
Формальная семантика есть математическое описание семантики языка программирования. Она используется преимущественно для целей верификации программ. Различают следующие виды формальной семантики: операционную, денотационную и аксиоматическую [14; 15]. В большинстве подходов описание формальной семантики оказывается сложным и громоздким. Перспективным является метод алгебраической семантики (разновидности денотационной), в которой состояние исполняемой программы определяется в виде многоосновной алгебры [16; 17], компоненты которой соответствуют один в один состоянию памяти исполняемой программы и операциям по манипулированию ячейками памяти. Описание алгебраической семантики в определенном смысле подобно трансляторной модели программы. Оно прозрачно и компактно, дает возможность однозначного понимания языка и становится полезным для разработчика транслятора.
Известно, что процессор для чистого языка функционального программирования можно написать на том же языке, из чего следует, что спецификация процессора представима в виде функции. Например, интерпретатор Lisp-программы можно написать на языке Lisp [9]. Однако спецификация процессора языка императивного программирования не может быть предикатной. Косвенно это следует из того, что спецификация процессора не может быть проще спецификации программы, исполняемой процессором. По нашей гипотезе процессорная спецификация сложнее процессной, поскольку процессор находится на метауровне по отношению к программе (с процессной спецификацией), которую он исполняет.
Представленные три формы спецификации определяют три принципиально различных класса программ. В первый класс входят программы для математических задач. Второй класс включает программы, работающие в режиме реального времени. Третий класс содержит значительную часть программ системного программирования. Методы разработки программ одного класса не всегда переносимы на программы другого класса.