Имя типа может быть аргументом вызова предиката и изображения типа. Определение ЭЛЕМЕНТА-СПИСКА дается в разд. 6.7. Операция ОПРЕДЕЛЕНИЕ-МАССИВА описывается в разд. 6.8.3. Последние три альтернативы в определении ПЕРВИЧНОГО-ВЫРАЖЕНИЯ относятся к объектам типа объединения и описаны в разд. 6.7.
Переменная вида имя’ используется для именования результата предиката. Переменная имя’ склеивается с переменной имя, являющейся аргументом предиката (см. разд. 6.3.1).
Значением ПЕРВИЧНОГО-ВЫРАЖЕНИЯ является переменная типа “массив”. Значения ИНДЕКСОВ-МАССИВА должны принадлежать типам индексов соответствующего типа массива.
Мультипеременная определяет упорядоченный набор переменных. Число переменных в наборе должно быть больше 1.
АГРЕГАТ ::= АГРЕГАТ-СТРУКТУРА | АГРЕГАТ-МАССИВ |
АГРЕГАТ-МНОЖЕСТВО | АГРЕГАТ-СПИСОК
Агрегат определяет значение структурного типа. Агрегат-массив определяет массив, агрегат-множество - подмножество некоторого множества - значение типа set (см. разд. 6.7), агрегат-структура - структуру (как набор полей), агрегат-список - список, заданный последовательностью элементов.
Агрегат [ ] обозначает пустой массив (когда верхняя граница индексов меньше нижней). Агрегат { } определяет пустое множество. Если пара скобок [[ или ]] встречается рядом при изображении АГРЕГАТ-МАССИВА, то соседние скобки дожны быть разделены пробелом.
Значением агрегата является набор значений элементов агрегата, перечисленных в скобках. Агрегат может иметь иерархическую структуру, поскольку элементом агрегата может быть агрегат. Тип агрегата определяется типом позиции, в которой находится агрегат. Значение агрегата должно соответствовать типу позиции. Тип агрегата может быть указан явно ИЗОБРАЖЕНИЕМ-ТИПА - это не является необходимым, но может улучшить восприятие программы.
ЭЛЕМЕНТ-АГРЕГАТА ::= [ИНДЕКС-ЭЛЕМЕНТА-АГРЕГАТА :] ВЫРАЖЕНИЕ
ИНДЕКС-ЭЛЕМЕНТА-АГРЕГАТА ::= ВЫРАЖЕНИЕ | ИМЯ-ПОЛЯ
Индексы элементов, если присутствуют, должны соответствовать индексам элементов массива или именам полей структуры.
type Ar4 = array (real, 1..4);
Ar4 x = [ 0, 1, 2, 3];
Пример 5. Задание агрегата
ГЕНЕРАТОР-ПРЕДИКАТА ::=
predicate ОПИСАНИЕ-ПРЕДИКАТА
Исполнение генератора предиката создает новый предикат, операторная часть которого определяется телом предиката, находящегося в составе ОПИСАНИЯ-ПРЕДИКАТА; см. разд. 6.3.1. В теле предиката фиксируются значения свободных переменных (отличных от аргументов и результатов) на момент исполнения генератора. Новый предикат становится значением генератора предиката.
Семантика операций и их приоритеты определены ниже в таблице. Типы аргументов каждой операции должны соответствовать операции. Операция “+” для объединения массивов описана в разд. 6.8.4.
В структурном значении выражения, обозначающего массив или структуру, меняются компоненты, представленные АГРЕГАТОМ или ОПРЕДЕЛЕНИЕМ-МАССИВА-ПО-ЧАСТЯМ (см. разд. 6.8.3 ). Значением операции является обновленный массив или структура.
type ar0_4 = array (int, 0..4);
ar0_4 ones = [ 1, 1, 1, 2, 1 ];
ar0_4 ones1 = ones [3: 1]; // [ 1, 1, 1, 1, 1 ]
type Vec(nat n) = array (real, 1..n);
perm(nat n, Vec(n) b, nat m, k : Vec(n) b')
{ b' = b with [k: b [m], m: b [k]] };
Пример 6. Замена части структурного значения
УСЛОВНОЕ-ВЫРАЖЕНИЕ ::= ВЫРАЖЕНИЕ ? ВЫРАЖЕНИЕ : ВЫРАЖЕНИЕ
Первое выражение имеет тип “логический”. Если первое ВЫРАЖЕНИЕ завершается илентификатором, то идентификатор и последующий символ “?” должны быть разделены пробелом.
МУЛЬТИВЫРАЖЕНИЕ ::= | СПИСОК-ВЫРАЖЕНИЙ | |
СПИСОК-ВЫРАЖЕНИЙ
Значением мультивыражения является набор значений, получающихся в результате вычисления перечисленных выражений. Выражения вычисляются независимо, т. е. параллельно. Мультивыражение может находиться в правой части оператора присваивания, если в левой находится мультипеременная.
ВЫРАЖЕНИЕ ::= ПЕРВИЧНОЕ-ВЫРАЖЕНИЕ | УНАРНОЕ-ВЫРАЖЕНИЕ |
БИНАРНОЕ-ВЫРАЖЕНИЕ | УСЛОВНОЕ-ВЫРАЖЕНИЕ |
МУЛЬТИВЫРАЖЕНИЕ
Таблица 1.Операции в порядке уменьшения приоритета
^
Возведение в степень
+, -, !, ~
Унарные плюс и минус, логическое отрицание и поэлементное дополнение для множеств, побитовое дополнение для ограниченных целых
*, /, %
Арифметическое умножение, деление и остаток от целочисленного деления
+, -
Арифметическое сложение и вычитание; объединение и вычитание множеств; конкатенация строк; объединение массивов с непересекающимися типами индексов
<<, >>
Побитовый (поэлементный) сдвиг влево и вправо для целых
<-
Обновление элемента массива или поля структуры
in
Проверка вхождения элемента в множество
<, >, <=, >=
Операции арифметического сравнения
=, !=
Проверка на равенство и неравенство
&
Пересечение множеств, логическая конъюнкция, побитовое И для ограниченных целых
xor
Симметрическая разность для множеств, исключительное ИЛИ для логических выражений и ограниченных целых (побитовое)
or
Объединение множеств, логическая дизъюнкция, побитовое ИЛИ для ограниченных целых
Новосибирск
УДК 004.432.42
ББК 22.183.492
Ш 427
Шелехов В. И. Предикатное программирование: Учеб. пособие / Новосиб. гос. ун-т. Новосибирск, 2009
Язык исчисления вычислимых предикатов,
его логическая и операционная семантика .......................................................... 27
4.1. Структура программы на языке CCP ...............................
Семантика языка предикатного программирования.
Методы доказательства корректности предикатных программ ...................... 47
5.1. Язык P1: подстановка определения предиката на место вызова .........................
Общее понятие программы
Понятие программы обычно определяется в контексте некоторого языка программирования. Представление об общем понятии программы, абстрагированное от конкретного языка программирования, для специалист
Автоматическая вычислимость
Развитие средств вычислений сопровождается все большей степенью автоматизации вычислений. Потребность в проведении сложных и длительных расчетов привела человека к необходимости создания и совершен
Спецификация программы
Для определения связи программы со своей спецификацией рассмотрим следующую модель применения программы (рис. 1). Вычисление по программе является необходимым звеном в цепочке действий некоторого р
Формы спецификации программы
Распространена точка зрения, что спецификацию программы можно представить в виде функции. Поскольку это не всегда так, возникает вопрос о классификации форм, которые может принимать спецификация пр
Корректность программ с предикатной спецификацией
Для класса программ с предикатной спецификацией рассматривается программа вместе со своей спецификацией. Введенное в предыдущем разделе понятие предикатной спецификации уточняется следующим образом
Предикатная спецификация программы
Уточним и дополним понятие предикатной спецификации, определенное в разд. 1.2. Рассмотрим следующую простую схему взаимодействия программы с окружением: ввод входных данных происходит перед началом
Логическая семантика языка программирования
Всякая программа содержит логику. Это, например, бизнес-логика, извлекаемая нетривиальным анализом из текста программы в процессе реинжиниринга программы [16]. Это также логические формулы, получае
Модель корректности программы
Рассмотрим программу с предикатной спецификацией на языке, для которого можно построить логическую семантику. Программа со спецификацией представляется в виде тройки Хоара:
{P(x)} S {Q(x,
Система правил вывода программы из спецификации
Понятие корректности программы, введенное в разд. 2.3, состоит из трех условий (2.7–2.9). Главным из них является условие (2.7) соответствия программы и спецификации, согласно которому постусл
Однозначность предикатов
Предикат H(x, y) является однозначным в области X для набора переменных x, если он определяет функцию, отображающую значения набора x в значения набора y. Должно быть истинным следующее усло
Теорема тождества спецификации и программы
Теорема определяет условия, при которых программа может быть выведена из спецификации.
Теорема 2.1 тождества спецификации и программы. Рассмотрим программу со специфи
Отношения порядка
R называется бинарным отношением на множестве D, если R Í D ´ D. Утверждение (a, b) Î R принято записывать в виде a R b. Для произвольного отношения R используются следующ
Наименьшая неподвижная точка
Далее будем считать, что (D, ⊑, ⊥) – полная решетка с наименьшим элементом, т. е. "a Î D. ⊥⊑ a.
Пусть F: D→D - произвольная тотальная (т. е. всюду
Математическая индукция
Математическая индукция – это метод доказательства некоторого утверждения P(n) для всех значений натурального параметра n; n = 0, 1, 2, … . Доказательство проводится по следующей схеме.
Его логическая и операционная семантика
Нас интересуют языки программирования, допускающие построение логической семантики. Во-первых, следует исключить из рассмотрения языки для реактивных систем, определяющих взаимодействующие параллел
Структура программы на языке CCP
Язык CCP (Calculus of Computable Predicates) - язык исчисления вычислимых предикатов, определяющий множество вычислимых формул исчисления предикатов. К языку предъявляются два требования: по
Система типов данных
Любая переменная характеризуется некоторым типом. Язык CCP является бестиповым в том смысле, что типы переменных не указываются в программе, однако их можно однозначно определить по программе. Сист
Логическая и операционная семантика языка CCP
Логическая семантика есть функция LS, сопоставляющая каждой конструкции S языка CCP некоторую формулу LS в исчислении предикатов, т. е. LS(S) = LS. Пусть j(d:
Семантика вызова предиката
Пусть имеется вызов предиката
A(z:u) . (4.12)
Здесь A есть имя предиката или имя переменной предикатного типа; z - возможно пустой набор имен переменных; u - непу
Конструктор предиката
Конструктор предиката является базисным предикатом ConsPred(x, B: A), где x - возможно пустой набор переменных; B - имя предиката; A - имя переменной предикатного типа. Значением п
Конструктор массива
Конструктор массива является базисным предикатом ConsArray(x, B: A), где x - возможно пустой набор переменных, B - имя предиката, отличное от ConsPred и ConsArray. Значением переме
Программа
Программа на языке CCP состоит из конечного набора определений предикатов. Для каждого определения правой частью является оператор суперпозиции (4.16), параллельный оператор (4.19) или услов
Рекурсивные определения предикатов
Для определяемых предикатов B и C отношение depend(B, C) обозначает непосредственную зависимость B от C, если в правой части определения B имеется вызов предиката C. Предикат B определяет
Однозначность предикатов
Применимость правил серии L доказательства корректности программы в соответствующих леммах базируется на однозначности операторов, используемых в определениях предикатов. Покажем, что однозначность
Лексемы
Текст программы представлен в виде последовательности строк символов. Переход на новую строку эквивалентен символу «пробел». Программа может содержать комментарии, текст которых считается не принад
Определение предиката
ОПРЕДЕЛЕНИЕ-ПРЕДИКАТА ::= ИМЯ-ПРЕДИКАТА ОПИСАНИЕ-ПРЕДИКАТА
ИМЯ-ПРЕДИКАТА ::= ИДЕНТИФИКАТОР
Значением ОПИСАНИЯ-ПРЕДИКАТА является предикат, обозначаемый именем предиката.
Спецификация предиката
Предикат, используемый в программе, должен иметь определение предиката. Если предикат определяется в другом модуле программы, то предикат может быть представлен своей спецификацией.
СПЕЦИФ
Вызов предиката
Элементарным оператором программы является вызов предиката.
ВЫЗОВ-ПРЕДИКАТА ::= ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ |
ВЫЗОВ-ПРЕДИКАТА-ГИПЕРФУНКЦИИ
ВЫЗОВ-ПРЕДИКАТА-ФУНКЦИИ ::=
Программа
Программа состоит из одного или нескольких модулей. Модуль определяет независимую часть программы.
ОПИСАНИЕ-МОДУЛЯ ::= [ЗАГОЛОВОК-МОДУЛЯ] СПИСОК-ОПИСАНИЙ
ЗАГОЛОВОК-МОДУЛЯ ::=
Описание типа массива
ИЗОБРАЖЕНИЕ-ТИПА-МАССИВА ::=
array ( ИЗОБРАЖЕНИЕ-ТИПА-ЭЛЕМЕНТА , ИЗМЕРЕНИЯ-МАССИВА )
ИЗОБРАЖЕНИЕ-ТИПА-ЭЛЕМЕНТА ::= ИЗОБРАЖЕНИЕ-Т
Объединение массивов
Операндами операции «+» объединения массивов:
ВЫРАЖЕНИЕ-МАССИВ + ВЫРАЖЕНИЕ-МАССИВ
являются выражения, значениями которых являются массивы. Объединяемые массивы до
Формулы
Формулы, используемые в качестве предусловий и постусловий предикатов, есть формулы типизированного исчисления предикатов высших порядков. Подформула, входящая в предусловие или постусловие, может
Процессы
Для большинства программ можно построить спецификацию в виде предусловия и постусловия. Однако не всякую программу можно специфицировать таким образом. Имеется класс программ реального времени, в ч
Императивное расширение
Императивное расширение языка P определяет дополнительные языковые конструкции, возникающие в программе в результате проведения трансформаций предикатной программы (см. введение). Использование эти
Технология предикатного программирования
Типичный способ реализации языка программирования заключается в реализации транслятора с языка программирования на язык команд целевой ЭВМ или на некоторый другой реализованный язык программировани
Подстановка определения предиката на место вызова
Пусть A(x: y) { S } - определение предиката на императивном расширении языка P, а A(e: z) - вызов предиката в теле некоторого другого предиката B. Здесь x, y, z обозначают списки переменных, а e -
Замена хвостовой рекурсии циклом
Подстановка определения нерекурсивного предиката на место вызова является эффективной при наличии в программе одного вызова. Подстановка определения рекурсивного предиката усложняет программу и поэ
Склеивание переменных
Трансформация склеивания переменных есть замена в определении предиката нескольких переменных одной. Трансформация определяет список имен переменных. Переменные из указанного списка переменн
Метод обобщения исходной задачи
Трансформация замены хвостовой рекурсии циклом является весьма эффективной, поскольку устранение рекурсии позволяет провести подстановку определения на место вызова, после чего открывается возможно
Трансформация кодирования структурных объектов
Трансформация кодирования структурных объектов реализует представление используемых в программе структурных типов (списков, деревьев и др.) посредством структур более низкого уровня, таких к
Гиперфункции
Пример 7.2. Допустим, для списка s целых чисел требуется извлечь второй элемент и присвоить переменной e. Список может содержать менее двух элементов. Логическая переменная exist =
Else break
}
}
};
Подставим определения предикатов взятьЧисло и перваяЦифра на место вызовов. Проведем очевидные упрощения.
Сумма(string s, nat
Else break
}
};
Далее, поскольку внутренний цикл в теле предиката Сумма не имеет нормального выхода, можно заменить оператор #2 на break и убрать скобки оператора продолжени
Else break
}
n = n + v
}
}
На четвертом этапе применяется трансформация кодирования строки s вырезкой массива. При этом разные значения списка s представляются вырезками од
Else break
}
n = n + v
}
Можно обнаружить следующий недостаток программы (7.39): если строка s завершается цифрой, то проверка исчерпания строки реализуется
Хотите получать на электронную почту самые свежие новости?
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Новости и инфо для студентов