Семантика преобразователя предикатов
Семантика | ||||||||
---|---|---|---|---|---|---|---|---|
|
||||||||
Семантика языки программирования | ||||||||
|
||||||||
Семантика преобразователя предикатов была представлена Эдсгером Дейкстрой в его основополагающей статье « Защищенные команды, неопределенность и формальный вывод программ ». Они определяют семантику императивной парадигмы программирования , присваивая каждому оператору этого языка соответствующий преобразователь предикатов : общую функцию между двумя предикатами в пространстве состояний оператора. В этом смысле семантика предикатов-преобразователей является разновидностью денотационной семантики . На самом деле в защищенных командах Дейкстра использует только один вид преобразователя предикатов: хорошо известные слабейшие предусловия (см. ниже).
Более того, семантика преобразователя предикатов представляет собой переформулировку логики Флойда-Хора . В то время как логика Хоара представлена как дедуктивная система , семантика преобразователя предикатов (либо с помощью слабейших предусловий , либо с помощью сильнейших постусловий , см. ниже) представляет собой полноценную стратегию построения действительных выводов логики Хоара. Другими словами, они предоставляют эффективный алгоритм , позволяющий свести проблему проверки тройки Хоара к проблеме доказательства формулы первого порядка . Технически семантика преобразователя предикатов выполняет своего рода символическое выполнение операторов в предикатах: выполнение выполняется назад в случае самых слабых предусловий или вперед в случае самых сильных постусловий.
Самые слабые предпосылки [ править ]
Определение [ править ]
Для утверждения S и постусловия R самым слабым предусловием является предикат Q что для любого предусловия P такой , тогда и только тогда, когда . Другими словами, это «самое слабое» или наименее ограничительное требование, необходимое для того, чтобы гарантировать R после S. выполнение Единственность легко следует из определения: если и Q , и Q' являются слабейшими предусловиями, то по определению так и так , и таким образом . Мы часто используем для обозначения самого слабого предусловия для утверждения S относительно R. постусловия
Соглашения [ править ]
Мы используем T для обозначения предиката, который всюду истинен, и F для обозначения предиката, который всюду ложен. Мы не должны, по крайней мере, концептуально путать себя с логическим выражением, определенным синтаксисом какого-либо языка, который также может содержать значения true и false в качестве логических скаляров. Для таких скаляров нам нужно выполнить приведение типов так, чтобы T = predicate(true) и F = predicate(false). Такое продвижение часто осуществляется небрежно, поэтому люди склонны воспринимать Т как истинное, а F как ложное.
Пропустить [ править ]
Прервать [ править ]
Назначение [ править ]
Ниже мы приводим два эквивалентных слабейших предусловия для оператора присваивания. В этих формулах копией R где свободные вхождения x E. заменяются на , является Следовательно, здесь выражение E неявно приводится в действительный термин базовой логики: таким образом, это чистое выражение, полностью определенное, завершающееся и не имеющее побочных эффектов.
- версия 1:
где y — новая переменная, несвободная в E и R (представляющая окончательное значение переменной x ) |
- версия 2:
При условии, что E корректно определено, мы просто применяем так называемое правило одной точки к версии 1. Тогда
Первая версия позволяет избежать потенциального дублирования x в R встречается не более одного раза , тогда как вторая версия проще, когда x в R . Первая версия также обнаруживает глубокую двойственность между самым слабым предусловием и самым сильным постусловием (см. ниже).
Пример правильного расчета wp (с использованием версии 2) для присваиваний с целочисленной переменной x :
Это означает, что для того, чтобы постусловие x > 10 было истинным после присваивания, предусловие x > 15 должно быть истинным до присваивания. Это также «самое слабое предварительное условие», поскольку это «самое слабое» ограничение на значение x , которое делает x > 10 истинным после присваивания.
Последовательность [ править ]
Например,
Условно [ править ]
В качестве примера:
Пока цикл [ править ]
Частичная правильность [ править ]
На мгновение игнорируя завершение, мы можем определить правило для самого слабого либерального предварительного условия , обозначаемого wlp , используя предикат \textit{INV} , называемый [[loop \textit{INV}ariant]], обычно предоставляемый программистом:
Полная корректность [ править ]
Чтобы доказать полную корректность, нам также нужно показать, что цикл завершается. Для этого мы определяем обоснованное отношение в пространстве состояний, обозначаемое как ( wfs , <), и определяем вариантную функцию vf , такую, что мы имеем:
где v — новый набор переменных |
Неформально, в приведенном выше сочетании трех формул:
- первый означает, что вариант должен быть частью обоснованного отношения перед входом в цикл;
- второй означает, что тело цикла (т.е. оператор S ) должно сохранить инвариант и сократить вариант;
- последнее означает, что постусловие цикла R должно быть установлено после завершения цикла.
Однако соединение этих трех не является необходимым условием. Точно, у нас есть
Недетерминированные защищенные команды [ править ]
(GCL) Дейкстры На самом деле, защищенный командный язык является расширением простого императивного языка, представленного до сих пор, с недетерминированными утверждениями. Действительно, GCL стремится стать формальной нотацией для определения алгоритмов. Недетерминированные утверждения представляют собой выбор, оставленный фактической реализации (на эффективном языке программирования): свойства, доказанные в недетерминированных утверждениях, гарантируются для всех возможных вариантов реализации. Другими словами, слабейшие предусловия недетерминированных утверждений гарантируют
- что существует завершающее выполнение (например, существует реализация),
- и что конечное состояние всего завершающегося выполнения удовлетворяет постусловию.
Обратите внимание, что определения слабейшего предусловия, данные выше (в частности, для цикла while ), сохраняют это свойство.
Выбор [ править ]
Выбор — это обобщение оператора if :
[ нужна ссылка ]
Здесь, когда два охранника и одновременно истинны, то выполнение этого оператора может запустить любой из связанных операторов или .
Повторение [ править ]
обобщение оператора while Повторение — это аналогичное .
Заявление о спецификации [ править ]
Уточняющее исчисление расширяет GCL понятием спецификации . Синтаксически мы предпочитаем писать оператор спецификации как
который определяет вычисление, которое начинается в состоянии, удовлетворяющем pre , и гарантируется закончить постом, удовлетворяющим состояние изменив только x . Мы звоним логическая константа, используемая для помощи в спецификации. Например, мы можем указать вычисление, которое увеличивает x на 1 как
Другой пример — вычисление квадратного корня из целого числа.
Оператор спецификации выглядит как примитив в том смысле, что он не содержит других операторов. Однако оно очень выразительно, поскольку pre и post — произвольные предикаты. Его самое слабое условие состоит в следующем.
где s свежий. |
Он сочетает в себе синтаксическую идею Моргана с идеей резкости Байлсмы, Мэтьюза и Уилтинка. [1] Большим преимуществом этого является возможность определения wp для goto L и других операторов перехода. [2]
Оператор Goto [ править ]
Формализация операторов перехода, таких как goto L занимает очень долгий и трудный процесс. Распространенное мнение, похоже, указывает на то, что оператор goto может быть аргументирован только операционально. Вероятно, это связано с неспособностью признать, что goto L на самом деле является чудесным (то есть нестрогим) и не следует придуманному Дейкстрой Закону Исключенного Чуда, как он есть сам по себе. Но он имеет чрезвычайно простой оперативный взгляд с точки зрения самых слабых предварительных условий, что было неожиданным. Мы определяем
где wpL — самое слабое предварительное условие на L. метке |
Для Выполнение goto L передает управление метке L, на которой должно выполняться самое слабое предварительное условие. То, как wpL упоминается в правиле, не должно вызывать большого удивления. Это просто для некоторого Q, вычисленного до этой точки. Это похоже на любые правила wp, использующие составные операторы для определения wp, даже несмотря на то, что goto L выглядит примитивом. Правило не требует уникальности для мест, где находится wpL внутри программы, поэтому теоретически оно позволяет одной и той же метке появляться в нескольких местах, пока самым слабым предварительным условием в каждом месте является один и тот же wpL. Оператор goto может перейти в любое из таких мест. Это фактически оправдывает то, что мы можем размещать одни и те же метки в одном и том же месте несколько раз, как , что то же самое, что . Кроме того, он не подразумевает каких-либо правил области видимости, что позволяет, например, перейти в тело цикла. Вычислим wp следующей программы S, имеющей переход в тело цикла.
wp(do x > 0 → L: x := x-1 od; if x < 0 → x := -x; goto L ⫿ x ≥ 0 → skip fi, post) = { sequential composition and alternation rules } wp(do x > 0 → L: x := x-1 od, (x<0 ∧ wp(x := -x; goto L, post)) ∨ (x ≥ 0 ∧ post) = { sequential composition, goto, assignment rules } wp(do x > 0 → L: x := x-1 od, x<0 ∧ wpL(x ← -x) ∨ x≥0 ∧ post) = { repetition rule } the strongest solution of Z: [ Z ≡ x > 0 ∧ wp(L: x := x-1, Z) ∨ x < 0 ∧ wpL(x ← -x) ∨ x=0 ∧ post ] = { assignment rule, found wpL = Z(x ← x-1) } the strongest solution of Z: [ Z ≡ x > 0 ∧ Z(x ← x-1) ∨ x < 0 ∧ Z(x ← x-1) (x ← -x) ∨ x=0 ∧ post] = { substitution } the strongest solution of Z:[ Z ≡ x > 0 ∧ Z(x ← x-1) ∨ x < 0 ∧ Z(x ← -x-1) ∨ x=0 ∧ post ] = { solve the equation by approximation } post(x ← 0)
Поэтому,
wp(S, post) = post(x ← 0).
Другие предикатов преобразователи
Слабейшее либеральное условие
Важным вариантом самого слабого предварительного условия является самое слабое либеральное предварительное условие. , что дает самое слабое условие, при котором S либо не завершается, либо устанавливает R . Поэтому он отличается от wp тем, что не гарантирует завершения. Следовательно, это соответствует логике Хоара с частичной корректностью: для языка операторов, приведенного выше, wlp отличается от wp только в while-loop , не требуя варианта (см. выше).
Сильнейшее постусловие [ править ]
Если S — утверждение, а R ( — предусловие предикат начального состояния), то является их сильнейшим постусловием : оно подразумевает любое постусловие, удовлетворяемое конечным состоянием любого выполнения S, для любого начального состояния, удовлетворяющего R. Другими словами, тройка Хоара доказуемо в логике Хоара тогда и только тогда, когда выполняется приведенный ниже предикат:
Обычно сильнейшие постусловия используются при частичной корректности. Следовательно, мы имеем следующую связь между самыми слабыми либеральными предусловиями и самыми сильными постусловиями:
Например, по заданию имеем:
где ты свежий |
Выше логическая переменная y представляет начальное значение переменной x . Следовательно,
Судя по последовательности, sp работает вперед (тогда как wp работает назад):
Преобразователи предикатов выигрыша и греха [ править ]
Лесли Лэмпорт предложил выигрыш и грех в качестве преобразователей предикатов для параллельного программирования . [3]
Свойства преобразователей предикатов [ править ]
В этом разделе представлены некоторые характерные свойства преобразователей предикатов. [4] Ниже S обозначает преобразователь предикатов (функция между двумя предикатами в пространстве состояний), а P — предикат. Например, S(P) может обозначать wp(S,P) или sp(S,P) . Мы сохраняем x как переменную пространства состояний.
Монотонный [ править ]
Интересующие нас преобразователи предикатов ( wp , wlp и sp ) монотонны . Предикатный преобразователь S монотонен тогда и только тогда, когда:
Это свойство связано с правилом следствий логики Хоара .
Строгий [ править ]
Предикатный преобразователь S является строгим тогда и только тогда, когда:
Например, wp искусственно становится строгим, тогда как wlp обычно не является строгим. В частности, если оператор S не может завершиться, то является удовлетворительным. У нас есть
Действительно, T является допустимым инвариантом этого цикла.
Нестрогие, но монотонные или конъюнктивные преобразователи предикатов называются чудесными и могут также использоваться для определения класса программных конструкций, в частности, операторов перехода, которые Дейкстра меньше всего заботил. Эти операторы перехода включают в себя прямой переход к L, операторы прерывания и продолжения в цикле и операторы возврата в теле процедуры, обработку исключений и т. д. Оказывается, все операторы перехода — это исполняемые чудеса, [5] т.е. они могут быть реализованы, но не строго.
Прекращение [ править ]
Преобразователь предикатов S завершается , если:
На самом деле эта терминология имеет смысл только для строгих преобразователей предикатов: действительно, является самым слабым предварительным условием, обеспечивающим завершение S .
Кажется, правильнее было бы назвать это свойство непрерыванием : в полной корректности непрерывание есть аборт, а в частичной корректности - нет.
Союз [ править ]
Предикатный преобразователь S является конъюнктивным тогда и только тогда, когда:
Это относится к , даже если оператор S недетерминирован как оператор выбора или оператор спецификации.
Дизъюнктивный [ править ]
Преобразователь предикатов S является дизъюнктивным тогда и только тогда, когда:
Обычно это не тот случай когда S недетерминирован. Действительно, рассмотрим недетерминированное утверждение S, выбирающее произвольное логическое значение. Этот оператор представлен здесь как следующий оператор выбора :
Затем, сводится к формуле .
Следовательно, сводится к тавтологии
Тогда как формула сводится к неправильному предложению .
Приложения [ править ]
- Вычисления слабейших предусловий в основном используются для статической проверки утверждений в программах, использующих средство доказательства теорем (например, SMT-решатели или помощники по доказательству ): см. Frama-C или ESC/Java2 .
- В отличие от многих других семантических формализмов, семантика преобразователей предикатов не была разработана как исследование основ вычислений. Скорее, он был предназначен для того, чтобы предоставить программистам методологию для разработки своих программ как «правильных по конструкции» в «стиле вычислений». Этот стиль «сверху вниз» пропагандировал Дейкстра. [6] и Н. Вирт . [7] В дальнейшем оно было формализовано Р.-Ж. Бэк и другие в уточняющем исчислении . Некоторые инструменты, такие как B-Method, теперь обеспечивают автоматическое обоснование для продвижения этой методологии.
- В метатеории логики Хоара слабейшие предусловия выступают в качестве ключевого понятия в доказательстве относительной полноты . [8]
преобразователей предикатов пределами За
Слабейшие предусловия и сильнейшие постусловия императивных выражений [ править ]
В семантике преобразователей предикатов выражения ограничиваются терминами логики (см. выше). Однако это ограничение кажется слишком сильным для большинства существующих языков программирования, где выражения могут иметь побочные эффекты (вызов функции, имеющей побочный эффект), не могут завершаться или прерываться (например, деление на ноль ). Существует множество предложений по расширению слабейших предусловий или сильнейших постусловий для языков императивных выражений и, в частности, для монад .
Среди них теория типов Хоара сочетает в себе логику Хоара для языка, подобного Haskell , логику разделения и теорию типов . [9] Эта система в настоящее время реализована как библиотека Coq под названием Ynot . [10] В этом языке вычисление выражений соответствует вычислению сильнейших постусловий .
предикатов преобразователи Вероятностные
Вероятностные преобразователи предикатов являются расширением преобразователей предикатов для вероятностных программ . Действительно, такие программы имеют множество применений в криптографии (сокрытие информации с использованием некоторого случайного шума), распределенные системы (нарушение симметрии). [11]
См. также [ править ]
- Аксиоматическая семантика - включает семантику преобразователя предикатов.
- Динамическая логика - где преобразователи предикатов выступают как модальности.
- Формальная семантика языков программирования — обзор
Примечания [ править ]
- ^ Чен, Вэй и Уддинг, Ян Таймен, «Уточненная спецификация» WUCS-89-37 (1989). https://openscholarship.wustl.edu/cse_research/749
- ^ Чен, Вэй, «Характеристика операторов перехода», Международный симпозиум по теоретическим аспектам программной инженерии (TASE), 2021 г., стр. 15-22. дои: 10.1109/TASE52547.2021.00019.
- ^ Лэмпорт, Лесли (июль 1990 г.). « Победа и грех : преобразователи предикатов для параллелизма» . АКМ Транс. Программа. Ланг. Сист. 12 (3): 396–428. CiteSeerX 10.1.1.33.90 . дои : 10.1145/78969.78970 . S2CID 209901 .
- ^ Назад, Ральф-Йохан; Райт, Йоаким (2012) [1978]. Уточняющее исчисление: систематическое введение . Тексты по информатике. Спрингер. ISBN 978-1-4612-1674-2 .
- ^ Чен, Вэй, «Заявления о выходе - исполняемые чудеса» WUCS-91-53 (1991). https://openscholarship.wustl.edu/cse_research/671
- ^ Дейкстра, Эдсгер В. (1968). «Конструктивный подход к проблеме корректности программ». БИТ Численная математика . 8 (3): 174–186. дои : 10.1007/bf01933419 . S2CID 62224342 .
- ^ Вирт, Н. (апрель 1971 г.). «Разработка программы путем поэтапной доработки» (PDF) . Комм. АКМ . 14 (4): 221–7. дои : 10.1145/362575.362577 . hdl : 20.500.11850/80846 . S2CID 13214445 .
- ^ Учебное пособие по логике Хоара : библиотека Coq , дающая простое, но формальное доказательство того, что логика Хоара является правильной и полной с точки зрения операционной семантики .
- ^ Наневский, Александр; Моррисетт, Грег; Биркедал, Ларс (сентябрь 2008 г.). «Теория типов Хоара, полиморфизм и разделение» (PDF) . Журнал функционального программирования . 18 (5–6): 865–911. дои : 10.1017/S0956796808006953 . S2CID 6956622 .
- ^ Ynot библиотека Coq , реализующая теорию типов Хоара.
- ^ Морган, Кэрролл; МакИвер, Аннабель ; Зайдель, Карен (май 1996 г.). «Вероятностные преобразователи предикатов» (PDF) . АКМ Транс. Программа. Ланг. Сист . 18 (3): 325–353. CiteSeerX 10.1.1.41.9219 . дои : 10.1145/229542.229547 . S2CID 5812195 .
Ссылки [ править ]
- де Баккер, JW (1980). Математическая теория корректности программ . Прентис-Холл. ISBN 978-0-13-562132-5 .
- Бонсанге, Марчелло М.; Кок, Йост Н. (ноябрь 1994 г.). «Самое слабое исчисление предусловий: рекурсия и двойственность». Формальные аспекты вычислений . 6 (6): 788–800. CiteSeerX 10.1.1.27.8491 . дои : 10.1007/BF01213603 . S2CID 40323488 .
- Дейкстра, Эдсгер В. (август 1975 г.). «Защищенные команды, неопределенность и формальный вывод программ» . Комм. АКМ . 18 (8): 453–7. дои : 10.1145/360933.360975 . S2CID 1679242 .
- Дейкстра, Эдсгер В. (1976). Дисциплина программирования . Прентис Холл. ISBN 978-0-613-92411-5 . — Систематическое введение в версию защищенного командного языка со множеством проработанных примеров.
- Дейкстра, Эдсгер В.; Схолтен, Карел С. (1990). Исчисление предикатов и семантика программ . Тексты и монографии по информатике. Спрингер-Верлаг. ISBN 978-0-387-96957-2 . — Более абстрактная, формальная и определенная трактовка
- Грис, Дэвид (1981). Наука программирования . Спрингер Верлаг. ISBN 978-0-387-96480-5 .