
- •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. Система правил доказательства корректности операторов
Понятие корректности, введенное для программы в целом, применимо также к произвольным операторам программы. Допустим, для некоторого оператора S имеется спецификация в виде тройки Хоара {P(x)} S {Q(x, y)}. В качестве оператора S будем рассматривать оператор суперпозиции A; B, параллельный оператор A || B или условный оператор if (C) A else B, определенные в разд. 2.2. Нашей задачей является конкретизация формулы корректности (2.10) для каждого из трех операторов. Естественным требованием является корректность операторов A и B. Условия корректности каждого из трех операторов формулируются в виде правил вывода, с помощью которых можно доказывать корректность оператора. Правила вывода для этих операторов не используют формулы LS(A) и LS(B) только спецификации (предусловия и постусловия) операторов A и B встречаются в правилах. Эта особенность является существенным преимуществом правил.
2.4.1. Правила для корректного оператора
Для произвольного корректного оператора B перепишем условия корректности (2.72.9) в виде правил вывода.
Лемма 2.3. Пусть имеется оператор B со спецификацией в виде тройки Хоара {PB(x)} B {QB(x, y)}. Предполагается, что оператор B является корректным, т. е. для него истинна соответствующая общая формула корректности (2.10) и формулы (2.72.9). Тогда истинны следующие правила вывода.
Правило E1. PB(x) ├ $y. QB(x, y).
Правило E2. PB(x) ├ $y. LS(B)(x, y).
Правило E3. PB(x) ├ LS(B)(x, y) QB(x, y).
2.4.2. Правила корректности для параллельного оператора
Рассмотрим спецификацию параллельного оператора в виде тройки Хоара:
{P(x)} A || B {Q(x, y, z)} . (2.11)
Допустим, операторы A и B корректны. Их спецификации представлены тройками:
{PA(x)} A {QA(x, y)}, {PB(x)} B {QB(x, z)} .
Определим правила, гарантирующие корректность параллельного оператора.
Правило RP1. P(x) ├ PA(x) & PB(x).
Правило RP2. QA(x, y), QB(x, z) ├ Q(x, y, z).
Лемма 2.4. Пусть предусловие P(x) истинно. Допустим, операторы A и B корректны. Если правила RP1 и RP2 истинны (т. е. правая часть доказуема из левой части для каждого правила), то параллельный оператор (2.11) является корректным.
Доказательство. Для доказательства корректности оператора (2.11) в соответствии с формулой (2.10) достаточно доказать реализуемость LS(A || B)(x, y, z) и выводимость постусловия Q(x, y, z) из LS(A || B)(x, y, z). В соответствии с (2.2) формула LS(A || B)(x, y, z) эквивалентна формуле LS(A)(x, y) & LS(B)(x, z).
Из истинности предусловия P(x) по правилу RP1 следует истинность PA(x) и PB(x). Далее, по правилу E2 становятся истинными формулы $y. LS(A)(x, y) и $z. LS(B)(x, z). Их конъюнкция определяет реализуемость LS(A || B)(x, y, z).
Докажем выводимость постусловия Q(x, y, z) из LS(A)(x, y) & LS(B)(x, z). Допустим, истинна формула LS(A)(x, y) & LS(B)(x, z). Применим правило E3 для PA(x) и PB(x), истинность которых определена выше. Получаем истинность формул LS(A)(x, y) QA(x, y) и LS(B)(x, z) QB(x, z). Как следствие, будут истинны QA(x, y) и QB(x, z). Применяя правило RP2, получаем истинность постусловия Q(x, y, z). □