Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Дедуктивная верификация и программный синтез предикатных программ




Язык предикатного программирования P (P redicate programming language) [1] находится на границе между функциональными и логическими языками. Простейшим оператором языка является вызов предиката B(x: y), где B – имя предиката; x и y – различающиеся наборы переменных. Переменные набора x являются аргументами вызова, а y – результатами; в качестве аргументов допускаются выражения. Базисными операторами языка P являются: оператор суперпозиции B(x: z); C(z: y); параллельный оператор B(x: y) || C(x: z); условный оператор if ( b) B(x: y) else C(x: y), где b – выражение логического типа; x, y и z – различные наборы переменных.

Логическая семантика LS языка P [2] определяет для каждого оператора S предикат LS(S), истинный после исполнения оператора S. Логическая семантика операторов определяется следующим образом:

LS(B(x: y)) @ B(x, y);

LS(B(x: z); C(z: y)) @ $z. (B(x, z) & C(z, y));

LS(B(x: y) || C(x: z)) @ B(x, y) & C(x, z);

LS(if ( b) B(x: y) else C(x: y)) @

(b Þ B(x, y)) & (Øb Þ C(x, y)).

Предикатная программа состоит из набора определений предикатов вида:

A(x: y) º pre P(x) { S } post Q(x, y), (1)

где A – имя определяемого предиката, x – аргументы, а y – результаты предиката, S – оператор, P(x) – предусловие, Q(x, y) – постусловие. Предусловие должно быть истинно перед исполнением оператора S. а постусловие – после исполнения. Спецификация предиката A включает предусловие, постусловие и записывается в виде [P(x), Q(x, y)].

Однозначность оператора S, тотальность и однозначность спецификации [P(x), Q(x, y)] определяются, соответственно, формулами:

P(x) & LS(S)(x, y1) & LS(S)(x, y2) Þ y1 = y2;

P(x) Þ $y. Q(x, y);

P(x) & Q(x, y1) & Q(x, y2) Þ y1 = y2.

Корректность[3] определения предиката (1) со спецификацией [P(x), Q(x, y)] представляется формулой:

P(x) Þ [ LS(S)(x, y) Þ Q(x, y) ] & $y. LS(S)(x, y). (2)

Доказательство корректности для однозначных программ с однозначной и тотальной спецификацией можно проводить по более простой формуле:

P(x) & Q(x, y) Þ LS(S)(x, y). (3)

Отметим, что доказывать однозначность спецификации и программы не требуется[4]. Достаточно доказать тотальность спецификации. Формула (3) является достаточным условием формулы корректности (2).

Методы дедуктивной верификации и программного синтеза представим на примере оператора суперпозиции в следующем определении предиката:

A(x: y) º pre P(x) { B(x: z); C(z: y) } post Q(x, y). (4)

Предположим, что операторы B и C корректны относительно спецификаций [PB(x), QB(x, z)] и [PC(z), QC(z, y)] соответственно. Пусть спецификация [P(x), Q(x, y)] тотальна. Нетрудно доказать, что корректность предиката A гарантируется в случае истинности правил[5]:


Правило LS1. P(x) ├ PB(x);

Правило LS2. P(x) & Q(x, y) & QB(x, z) ├

PC(z) & QC(z, y).

На базе формулы (3) построена система правил доказательства корректности различных операторов языка P [3]. Правила для других операторов представлены в разделе 2.

Задача верификации. Пусть имеется определение (4). Операторы B и C корректны относительно своих спецификаций. Для доказательства корректности определения (4) требуется доказать тотальность спецификации [P(x), Q(x, y)] и истинность правил LS1 и LS2.

Задача синтеза. Требуется построить программу для предиката A(x: y), представленного спецификацией [P(x), Q(x, y)]. Допустим, доказана тотальность спецификации. Пусть для некоторых предикатов PB(x), QB(x, z), PC(z) и QC(z, y) удалось доказать истинность правил LS1 и LS2. Тогда для предиката A синтезируется определение (4) с включением в программу двух новых предикатов, а именно – B(x: z) со спецификацией [PB(x), QB(x, z)] и C(z: y) со спецификацией [PC(z), QC(z, y)]. Дальнейшей целью является синтез определений для B и C.

Верификация и синтез зеркальны. Если для предикатной программы сгенерируем формулы корректности, а затем по этим формулам проведем синтез, то получим эквивалентную программу. Наоборот, если на основе спецификации программы и набора формул синтезируем программу, а затем для программы сгенерируем формулы корректности, то получим эквивалентную систему формул. Однако результатом синтеза будет иная программа, чем при обычном программировании. Причина в том, что в процессе программирования неизбежно производится оптимизация программы. При оптимизации программы меняется ее логика, как правило, в сторону усложнения. Как следствие, верификация программы оказывается более сложной и трудоемкой задачей, чем её синтез.

Описываемые методы верификации и синтеза реализуются в системе предикатного программирования. Технология предикатного программирования определяет спецификацию, разработку (возможно, в режиме синтеза), верификацию и оптимизирующую трансформацию программ в классе задач дискретной и вычислительной математики. Набор трансформаций применяется к предикатной программе для получения эффективной программы на императивном расширении языка P с последующей конвертацией на любой из императивных языков, включая C, C++, ФОРТРАН и другие. Базовыми трансформациями являются:

· склеивание переменных, реализующее замену нескольких переменных одной;

· замена хвостовой рекурсии циклом;

· подстановка определения предиката на место его вызова;

· кодирование структурных объектов низкоуровневыми структурами с использованием массивов и указателей.




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 795; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.