
- •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.7. Условный оператор
Условный оператор является правой частью следующего определения предиката:
A(b, x: y) º if (b) B(x: y) else C(x: y) . (4.20)
Здесь x и y произвольные непересекающиеся наборы переменных, причем набор x может быть пустым, b переменная логического типа, не встречающаяся в наборах x и y. Если B или C есть имя переменной предикатного типа, то оно входит в набор x. Логическая семантика условного оператора представлена следующим образом:
LS(if (b) B(x: y) else C(x: y)) (b Þ B(x, y)) & (Øb Þ C(x, y)) . (4.21)
Допустим, определение предиката A исполняется в рамках секции s. Секция s включает переменную b и переменные наборов x и y. Исполнение правой части определения (4.20) соответствует оператору runStat(s, K(x: y)) в (4.14) и определяется следующим образом:
if (s[b]) runCall(s, B(x: y)) else runCall(s, C(x: y)) . (4.22)
Таким образом, алгоритм исполнения условного оператора зависит от значения переменной b. Если значение b истинно, исполняется вызов предиката B. В противном случае исполняется вызов предиката C.
Лемма 4.5. Cons(B) & Cons(C) Þ Cons(H), где H(b, x: y)
обозначает if (b) B(x: y) else C(x: y).
Доказательство. Пусть истинно Cons(B) и Cons(C). Докажем истинность Cons(H). Зафиксируем значения b, x и y. Пусть истинна H(b, x: y). Тогда в соответствии с (4.21) истинны формулы b Þ B(x: y) и Øb Þ C(x: y). Рассмотрим случай, когда значение b истинно. Тогда истинна формула B(x: y). Из Cons(B) следует, что исполнение вызова B(x: y) завершается получением набора y. Поэтому исполнение оператора (4.22), а значит и H(b, x: y), завершается вычислением y. Это доказывает первую часть свойства Cons(H) для истинного значения b. Доказательство в случае ложного значения b проводится аналогично.
Допустим, исполнение H(b, x: y) завершается вычислением y, т. е. исполнение оператора (4.22) завершается вычислением y. Докажем истинность H(b, x: y). Пусть b истинно. Тогда исполнение вызова B(x: y) завершается получением набора y. Из Cons(B) следует истинность B(x: y). Тогда истинны формулы b Þ B(x: y) и Øb Þ C(x: y), поскольку b истинно. Следовательно, истинна правая часть (4.21) и H(b, x: y). Доказательство истинности H(b, x: y) в случае ложного значения b проводится аналогично. □
4.8. Конструктор предиката
Конструктор предиката является базисным предикатом ConsPred(x, B: A), где x возможно пустой набор переменных; B имя предиката; A имя переменной предикатного типа. Значением переменной A является новый предикат, создаваемый при исполнении вызова предиката ConsPred. Ограничение: в качестве B нельзя использовать ConsPred или ConsArray. Логическая семантика предиката ConsPred дается определением
LS(ConsPred(x, B: A)) "y"z. (LS(A(y: z)) º LS(B(x, y: z))) . (4.23)
Здесь x, y и z произвольные непересекающиеся наборы переменных, причем наборы x и y могут быть пустыми. Переменная A имеет предикатный тип PRED(Y: Z), см. (4.7), где Y и Z наборы типов, соответствующие наборам переменных y и z.
Допустим, вызов предиката ConsPred(x, B: A) находится в правой части определения некоторого предиката, исполняемого в рамках секции s. Секция s включает набор x и переменную A. Исполнение вызова ConsPred(x, B: A) является частным случаем исполнения вызова runCall(s, ConsPred(x, B: A)) (см. разд. 4.4) и реализуется следующим оператором:
s[A] := newDef(s[x], B) . (4.24)
Функция newDef строит новое определение предиката:
Ax(y: z) =(x~: t); B(t, y: z) . (4.25)
Здесь x~ = s[x] – значение набора x; Ax – новое имя предиката, отличное от имен других предикатов в программе. Имя Ax является результатом вызова newDef. Оператор =(x~: t) присваивает набор значений x~ набору локальных переменных t.
Мы не фиксируем, каким образом абстрактный процессор исполняет оператор =(x~: t). Например, процессор может создавать дополнительные определения, строящие изображения значений x~. Существует другой способ реализации вызова ConsPred(x, B: A), в котором переменной A присваивается кортеж (s[x], B).
Лемма 4.6. Cons(ConsPred).
Доказательство. Зафиксируем значения x = x0 и A = A0. Пусть истинно ConsPred(x, B: A). Докажем, что исполнение ConsPred(x, B: A) завершается значением A = Ax, тождественным A0, т. е. Ax A0. Из истинности ConsPred(x, B: A) следует истинность правой части (4.23). Тогда истинна формула A0(y: z) º B(x0, y: z), однозначно определяющая предикат A0. Рассмотрим исполнение вызова ConsPred(x, B: A), т. е. оператора (4.24). Получаем A = Ax, где Ax определяется формулой (4.25). Поскольку x~ = s[x] = x0, то
Ax(y: z) =(x0: t); B(t, y: z) t = x0 & B(t, y: z) B(x0, y: z) . (4.26)
Таким образом, A = Ax º A0, что доказывает первую половину леммы.
Допустим, исполнение ConsPred(x, B: A) завершается вычислением A = A0 при x = x0. Докажем истинность ConsPred(x, B: A), т. е. истинность правой части (4.23). Из (4.24) следует A = Ax, и далее A0 = Ax. Из тождества (4.26) следует A0(y: z) B(x0, y: z). Поскольку A = A0 и x = x0, получаем истинность правой части (4.23). □
Лемма 4.7. Пусть имеется вызов ConsPred(x, B: A), причем Cons(B) истинно. Тогда истинно Cons(A).
Доказательство. Значением переменной A является Ax с определением (4.25). Поскольку свойство Cons истинно для оператора =(x~: t), то по лемме 4.3 оно реализуется также для правой части (4.25). Далее, по лемме 4.2 истинно Cons(Ax), а значит – и Cons(A). □