
- •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.5. Система правил вывода программы из спецификации
Понятие корректности программы, введенное в разд. 2.3, состоит из трех условий (2.7–2.9). Главным из них является условие (2.7) соответствия программы и спецификации, согласно которому постусловие оператора S должно быть доказано из LS(S). Однако в практике построения программ из математического решения задачи, как правило, реализуется вывод в обратную сторону: программа выводится из спецификации. Нашей целью является определения условий, при которых такой вывод был бы возможен, с построением соответствующих правил доказательства корректности программы. Необходимым условием является однозначность спецификации.
2.5.1. Однозначность предикатов
Предикат H(x, y) является однозначным в области X для набора переменных x, если он определяет функцию, отображающую значения набора x в значения набора y. Должно быть истинным следующее условие:
"xX "y1,y2. H(x, y1) & H(x, y2) Þ y1 = y2 .
Отметим, что однозначный предикат в некоторой области X не обязательно является реализуемым в этой области.
Оператор S является однозначным в области X, если формула LS(S)(x, y) однозначна в области X. Нетрудно убедиться, что оператор суперпозиции A; B, параллельный оператор A || B и условный оператор if (C) A else B являются однозначными, если однозначными являются операторы A и B.
Спецификация оператора S, представленная предусловием P(x) и постусловием Q(x, y), является однозначной, если постусловие является однозначным в области предусловия, т. е.
"x. P(x) Þ "y1,y2. (Q(x, y1) & Q(x, y2) Þ y1 = y2) .
Отметим, что однозначная спецификация не обязательно является реализуемой.
Лемма 2.7. Допустим, предикат D(x, y) является однозначным в области X, а предикат Z(x, y) реализуем в области X. Пусть истинна формула Z(x, y) Þ D(x, y). Тогда истинна следующая формула: "xÎX. D(x, y) Þ Z(x, y). Как следствие, предикаты D и Z оказываются тождественными в области X.
Доказательство. Пусть истинно D(x, y) для некоторого xÎX. Докажем истинность Z(x, y). Поскольку предикат Z реализуем, то существует некоторый y’, для которого истинно Z(x, y’). Из Z(x, y) Þ D(x, y) получаем истинность D(x, y’). Поскольку истинны D(x, y) и D(x, y’), то из однозначности D следует y = y’. Тогда истинно Z(x, y). □
2.5.2. Теорема тождества спецификации и программы
Теорема определяет условия, при которых программа может быть выведена из спецификации.
Теорема 2.1 тождества спецификации и программы. Рассмотрим программу со спецификацией в виде тройки Хоара:
{P(x)} S {Q(x, y)} 7 . (2.15)
Допустим, оператор S является однозначным в области истинности предусловия P(x), а спецификация оператора S является реализуемой. Предположим, LS(S)(x, y) выводима из спецификации, т. е.
P(x) & Q(x, y) Þ LS(S)(x, y) . (2.16)
Тогда программа (2.15) является корректной.
Доказательство. Для доказательства корректности программы (2.15) достаточно доказать истинность формулы (2.10), т. е.
P(x) Þ [ LS(S)(x, y) Q(x, y) ] & $y. LS(S)(x, y) .
Допустим, предусловие P(x) истинно.
Докажем истинность $y. LS(S)(x, y). Поскольку спецификация предиката S реализуема, то истинна формула $y. Q(x, y). Пусть эта формула истинна для некоторого y’. Тогда из (2.16) истинна LS(S)(x, y’) и, следовательно, $y. LS(S)(x, y).
Докажем истинность формулы LS(S)(x, y) Q(x, y). Поскольку истинны P(x) и формула (2.16), то истинна формула Q(x, y) LS(S)(x, y). В соответствии с леммой 2.7 истинна формула LS(S)(x, y) Q(x, y), поскольку постусловие Q(x, y) реализуемо, а LS(S)(x, y) однозначно. □
Лемма 2.8. В условиях теоремы 2.1 истинна следующая формула:
P(x) Þ (LS(S)(x, y) º Q(x, y)) .
Доказательство. Допустим, предусловие P(x) истинно. Истинность формулы LS(S)(x, y) Q(x, y) установлена при доказательстве теоремы 2.1. Обратная импликация следует из (2.16). □
Как следствие леммы 2.8 спецификация в виде предусловия P(x) и постусловия Q(x, y) оказывается однозначной.
Лемма 2.9. Допустим, программа (2.15) является корректной, а ее спецификация однозначной. Тогда истинна формула (2.16), т. е. LS(S)(x, y) выводима из спецификации.
Доказательство. Допустим, истинны P(x) и Q(x, y). Докажем истинность LS(S)(x, y). Из корректности программы (2.15) по формуле (2.10) следует истинность формулы LS(S)(x, y) Q(x, y), а также реализуемость LS(S)(x, y). Пусть для некоторого y’ истинно LS(S)(x, y’). Тогда истинно Q(x, y’), а из однозначности Q следует y = y’. Следовательно, истинно LS(S)(x, y). □
Теорема 2.1, сформулированная для программы в целом, применима также к произвольным операторам программы. Предлагаемая ниже система правил доказательства корректности операторов базируется на теореме 2.1, в соответствии с которой для реализуемой спецификации и при условии однозначности используемых операторов требуется доказать истинность формулы (2.16). Отметим, что однозначности спецификации не требуется. Однако в случае неоднозначной спецификации не удастся доказать истинность формулы (2.16).