
- •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.2. Лексемы
Текст программы представлен в виде последовательности строк символов. Переход на новую строку эквивалентен символу «пробел». Программа может содержать комментарии, текст которых считается не принадлежащим тексту программы. Комментарий начинается парой символов /* и завершается парой символов */. Второй вид комментариев начинается с пары символов // и продолжается до конца текущей строки текста. Текст программы составляется из лексем следующего вида:
ЛЕКСЕМА ::= ИДЕНТИФИКАТОР | КЛЮЧЕВОЕ-СЛОВО | КОНСТАНТА |
ОПЕРАЦИЯ | РАЗДЕЛИТЕЛЬ| МЕТКА
ИДЕНТИФИКАТОР ::= НАЧАЛО-ИДЕНТИФИКАТОРА СИМВОЛ-ИДЕНТИФИКАТОРА*
НАЧАЛО-ИДЕНТИФИКАТОРА ::= _ | [:alpha:]
СИМВОЛ-ИДЕНТИФИКАТОРА ::= _ | [:alnum:]
Идентификатор используется для именования предикатов, переменных, типов и других объектов. Использование специального имени “_” в качестве результирующей переменной вызова предиката (см. разд. 6.3.3) обозначает пустой результат, неиспользуемый в дальнейшем вычислении. Имя “_” зарезервировано в языке P его нельзя использовать для именования объектов программы. Другие идентификаторы, начинающиеся с “_”, считаются обычными и могут использоваться в описаниях программы.
МЕТКА ::= СИМВОЛ-ИДЕНТИФИКАТОРА*
КЛЮЧЕВОЕ-СЛОВО ::=
after | array | as | bool | break | case | char | class | else | enum
| exists | extends | default | false | for | forall | formula | if | in
| inf | int | import | message | module | nan | nat | new | nil | or
| post | pre | process | predicate | queue | real | receive | set | string
| struct | subtype | switch | type | true | union | var | while | with | xor
ОПЕРАЦИЯ ::= + | - | * | / | % | ^ | ! | << | >> | ~ | & | | | ? |
= | < | > | <= | >= | != | => | <=>
РАЗДЕЛИТЕЛЬ ::= ( | ) | [ | ] | { | } | , | ; | : | . | .. | [:blank:]
КОНСТАНТА ::= ЦЕЛАЯ-КОНСТАНТА | ВЕЩЕСТВЕННАЯ-КОНСТАНТА |
СИМВОЛЬНАЯ-КОНСТАНТА | СТРОКОВАЯ-КОНСТАНТА |
ЛОГИЧЕСКАЯ-КОНСТАНТА | КОНСТАНТА-NIL
ЦЕЛАЯ-КОНСТАНТА ::= ЦЕЛОЕ-ЧИСЛО
ЦЕЛОЕ-ЧИСЛО ::= [ЗНАК] ЦИФРЫ | 0x ШЕСТНАДЦАТЕРИЧНЫЕ-ЦИФРЫ
ЗНАК ::= + | -
ЦИФРЫ ::= ЦИФРА+
ЦИФРА ::= [:digit:]
ШЕСТНАДЦАТЕРИЧНЫЕ-ЦИФРЫ ::= ШЕСТНАДЦАТЕРИЧНАЯ-ЦИФРА+
ШЕСТНАДЦАТЕРИЧНАЯ-ЦИФРА ::= [:xdigit:]
ВЕЩЕСТВЕННАЯ-КОНСТАНТА ::= [ЗНАК] ЦИФРЫ [. ЦИФРЫ] [ПОРЯДОК] |
[ЗНАК] inf | nan
ПОРЯДОК ::= (e | E) [ЗНАК] ЦИФРЫ
Для вещественных типов (см. разд. 6.7) определены специальные значения: inf (бесконечность) и nan (не число). Значение nan возникает в процессе вычисления как результат взятия квадратного корня из отрицательного числа, деления ноля на ноль, умножения ноля на бесконечность и других операций над вещественными числами, когда результат не может быть определён.
СИМВОЛЬНАЯ-КОНСТАНТА ::= ’ СИМВОЛ ’
СИМВОЛ ::= ОБЫЧНЫЙ-СИМВОЛ | СПЕЦИАЛЬНЫЙ-СИМВОЛ |
ШЕСТНАДЦАТЕРИЧНЫЙ-КОД-СИМВОЛА
ОБЫЧНЫЙ-СИМВОЛ ::= любой символ из [:print:], кроме ’ и ”
СПЕЦИАЛЬНЫЙ-СИМВОЛ ::= \” | \’ | \\ | \0 | \n | \r | \t
ШЕСТНАДЦАТЕРИЧНЫЙ-КОД-СИМВОЛА ::=
\x ШЕСТНАДЦАТЕРИЧНАЯ-ЦИФРА [ШЕСТНАДЦАТЕРИЧНАЯ-ЦИФРА
[ШЕСТНАДЦАТЕРИЧНАЯ-ЦИФРА [ШЕСТНАДЦАТЕРИЧНАЯ-ЦИФРА]]]
СТРОКОВАЯ-КОНСТАНТА ::= ” СИМВОЛ* ”
ЛОГИЧЕСКАЯ-КОНСТАНТА ::= true | false
КОНСТАНТА-ПУСТО ::= nil