
- •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. Заключение
- •Список литература
2.4.3. Правила корректности для оператора суперпозиции
Рассмотрим спецификацию оператора суперпозиции в виде тройки Хоара:
{P(x)} A; B {Q(x, y)} . (2.12)
Предположим, что операторы A и B корректны. Их спецификации представлены тройками:
{PA(x)} A {QA(x, z)}, {PB(z)} B {QB(z, y)} .
Определим правила, гарантирующие корректность оператора суперпозиции (2.12).
Правило RS1. P(x) ├ PA(x) & "z (QA(x, z) Þ PB(z)).
Правило RS2. P(x) & $z (QA(x, z) & QB(z, y)) ├ Q(x, y).
Лемма 2.5. Пусть предусловие P(x) истинно. Допустим, операторы A и B корректны. Если правила RS1 и RS2 истинны, то оператор суперпозиции (2.12) является корректным.
Доказательство. В соответствии с формулой (2.10) достаточно доказать реализуемость LS(A; B)(x, y) и выводимость постусловия Q(x, y) из LS(A; B)(x, y). В соответствии с (2.1) формула LS(A; B)(x, y) определена как $z.(LS(A)(x, z) & LS(B)(z, y)).
Из истинности предусловия P(x) по правилу RS1 следует истинность формул PA(x) и "z (QA(x, z) Þ PB(z)). Из истинности PA(x) и правила E2 следует истинность формулы $z. LS(A)(x, z). Допустим, для некоторого z0 формула LS(A)(x, z0) истинна. Из истинности PA(x) и правила E3 следует истинность LS(A)(x, z0) QA(x, z0). Как следствие, истинно QA(x, z0). Далее, из истинности формулы "z (QA(x, z) Þ PB(z)) следует истинность PB(z0). По правилу E2 истинна формула $y LS(B)(z0, y). Далее, истинна конъюнкция LS(A)(x, z0) & $y LS(B)(z0, y), и затем – формула $y. $z. (LS(A)(x, z) & LS(B)(z, y)), т. е. доказана реализуемость LS(A; B)(x, y).
Докажем выводимость постусловия Q(x, y) из LS(A; B)(x, y). Пусть LS(A; B)(x, y) истинно, т. е. истинна формула $z.(LS(A)(x, z) & LS(B)(z, y)). Пусть формула истинна для некоторого z1. По правилу E3 истинна формула LS(A)(x, z1) QA(x, z1) и далее – QA(x, z1). Истинность QA(x, z1) и "z (QA(x, z) Þ PB(z)) влечет истинность PB(z1). По правилу E3 истинно LS(B)(z1, y) QB(z1, y). Поскольку LS(B)(z1, y) истинно, то истинно QB(z1, y). Таким образом, истинна правая часть правила RS2, а значит – и левая, т. е. истинно постусловие Q(x, y). □
2.4.4. Правила корректности для условного оператора
Рассмотрим спецификацию условного оператора в виде тройки Хоара:
{P(x)} if (C) A else B {Q(x, y)} . (2.13)
Предположим, что операторы A и B корректны. Их спецификации представлены тройками:
{PA(x)} A {QA(x, y)} , {PB(x)} B {QB(x, y)} .
Определим правила, гарантирующие корректность условного оператора (2.13).
Правило RC1. P(x) & C ├ PA(x).
Правило RC2. P(x) & ØC ├ PB(x).
Правило RC3. P(x) & C & QA(x, y) ├ Q(x, y).
Правило RC4. P(x) & ØC & QB(x, y) ├ Q(x, y).
Отметим, что условие C зависит от x.
Лемма 2.6. Пусть предусловие P(x) истинно. Допустим, операторы A и B корректны. Если правила RC1, RC2, RC3 и RC4 истинны, то условный оператор (2.13) является корректным.
Доказательство. Для оператора (2.13) необходимо доказать формулу (2.10). В ней дважды встречается подформула LS(if (C) A else B)(x, y), определяемая согласно (3) в виде:
(C Þ LS(A)(x, y)) & (ØC Þ LS(B)(x, y)) . (2.14)
В соответствии с формулой (2.10) достаточно доказать реализуемость формулы (2.14) и выводимость постусловия Q(x, y) из (2.14).
Допустим, что условие C истинно. Из истинности предусловия P(x) по правилу RC1 следует истинность PA(x). По правилу E2 истинна формула $y. LS(A)(x, y). Далее будет истинной формула $y. (C Þ LS(A)(x, y)). Из истинности C следует истинность формулы ØC Þ LS(B)(x, y) и, следовательно, формулы $y. [(C Þ LS(A)(x, y)) & (ØC Þ LS(B)(x, y))]. Это обеспечивает реализуемость формулы (2.14) в случае истинности C. Реализуемость (2.14) в случае ложности C доказывается аналогичным образом.
Докажем выводимость постусловия Q(x, y) из формулы (2.14). Допустим, истинна формула (2.14). Пусть C истинно. Тогда истинно LS(A)(x, y). По правилу RC1 истинно PA(x). По правилу E3 истинна формула LS(A)(x, y) QA(x, y), а значит – и QA(x, y). Таким образом, истинна правая часть правила RC3. Тогда истинна левая часть правила, т. е. истинно постусловие Q(x, y). Доказательство истинности постусловия Q(x, y) для случая, когда C ложно, проводится аналогично с использованием правила RC4. □