
- •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.12. Однозначность предикатов
Применимость правил серии L доказательства корректности программы в соответствующих леммах базируется на однозначности операторов, используемых в определениях предикатов. Покажем, что однозначность операторов гарантируется в случае однозначности базисных предикатов, используемых в определениях программы.
Лемма 4.17. Оператор суперпозиции (4.16), параллельный оператор (4.19) или условный оператор (4.20) является однозначным, если вызываемые в операторе предикаты B и C являются однозначными.
Лемма 4.18. Пусть имеется рекурсивное кольцо предикатов (4.36). Кроме рекурсивных предикатов A1, A2,…,An, в правых частях определений кольца предикатов используются предикаты E1, E2,…, Es. Предположим, что предикаты E1, E2,…, Es являются однозначными. Если аргумент определения кольца имеет предикатный тип, то предикат, являющийся значением аргумента, считается однозначным. Тогда рекурсивные предикаты A1, A2,…,An кольца (4.36) являются однозначными.
Доказательство. Из-за ограничений на сложные формы рекурсии предикат, являющийся значением аргумента, не может входить в кольцо предикатов. Поэтому можно считать, что такой предикат находится среди E1, E2,…, Es.
Пусть D(u: v) рекурсивный предикат кольца, т. е. D = Aj для некоторого j. Допустим, истинны D(u: v1) и D(u: v2). Необходимо доказать, что v1 = v2. В соответствии с леммой 4.13 существует m, при котором Dm(u: v1) и Dm(u: v2) истинны. Поэтому достаточно доказать, что каждый элемент Am цепи {Am}m0, определенной в (4.41), является вектором однозначных предикатов. Доказательство проводится индукцией по m.
Элемент A0 является вектором однозначных предикатов, поскольку тотально ложный предикат F является однозначным. Допустим, по индуктивному предположению, Am-1 является вектором однозначных предикатов. Докажем это свойство для Am. В правой части каждого определения из Am используется оператор суперпозиции (4.16), параллельный оператор (4.19) или условный оператор (4.20). Вызываемые предикаты в правой части: Am-11, Am-12,…,Am-1n и E1, E2,…, Es однозначны. Однозначность компонент Am следует из леммы 4.17. □
Базисные предикаты ConsPred и ConsArray не являются однозначными. В двух разных исполнениях вызова ConsPred(x, B: A) (при совпадающих x и B) в качестве значения переменной A будут получены разные имена. Однако при этом предикаты, обозначаемые разными именами, будут тождественны. Это обеспечивает однозначность вызовов предиката A при условии, что предикат B является однозначным. Аналогично будет однозначным предикат, порождаемый вызовом предиката ConsArray.
Лемма 4.19. В соответствии с правилами S1S4 построения заместителей любой вызов C(…) в программе, где C переменная предикатного типа, является однозначным, если для каждого вызова конструктора ConsPred(x, B: A) или ConsArray(x, B: A) предикат B является однозначным.
Теорема 4.2. Допустим, всякий базисный предикат языка CCP, кроме ConsPred и ConsArray, является однозначным на всем множестве значений аргументов. Пусть имеется программа на языке CCP, и ее исполнение реализуется вызовом предиката D(u: v), причем в наборе v нет переменных предикатного типа. Тогда предикат D является однозначным.
Доказательство. Сначала доказательство проводится для программы, в которой нет переменных предикатного типа.
Рассмотрим случай, когда программа не содержит рекурсивно определяемых предикатов. Если предикат D базисный, то его однозначность гарантируется условием теоремы. Пусть предикат D имеет определение в виде оператора суперпозиции (4.16), параллельного оператора (4.19) или условного оператора (4.20). В соответствии с леммой 4.17 достаточно установить однозначность предикатов B и C, вызываемых в правой части определения. Если эти предикаты базисные, то их однозначность является условием теоремы. Если один из них определяемый, то его полное замкнутое определение представляется частью программы меньшего размера, что позволяет применить доказательство по индукции.
Допустим, в программе имеются рекурсивно определяемые предикаты. В соответствии с анализом, проведенным при доказательстве теоремы 4.1, совокупность рекурсивно определяемых предикатов образует дерево колец. Для колец, являющихся листьями дерева, однозначность следует из леммы 4.18. Доказательство однозначности предикатов остальных колец проводится индукцией по длине пути в дереве колец. Отметим, что доказательство легко обобщается для случая, когда в программе имеются переменные предикатного типа, значениями которых являются однозначные предикаты.
Допустим, в программе П имеются переменные предикатного типа. Обозначим через SUBS(П) набор предикатов, являющийся объединением множеств заместителей для всех переменных предикатного типа в программе П. Для набора предикатов M из П обозначим через П[M] минимальную программу, являющуюся частью П и содержащую определения предикатов набора M. Пусть П0 = П, Пj+1 = Пj[SUBS(Пj)], j = 0, 1, 2, … . В теореме 4.1 доказано, что для некоторого k программа Пk , а Пk+1 = . Программа Пk не содержит переменных предикатного типа. Однозначность предикатов программы Пk доказана выше. Тогда предикаты B1, B2,…, Bn, входящие в SUBS(Пk-1), являются однозначными. В соответствии с леммой 4.19 любой вызов вида C(…) в программе Пk-1, где C переменная предикатного типа, является однозначным. Доказательство теоремы, представленное выше, обобщается для программы Пk-1, поскольку согласно принятым ограничениям вызов вида C(…) не может участвовать в рекурсии. Доказательство теоремы для произвольной программы Пi, i = k 1, …, 0, проводится по индукции. □