
- •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.11. Императивное расширение
Императивное расширение языка P определяет дополнительные языковые конструкции, возникающие в программе в результате проведения трансформаций предикатной программы (см. введение). Использование этих конструкций в исходной программе недопустимо.
ЗАГОЛОВОК-ПРЕДИКАТА ::=
ИМЯ-ПРЕДИКАТА ( [ОПИСАНИЯ-АРГУМЕНТОВ] [: ОПИСАНИЯ-РЕЗУЛЬТАТОВ] )
ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ ::=
ИДЕНТИФИКАЦИЯ-ПРЕДИКАТА ( [АРГУМЕНТЫ] [: РЕЗУЛЬТАТЫ] )
В императивном расширении для предиката-функции допускается отсутствие результатов. Это отражено в приведенных определениях, расширяющие определения, данные в разд. 6.3.1. Отсутствие результатов возможно, например, после склеивания результатов с глобальными переменными.
Определим дополнительные операторы императивного расширения.
ОПЕРАТОР-ИМПЕРАТИВНОГО-РАСШИРЕНИЯ ::=
break | ОПЕРАТОР-FOR | ОПЕРАТОР-ЕСЛИ
В императивной программе, полученной в результате трансформации, в позиции оператора исходной предикатной программы может также находиться оператор императивного расширения. Отметим, что групповой оператор присваивания, возникающий при подстановке тела предиката на место вызова предиката, является частным случаем оператора присваивания, когда в левой части мультипеременная, а в правой мультивыражение.
ОПЕРАТОР-FOR ::= for ( ЗАГОЛОВОК-ЦИКЛА ) { ОПЕРАТОР [; ОПЕРАТОР] }
ЗАГОЛОВОК-ЦИКЛА ::= [[ИЗОБРАЖЕНИЕ-ТИПА] ПАРАМЕТР-ЦИКЛА = ВЫРАЖЕНИЕ] ;
[УСЛОВИЕ-ЗАВЕРШЕНИЯ] ;
[ПЕРЕСЧЕТ-ПАРАМЕТРА]
ПАРАМЕТР-ЦИКЛА ::= ИДЕНТИФИКАТОР
УСЛОВИЕ-ЗАВЕРШЕНИЯ ::= ВЫРАЖЕНИЕ
ПЕРЕСЧЕТ-ПАРАМЕТРА ::= ОПЕРАТОР
В императивном расширении используются также операторы перехода и помеченные операторы. Синтаксис и семантика определены в разд. 10.
Семантика цикла for соответствует языку C++. Выход из цикла for может также быть реализован оператором break из тела цикла.
ЦИКЛ-WHILE ::= while ( ВЫРАЖЕНИЕ ) ОПЕРАТОР
Тело цикла while исполняется, пока логическое выражение в его заголовке истинно.
sum (list (int) a : int r) {
if (len (a) > 0) {
r = a [0];
int i = 1;
while (i < len (a)) {
r = r + a [i];
i = i + 1;
}
} else {
r = 0;
}
}
Пример 18. Использование цикла while
Данная программа может получиться в результате применения первых трех трансформаций: склеивания переменных, замены хвостовой рекурсии циклом и подстановки определения предиката на место вызвова.
Циклы for и while часто используектся для представления циклов, реализуемых с помощью операторов перехода, в целях улучшения структуры программы.
Список литературы
1. Шелехов В. И. Введение в предикатное программирование. Новосибирск, 2002. 82 с. (Препр. / ИСИ СО РАН № 100).
2. Шелехов В. И. Язык предикатного программирования P. Новосибирск, 2002. 40 с. (Препр. / ИСИ СО РАН № 101).
3. Шелехов В. И. Предикатное программирование: основы, язык, технология // Методы предикатного программирования. Новосибирск, ИСИ СО РАН. 2003. С. 715.
4. Шелехов В. И. Разработка программы построения дерева суффиксов в технологии предикатного программирования. Новосибирск, 2004. 52 с. (Препр. / ИСИ СО РАН № 115).
5. Шелехов В. И. Язык спецификации процессов // Методы предикатного программирования. Новосибирск, ИСИ СО РАН. 2006. Вып. 2. C. 1734.
6. Шелехов В. И. Модель корректности программ на языке исчисления вычислимых предикатов. Новосибирск, 2007. 51 с. (Препр. / ИСИ СО РАН № 145).
7. PVS Specification and Verification System. URL: http://pvs.csl.sri.com/
8. Milner R. A Calculus of Communicating Systems // LNCS. Springer Verlag, 1980. Vol. 94.
9. Lamport L. Specifying concurrent systems with TLA+. Calculational System Design. Series F: Computer and Systems Sciences. Amsterdam: IOS Press. 1999. N. 173. P. 183247.
10. Moura L., Owre S., and Shankar N. The SAL Language Manual. SRI International. URL: http://sal.csl.sri.com/doc/language-report.pdf.