
- •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. Заключение
- •Список литература
4.3. Логическая и операционная семантика языка ccp
Логическая семантика есть функция LS, сопоставляющая каждой конструкции S языка CCP некоторую формулу LS в исчислении предикатов, т. е. LS(S) = LS. Пусть j(d: e) есть вызов предиката (4.1). Тогда
LS(j(d: e)) j(d, e) .
Пусть A(x: y) º K(x: y) определение предиката (2). Тогда
LS(A(x: y) º K(x: y)) A(x, y) º LS(K(x: y)) 14 .
Логическая семантика LS(K(x: y)) для оператора K(x: y), обозначающего параллельный оператор, оператор суперпозиции или условный оператор, определена в разд. 4.5–4.7. Логическая семантика рекурсивных определений предикатов представлена в разд. 4.11.
Любая конструкция языка CCP легко конвертируется на язык исчисления предикатов. С операторами и предикатами языка CCP можно оперировать как с формулами исчисления предикатов. Поэтому далее будем иногда опускать применение функции LS и говорить об истинности операторов и предикатов.
Операционная семантика определена в виде метапрограммы, реализующей исполнение программы на языке CCP. Метапрограмма записана на метаязыке и исполняется абстрактным процессором. Ядром метаязыка являются базисные операции с памятью исполняемой программы. Память состоит из набора секций. Секция памяти содержит конечный набор переменных вместе с их значениями. Секция создается в начале исполнения вызова предиката, для которого имеется определение в программе. Секция состоит из аргументов, результатов и локальных переменных определения предиката.
Произвольная секция s представляется массивом. Индексами массива являются имена переменных. Пусть a имя переменной. Тогда s[a] обозначает значение переменной с именем a в секции s. Если x набор имен переменных, принадлежащих секции s, то s[x] обозначает соответствующий набор значений. Пусть a имя переменной, а v значение того же типа. Тогда s[a] := v обозначает оператор присваивания значения v переменной a в секции s. Будем также использовать групповой оператор присваивания s[x] := w, где x набор имен переменных; w набор значений. Оператор s = newSect(A) создает в памяти новую секцию s, соответствующую определению предиката с именем A. Секция s отлична от всех других секций, созданных ранее.
Исполнение вызова предиката j(d: e) в секции s при условии, что переменные наборов d и e принадлежат секции s, представляется на метаязыке следующей конструкцией:
runCall(s, j(d: e)) .
Исполнение оператора K(x: y) в секции s записывается на метаязыке следующей конструкцией:
runStat(s, K(x: y)) .
Конструкции метаязыка для исполнения параллельного оператора, оператора суперпозиции или условного оператора определены в разд. 4.54.7.
Возможен иной способ определения операционной семантики, предполагающий подстановку правой части определения предиката на место исполняемого вызова предиката. Такой способ используется для функциональных языков программирования (см., например, [1]).
Пусть H(x: y) есть вызов предиката 15 или оператор. Предикат RUN(H, x, y) для фиксированных значений наборов x и y обозначает следующее утверждение: существует такое исполнение H(x: y) для значений набора x, которое завершается, причем результатом являются значения набора y. Следует отметить, что данное определение RUN учитывает случай возможной неоднозначности, если рассматривать H как функцию из x в y. Определим свойство согласованности Cons(H):
Cons(H) x y (LS(H(x: y)) y’ (RUN(H, x, y’) & eq(y, y’))) . (4.11)
Предикат eq(y, y’) определяет тождественность значений наборов y и y’ по следующим правилам. Пусть набор y есть y1, …, ym, m>0, а y’ есть y’1, …, y’m. Тогда истинны eq(y1, y’1), … eq(ym, y’m). Тождественность двух значений примитивного типа, а также типа множества подмножеств, определяется как равенство значений. Тождественность значений типа произведения или объединения определяется как покомпонентная тождественность. Тождественность значений j и j’ предикатного типа с наборами аргументов d и результатов e определяется как тождественность предикатов: d e (LS(j(d: e)) º LS(j’(d: e))).
Определение (4.11) свойства согласованности уточняет ранее приведенное определение (2.4). Значением переменной предикатного типа является имя предиката или массива (см. разд. 4.8 и 4.9). Порождение нового значения предикатного типа реализуется через конструктор предиката (или массива) и сопровождается заведением уникального имени предиката или массива. Поэтому разные срабатывания H(x: y) могут дать в результате разные имена предикатов (или массивов), причем эти предикаты тождественны.