Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Семантика преобразователя предикатов была представлена Эдсгером Дейкстрой в его основополагающей статье « Защищенные команды, недетерминированность и формальный вывод программ ». Они определяют семантику парадигмы императивного программирования , присваивая каждому оператору на этом языке соответствующий преобразователь предикатов : общую функцию между двумя предикатами в пространстве состояний оператора. В этом смысле семантика преобразователя предикатов является своего рода денотационной семантикой . На самом деле, в защищенных командах Дейкстра использует только один вид преобразователя предикатов: хорошо известныйсамые слабые предусловия (см. ниже).

Более того, семантика преобразователя предикатов - это переформулировка логики Флойда – Хоара . В то время как логика Хоара представлена ​​как дедуктивная система , семантика преобразователя предикатов (либо с помощью самых слабых предусловий, либо с помощью самых сильных постусловий, см. Ниже) представляет собой законченные стратегии для построения достоверных выводов логики Хоара. Другими словами, они предоставляют эффективный алгоритм для сведения проблемы проверки тройки Хоара к проблеме доказательства формулы первого порядка . Технически семантика преобразователя предикатов выполняет своего рода символическое выполнение операторов в предикаты: выполнение выполняется в обратном направлении.в случае самых слабых предусловий или продвигается вперед в случае самых сильных постусловий.

Слабые предварительные условия [ править ]

Определение [ править ]

Для заявления S и постусловия R , слабое предварительное условие является предикат Q такое , что для любого предусловия , если и только если . Другими слова, это «самое общие » или наименее ограничительное требование , необходимое для гарантии того, что R имеет место после того, как S . Уникальность легко следует из определения: Если оба Q и являются слабыми предпосылками, то по определению , так и так , и , таким образом . Обозначим через слабейшее предусловие для утверждения S и постусловие R.

Пропустить [ править ]

Прервать [ править ]

Назначение [ править ]

Ниже мы приводим два эквивалентных самых слабых предусловия для оператора присваивания. В этих формулах, является копией R , где свободные вхождения из й заменены на Е . Следовательно, здесь выражение E неявно приводится к допустимому термину базовой логики: таким образом, это чистое выражение, полностью определенное, завершающееся и без побочных эффектов.

  • версия 1:
  • версия 2:

Первая версия избегает потенциального дублирования E в R , тогда как вторая версия проще, когда x в R встречается не более одного раза . Первая версия также обнаруживает глубокую двойственность между самым слабым предусловием и самым сильным постусловием (см. Ниже).

Пример правильного вычисления wp (с использованием версии 2) для присвоений с целочисленной переменной x :

Это означает, что для того, чтобы постусловие x> 10 было истинным после присваивания, предусловие x> 15 должно быть истинным до присваивания. Это также «самое слабое предусловие» в том смысле, что это «самое слабое» ограничение на значение x, которое делает x> 10 истинным после присваивания.

Последовательность [ править ]

Например,

Условный [ править ]

В качестве примера:

Пока цикл [ править ]

Частичная корректность [ править ]

Игнорируя на мгновение завершение, мы можем определить правило для самого слабого либерального предусловия , обозначенного wlp , используя предикат I , называемый инвариантом цикла , обычно предоставляемый программистом:

Это просто утверждает, что (1) инвариант должен сохраняться в начале цикла; (2) дополнительно, для любого начального состояния y инвариант и защита, вместе взятые, должны быть достаточно сильными, чтобы установить самое слабое предварительное условие, необходимое для того, чтобы тело цикла могло восстановить инвариант; (3) наконец, если и когда цикл завершается в заданном состоянии y , тот факт, что защита цикла ложна вместе с инвариантом, должен иметь возможность установить требуемое постусловие.

Полная правильность [ править ]

Чтобы показать полную корректность, мы также должны показать, что цикл завершается. Для этого мы определяем хорошо обоснованное отношение в пространстве состояний, обозначенное «<» и называемое вариантом цикла . Следовательно, мы имеем:

Неформально, в приведенном выше соединении трех формул:

  • первый означает, что изначально должен соблюдаться инвариант I ;
  • второй означает, что тело цикла (например, оператор S ) должно сохранять инвариант и уменьшать вариант: здесь переменная y представляет начальное состояние выполнения тела;
  • последний означает, что R должен быть установлен в конце цикла: здесь переменная y представляет конечное состояние цикла.

В семантике преобразователей предикатов инвариант и вариант строятся путем имитации теоремы Клини о неподвижной точке . Ниже эта конструкция описана в теории множеств . Мы предполагаем, что U - это множество, обозначающее пространство состояний. Сначала мы определяем семейство подмножеств U, обозначаемых индукцией по натуральному числу k . Неформально представляет набор начальных состояний, которые удовлетворяют R после менее чем k итераций цикла:

Затем мы определяем:

  • инвариант I как предикат .
  • вариант как предложение

С этими определениями сводится к формуле .

Однако на практике такая абстрактная конструкция не может быть эффективно обработана средствами доказательства теорем. Следовательно, инварианты и варианты цикла предоставляются пользователями-людьми или выводятся с помощью некоторой абстрактной процедуры интерпретации .

Недетерминированные охраняемые команды [ править ]

Фактически, Guarded Command Language (GCL) Дейкстры является расширением простого императивного языка, данного до сих пор с недетерминированными операторами. Действительно, GCL стремится быть формальной нотацией для определения алгоритмов. Недетерминированные операторы представляют собой выбор, оставленный фактической реализации (на эффективном языке программирования): свойства, доказанные на недетерминированных операторах, гарантируются для всех возможных вариантов реализации. Другими словами, самые слабые предварительные условия недетерминированных утверждений гарантируют

  • что существует завершающееся выполнение (например, существует реализация),
  • и, что конечное состояние всего завершения выполнения удовлетворяет постусловию.

Обратите внимание, что определения самого слабого предусловия, данные выше (в частности, для цикла while ), сохраняют это свойство.

Выбор [ править ]

Выбор является обобщением оператора if :

Здесь, когда два охранника и одновременно истинны, тогда выполнение этого оператора может запускать любой из связанных операторов или .

Повторение [ править ]

Повторение - это аналогичное обобщение оператора while .

Заявление спецификации (или самое слабое предварительное условие вызова процедуры) [ править ]

Исчисление уточнений расширяет недетерминированные утверждения понятием оператора спецификации . Неформально этот оператор представляет собой вызов процедуры в черном ящике, где тело процедуры неизвестно. Как правило, с использованием синтаксиса близко к B-метода , A спецификация заявление написано

 @

куда

  • x - глобальная переменная, измененная оператором,
  • P - предикат, представляющий предусловие,
  • y - это новая логическая переменная, связанная в Q , которая представляет новое значение x, недетерминированно выбранное оператором,
  • Q - это предикат, представляющий постусловие, или, точнее, охранник: в Q переменная x представляет начальное состояние, а y обозначает конечное состояние.

Самым слабым предварительным условием утверждения спецификации является:

Более того, оператор S реализует такой оператор спецификации тогда и только тогда, когда следующий предикат является тавтологией:

Действительно, в таком случае для всех постусловий R обеспечивается следующее свойство (это прямое следствие монотонности wp , см. Ниже):

 @

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

Другие преобразователи предикатов [ править ]

Самая слабая либеральная предпосылка [ редактировать ]

Важный вариант самого слабого предварительного условия является слабым либеральным условием , что дает самое слабое условие , при котором S либо не прекращать или устанавливает R . Поэтому он отличается от wp тем, что не гарантирует завершения. Следовательно, это частично соответствует логике Хоара : для языка операторов, приведенного выше, wlp отличается от wp только в цикле while , не требуя варианта (см. Выше).

Сильнейшее постусловие [ править ]

Если S - утверждение, а R - предусловие (предикат для начального состояния), то это их самое сильное постусловие : оно подразумевает любое постусловие, удовлетворяемое конечным состоянием любого выполнения S для любого начального состояния, удовлетворяющего R. Другими словами, тройка Хоара доказуема в логике Хоара тогда и только тогда, когда выполняется следующий предикат:

Обычно сильнейшие постусловия используются для частичной корректности. Следовательно, мы имеем следующую связь между самыми слабыми-либеральными-предусловиями и самыми сильными-постусловиями:

Например, по заданию у нас есть:

Выше логическая переменная y представляет начальное значение переменной x . Следовательно,

В последовательности оказывается, что sp бежит вперед (тогда как wp бежит назад):

Преобразователи предикатов Win и Sin [ править ]

Лесли Лэмпорт предложил выигрыш и грех в качестве преобразователей предикатов для параллельного программирования . [1]

Свойства предикатных преобразователей [ править ]

В этом разделе представлены некоторые характерные свойства преобразователей предикатов. [2] Ниже T обозначает преобразователь предикатов (функция между двумя предикатами в пространстве состояний), а P - предикат. Например, T (P) может обозначать wp (S, P) или sp (S, P) . Мы сохраняем x как переменную пространства состояний.

Монотонный [ править ]

Представляющие интерес преобразователи предикатов ( wp , wlp и sp ) монотонны . Предикат трансформатор Т является монотонным , если и только если:

Это свойство связано с правилом следствия логики Хоара .

Строгий [ править ]

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

Например, wp является строгим, а wlp - нет. В частности, если оператор S не может завершиться, то он выполним. У нас есть

В самом деле, true - допустимый инвариант этого цикла.

Завершение [ править ]

Предикат трансформатор Т есть оконечный тогда и только тогда:

На самом деле, эта терминология имеет смысл только для строгих трансформаторов предикатных: на самом деле, является самым слабым, необходимым условием обеспечения прекращения S .

Кажется, что было бы более подходящим назвать это свойство без прерывания : в полной корректности, в случае частичной корректности, это не так.

Конъюнктив [ править ]

Преобразователь предикатов T является конъюнктивным тогда и только тогда:

Это так , даже если оператор S недетерминирован как оператор выбора или оператор спецификации.

Дизъюнктивный [ править ]

Предикат трансформатор Т есть дизъюнктивный тогда и только тогда:

Обычно это не тот случай, когда S недетерминирован. В самом деле, рассмотрим недетерминированный оператор S, выбирающий произвольное логическое значение. Этот оператор представлен здесь как следующий оператор выбора :

Затем сводится к формуле .

Следовательно, сводится к тавтологии

Тогда как формула сводится к неверному утверждению .

Тот же контрпример можно воспроизвести, используя вместо этого оператор спецификации (см. Выше):

 @

Приложения [ править ]

  • Вычисления самых слабых предварительных условий в основном используются для статической проверки утверждений в программах с помощью средства доказательства теорем (например, SMT-решателей или помощников по доказательству ): см. Frama-C или ESC / Java2 .
  • В отличие от многих других семантических формализмов, семантика преобразователя предикатов не была задумана как исследование основ вычислений. Скорее, он был предназначен для того, чтобы предоставить программистам методологию разработки своих программ как «правильных по построению» в «стиле вычислений». Этот «нисходящий» стиль пропагандировали Дейкстра [3] и Н. Вирт . [4] Это было формализовано R.-J. Назад и другие в исчислении уточнения . Некоторые инструменты, такие как B-Method, теперь обеспечивают автоматическое обоснование для продвижения этой методологии.
  • В мета-теории логики Хоара наиболее слабые предусловия выступают в качестве ключевого понятия в доказательстве относительной полноты . [5]

Помимо преобразователей предикатов [ править ]

Самые слабые предусловия и самые сильные постусловия повелительных выражений [ править ]

В семантике преобразователей предикатов выражения ограничены терминами логики (см. Выше). Однако это ограничение кажется слишком сильным для большинства существующих языков программирования, где выражения могут иметь побочные эффекты (вызов функции, имеющей побочный эффект), не могут завершаться или прерваться (например, деление на ноль ). Есть много предложений по расширению самых слабых предусловий или сильнейших постусловий для императивных языков выражения и, в частности, для монад .

Среди них теория типов Хоара объединяет логику Хоара для языка, подобного Haskell , логику разделения и теорию типов . [6] Эта система в настоящее время реализована в виде библиотеки Coq под названием Ynot . [7] В этом языке вычисление выражений соответствует вычислению сильнейших постусловий .

Вероятностные преобразователи предикатов [ править ]

Вероятностные преобразователи предикатов - это расширение преобразователей предикатов для вероятностных программ . Действительно, такие программы имеют множество применений в криптографии (сокрытие информации с помощью некоторого рандомизированного шума), распределенных системах (нарушение симметрии).[8]

См. Также [ править ]

  • Аксиоматическая семантика - включает семантику преобразователя предикатов
  • Динамическая логика - где преобразователи предикатов появляются как модальности
  • Формальная семантика языков программирования - обзор

Заметки [ править ]

  1. ^ Лэмпорт, Лесли (июль 1990). « Победа и грех : преобразователи предикатов для параллелизма» . ACM Trans. Программа. Lang. Syst. 12 (3): 396–428. CiteSeerX  10.1.1.33.90 . DOI : 10.1145 / 78969.78970 . S2CID  209901 .
  2. Назад, Ральф-Йохан; Райт, Йоаким (2012) [1978]. Исчисление уточнения: систематическое введение . Тексты по информатике. Springer. ISBN 978-1-4612-1674-2.
  3. ^ Дейкстра, Эдсгер W. (1968). «Конструктивный подход к проблеме корректности программы». BIT Численная математика . 8 (3): 174–186. DOI : 10.1007 / bf01933419 . S2CID 62224342 . 
  4. Вирт, Н. (апрель 1971 г.). «Разработка программ путем пошагового уточнения» (PDF) . Comm. ACM . 14 (4): 221–7. DOI : 10.1145 / 362575.362577 . ЛВП : 20.500.11850 / 80846 . S2CID 13214445 .  
  5. ^ Учебное пособие по логике Хоара :библиотека Coq , дающая простое, но формальное доказательство того, что логика Хоара является правильной и полной в отношении операционной семантики .
  6. ^ Наневский, Александар; Моррисетт, Грег; Биркедал, Ларс (сентябрь 2008 г.). "Теория типа Хоара, полиморфизм и разделение" (PDF) . Журнал функционального программирования . 18 (5–6): 865–911. DOI : 10.1017 / S0956796808006953 .
  7. ^ Ynot Coq библиотекареализующая Хоара теории типа.
  8. ^ Морган, Кэрролл; МакИвер, Аннабель; Зайдель, Карен (май 1996 г.). "Вероятностные преобразователи предикатов" (PDF) . ACM Trans. Программа. Lang. Syst . 18 (3): 325–353. CiteSeerX 10.1.1.41.9219 . DOI : 10.1145 / 229542.229547 . S2CID 5812195 .   

Ссылки [ править ]

  • де Баккер, JW (1980). Математическая теория корректности программ . Прентис-Холл. ISBN 978-0-13-562132-5.
  • Bonsangue, Marcello M .; Кок, Йост Н. (ноябрь 1994 г.). «Самое слабое исчисление предусловий: рекурсия и двойственность». Формальные аспекты вычислений . 6 (6): 788–800. CiteSeerX  10.1.1.27.8491 . DOI : 10.1007 / BF01213603 . S2CID  40323488 .
  • Дейкстра, Эдсгер В. (август 1975 г.). «Защищенные команды, неопределенность и формальная производность программ». Comm. ACM . 18 (8): 453–7. DOI : 10.1145 / 360933.360975 . S2CID  1679242 .
  • Дейкстра, Эдсгер В. (1976). Дисциплина программирования . Прентис Холл. ISBN 978-0-613-92411-5. - Систематическое введение в версию защищенного командного языка с множеством отработанных примеров
  • Dijkstra, Edsger W .; Схолтен, Карел С. (1990). Исчисление предикатов и семантика программ . Тексты и монографии по информатике. Springer-Verlag. ISBN 978-0-387-96957-2. - Более абстрактный, формальный и окончательный подход
  • Грис, Дэвид (1981). Наука программирования . Springer-Verlag. ISBN 978-0-387-96480-5.