
- •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. Гончаров С. С. Математическая логика: Учеб. пособие. Новосибирск, 2007. 166 с.
2. Hopcroft J. E., Motwani R., Ullman J. D. Introduction to Automata Theory, Languages, and Computation, 2nd ed. Addison Wesley, 2001. 521 p.
3. Кнут Д. Искусство программирования для ЭВМ. М.: Мир, 1976. Т. 1. С. 38–50.
4. Клини С. К. Введение в метаматематику: Пер. с англ. М.: 1957. 526 с.
5. Mathematical induction. URL: http://en.wikipedia.org/wiki/Mathematical_induction.
4. Язык исчисления вычислимых предикатов, его логическая и операционная семантика
Нас интересуют языки программирования, допускающие построение логической семантики. Во-первых, следует исключить из рассмотрения языки для реактивных систем, определяющих взаимодействующие параллельные процессы. Адекватной моделью для таких систем является алгебра процессов Р. Милнера [8] или Т. Хоара [9]. Проблематично построение логической семантики для императивных языков. Логическая семантика может быть построена для чистых языков функционального программирования. Каждой конструкции языка функционального программирования может быть сопоставлена эквивалентная формула на языке исчисления предикатов.
Множество вычислимых формул исчисления предикатов будем рассматривать в качестве общего базиса для всех языков, допускающих построение логической семантики. Вычислимые формулы будем записывать на языке исчисления вычислимых предикатов. Исчисление определяет набор базисных вычислимых предикатов, три базисных оператора (оператор суперпозиции, параллельный оператор и условный оператор) и механизм рекурсивного определения предикатов. Данный язык исчисления определен в форме языка программирования CCP (Calculus of Computable Predicates). Язык CCP определяет минимальный полный базис, достаточный, чтобы запрограммировать любой алгоритм, реализуемый в классе языков с логической семантикой. Язык неудобен для программирования и не предназначен для этого. Простота языка облегчает изучение математических свойств программ.
Язык CCP определяется в качестве минимального ядра для чистых языков функционального программирования. Система типов данных представлена в виде математической модели. Определяется логическая и операционная семантика языка. Доказывается теорема согласованности логической и операционной семантики.
4.1. Структура программы на языке ccp
Язык CCP (Calculus of Computable Predicates) язык исчисления вычислимых предикатов, определяющий множество вычислимых формул исчисления предикатов. К языку предъявляются два требования: полноты и простоты. Язык CCP должен предоставлять достаточно полный набор конструкций, чтобы запрограммировать любой алгоритм, представимый на некотором чистом функциональном языке. Язык должен быть максимально простым, чтобы облегчить исследование свойств программ.
Программа на языке CCP состоит из набора определений предикатов. Определение предиката A º K сопоставляет вычислимую формулу K определяемому предикату A. Вычислимая формула K представляется в виде параллельного оператора, оператора суперпозиции или условного оператора. Всякий оператор определяет композицию двух предикатов. Вхождение предиката в составе оператора называется вызовом предиката. Вызов предиката имеет следующее представление:
(d1, d2, …, dn: e1, e2, …, em) , (4.1)
где n 0, m > 0, имя предиката или переменной предикатного типа (см. разд. 4.2); d1, d2, …, dn имена переменных, называемых аргументами вызова; e1, e2, …, em имена переменных, различающихся между собой и отличных от d1, d2, …, dn. Переменные e1, e2, …, em называются результатами вызова. Вычисление предиката по значениям аргументов определяет значения результатов. Для предиката (4.1) будем также использовать компактное обозначение (d: e), где d и e обозначают наборы имен d1, d2, …, dn и e1, e2, …, em соответственно.
В случае, когда требуется вычислить логическое значение предиката (т. е. набор e пуст), будем использовать в качестве результата дополнительный параметр b логического типа и записывать предикат в виде (d: b). Предикат (d: e) в случае пустого набора d (т. е. без аргументов при n = 0) соответствует константе. Выражений 12 и констант нет в языке CCP.
Определение нового предиката есть конструкция вида
A(x: y) º K(x: y) . (4.2)
Здесь A обозначает имя определяемого предиката; x и y наборы переменных, причем все переменные различны; K(x: y) обозначает параллельный оператор, оператор суперпозиции или условный оператор. Переменные набора x называются аргументами предиката, а набора y результатами предиката. Определение предиката может быть рекурсивным (см. разд. 4.11).
Произвольный предикат языка CCP либо имеет определение вида (4.2), либо является базисным вычислимым предикатом, используемым для константы и элементарной операции. Каждый тип данных однозначно определяется некоторым набором базисных предикатов. Совокупность всех базисных предикатов определяет систему типов данных.