
- •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. Заключение
- •Список литература
6.3. Предикаты
Программа состоит из набора определений предикатов.
6.3.1. Определение предиката
ОПРЕДЕЛЕНИЕ-ПРЕДИКАТА ::= ИМЯ-ПРЕДИКАТА ОПИСАНИЕ-ПРЕДИКАТА
ИМЯ-ПРЕДИКАТА ::= ИДЕНТИФИКАТОР
Значением ОПИСАНИЯ-ПРЕДИКАТА является предикат, обозначаемый именем предиката.
ОПИСАНИЕ-ПРЕДИКАТА ::= ОПИСАНИЕ-ПРЕДИКАТА-ФУНКЦИИ |
ОПИСАНИЕ-ПРЕДИКАТА-ГИПЕРФУНКЦИИ
ОПИСАНИЕ-ПРЕДИКАТА-ФУНКЦИИ ::=
ЗАГОЛОВОК-ПРЕДИКАТА [pre ПРЕДУСЛОВИЕ]
ТЕЛО-ПРЕДИКАТА [post ПОСТУСЛОВИЕ]
ЗАГОЛОВОК-ПРЕДИКАТА ::=
( [ОПИСАНИЯ-АРГУМЕНТОВ]: ОПИСАНИЯ-РЕЗУЛЬТАТОВ )
ТЕЛО-ПРЕДИКАТА ::= БЛОК
ПРЕДУСЛОВИЕ ::= ФОРМУЛА
ПОСТУСЛОВИЕ ::= ФОРМУЛА
Значения аргументов предиката должны удовлетворять предусловию. По завершении исполнения тела предиката должно быть истинным постусловие, связывающее значения аргументов и результатов.
ОПИСАНИЯ-РЕЗУЛЬТАТОВ ::=
ИЗОБРАЖЕНИЕ-ТИПА [:blank:] ИМЯ-РЕЗУЛЬТАТА (, ИМЯ-РЕЗУЛЬТАТА)*
[, ОПИСАНИЯ-РЕЗУЛЬТАТОВ]
ИМЯ-РЕЗУЛЬТАТА ::= ИДЕНТИФИКАТОР | ИДЕНТИФИКАТОР ’
Имя вида имя’ используется для именования результирующего параметра при условии, что имя описано в качестве одного из аргументов с тем же типом. В императивной программе, получаемой трансформацией предикатной программы, результат с именем имя’ склеивается с соответствующим аргументом имя. Если тип аргумента имя параметризован (см. разд. 6.7), то значение параметра для типа результата имя’ может отличаться.
ОПИСАНИЯ-ГРУППЫ-АРГУМЕНТОВ ::=
ИЗОБРАЖЕНИЕ-ТИПА [:blank:] ИМЯ-АРГУМЕНТА (, ИМЯ-АРГУМЕНТА)* |
ИЗОБРАЖЕНИЕ-ТИПА-КАК-ПАРАМЕТРА
ОПИСАНИЯ-АРГУМЕНТОВ ::=
ОПИСАНИЯ-ГРУППЫ-АРГУМЕНТОВ [, ОПИСАНИЯ-АРГУМЕНТОВ]
ИМЯ-АРГУМЕНТА ::= ИДЕНТИФИКАТОР
assign (int from : int to) { to = from }
main (seq (string) argv : int ret_code) { ret_code = 0 }
power (real x, int p : real x’) { x’ = x^p; }
Пример 1. Определения предикатов
ОПИСАНИЕ-ПРЕДИКАТА-ГИПЕРФУНКЦИИ ::=
ЗАГОЛОВОК-ПРЕДИКАТА-ГИПЕРФУНКЦИИ [ПРЕДУСЛОВИЯ-ГИПЕРФУНКЦИИ]
ТЕЛО-ПРЕДИКАТА [ПОСТУСЛОВИЯ-ВЕТВЕЙ]
ЗАГОЛОВОК-ПРЕДИКАТА-ГИПЕРФУНКЦИИ ::=
( [ОПИСАНИЯ-АРГУМЕНТОВ] :
ОПИСАНИЯ-РЕЗУЛЬТАТОВ-ГИПЕРФУНКЦИИ )
ОПИСАНИЯ-РЕЗУЛЬТАТОВ-ГИПЕРФУНКЦИИ ::=
[ОПИСАНИЯ-РЕЗУЛЬТАТОВ-ВЕТВИ] [# МЕТКА-ВЕТВИ]
(: ОПИСАНИЯ-РЕЗУЛЬТАТОВ-ГИПЕРФУНКЦИИ)+
ОПИСАНИЯ-РЕЗУЛЬТАТОВ-ВЕТВИ ::= ОПИСАНИЯ-РЕЗУЛЬТАТОВ
МЕТКА-ВЕТВИ ::= МЕТКА
После двоеточия описываются параметры-результаты очередной ветви гиперфункции. Ветви гиперфункции именуются метками. Если в описании результатов ветви нет метки, то ветвь именуется целым порядковым номером ветви начиная с 1. Исполнение гиперфункции завершается выбором одной из ветвей и вычислением значений результатов этой ветви. При этом результаты других ветвей не определены. Оператор перехода #имяВетви в теле предиката завершает исполнение гиперфункции ветвью с именем имяВетви.
ПРЕДУСЛОВИЯ-ГИПЕРФУНКЦИИ ::=
[ОБЩЕЕ-ПРЕДУСЛОВИЕ] (ПРЕДУСЛОВИЕ-ВЕТВИ)+
ОБЩЕЕ-ПРЕДУСЛОВИЕ ::= pre ПРЕДУСЛОВИЕ
ПРЕДУСЛОВИЕ-ВЕТВИ ::= pre МЕТКА-ВЕТВИ : ПРЕДУСЛОВИЕ
Отсутствие общего предусловия определяет допустимость произвольных значений аргументов в соответствии с их типами. Предусловие ветви определяет дополнительное условие на значения аргументов, при котором исполнение гиперфункции завершается выбором этой ветви. При этом значения аргументов должны удовлетворять общему предусловию. Предусловие последней ветви обычно не указывается, поскольку оно получается дополнением предусловий предыдущих ветвей.
ПОСТУСЛОВИЯ-ВЕТВЕЙ ::= (ПОСТУСЛОВИЕ-ВЕТВИ)+
ПОСТУСЛОВИЕ-ВЕТВИ ::= post МЕТКА-ВЕТВИ : ПОСТУСЛОВИЕ
Постусловие ветви связывает значения аргументов и результатов ветви. Ветвь без результатов постусловия не имеет.