Семантика преобразователя предикатов

редактировать

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

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

Содержание
  • 1 Наименьшие предварительные условия
    • 1.1 Определение
    • 1.2 Пропустить
    • 1.3 Прерывание
    • 1.4 Присвоение
    • 1.5 Последовательность
    • 1.6 Условное
    • 1.7 Цикл while
      • 1.7.1 Частичная правильность
      • 1.7.2 Полная корректность
    • 1.8 Недетерминированные защищенные команды
      • 1.8.1 Выбор
      • 1.8.2 Повторение
    • 1.9 Заявление спецификации (или самое слабое предварительное условие вызова процедуры)
  • 2 Другие преобразователи предикатов
    • 2.1 Наименьшее либеральное предусловие
    • 2.2 Самое сильное постусловие
    • 2.3 Преобразователи предикатов Win и sin
  • 3 Свойства преобразователей предикатов
    • 3.1 Монотонный
    • 3.2 Строгий
    • 3.3 Завершение
    • 3.4 Конъюнктив
    • 3.5 Дизъюнктив
  • 4 Приложения
  • 5 За пределами преобразователей предикатов
    • 5.1 Самые слабые предусловия и самые сильные постусловия императивных выражений
    • 5.2 Вероятностные преобразователи предикатов
  • 6 См. Также
  • 7 Примечания
  • 8 Ссылки
Наименьшие предварительные условия

Определение

Для оператора S и постусловия R, a самое слабое предусловие - это предикат Q такой, что для любого предусловия P {\ displaystyle P}P , {P} S {R} {\ displaystyle \ {P \} S \ {R \}}{\ displaystyle \ {P \} S \ {R \}} тогда и только тогда, когда P ⇒ Q {\ displaystyle P \ Rightarrow Q}{\ dis стиль игры P \ Rightarrow Q} . Уникальность легко следует из определения: если и Q, и Q 'являются самыми слабыми предусловиями, то по определению {Q ′} S {R} {\ displaystyle \ {Q' \} S \ {R \}}{\displaystyle \{Q'\}S\{R\}}так Q '⇒ Q {\ displaystyle Q' \ Rightarrow Q}{\displaystyle Q'\Rightarrow Q}и {Q} S {R} {\ displaystyle \ {Q \} S \ {R \}}{\ displaystyle \ {Q \} S \ {R \}} поэтому Q ⇒ Q ′ {\ displaystyle Q \ Rightarrow Q '}{\displaystyle Q\Rightarrow Q'}, и, следовательно, Q = Q ′ {\ displaystyle Q = Q'}{\displaystyle Q=Q'}. Обозначим wp (S, R) {\ displaystyle wp (S, R)}wp (S, R) самое слабое предусловие для оператора S и постусловия R.

Skip

wp (skip, R) = R {\ displaystyle wp ({\ textbf {skip}}, R) \ = \ R}wp ({\ textbf {skip}}, R) \ = \ R

Abort

wp (abort, R) = false {\ displaystyle wp ({\ textbf {abort }}, R) \ = \ {\ textbf {false}}}wp ({\ textbf {abort}}, R) \ = \ {\ textbf {false}}

Присваивание

Ниже мы приводим два эквивалентных самых слабых предварительных условия для оператора присваивания. В этих формулах R [x ← E] {\ displaystyle R [x \ leftarrow E]}R [x \ leftarrow E] является копией R, где свободные вхождения x заменены на E Следовательно, здесь выражение E неявно приводится к допустимому термину базовой логики: таким образом, это чистое выражение, полностью определенное, завершающееся и без побочных эффектов.

  • версия 1:
wp (x: = E, R) = ∀ y, y = E ⇒ R [x ← y] {\ displaystyle wp (x: = E, R) \ = \ \ forall y, y = E \ Rightarrow R [x \ leftarrow y]}{\ displaystyle wp (x: = E, R) \ = \ \ forall y, y = E \ Rightarrow R [x \ leftarrow y]}

где y - новая переменная (представляющая окончательное значение переменной x)

  • версия 2:
wp (x: = E, R) = R [x ← E] {\ displaystyle wp (x: = E, R) \ = \ R [x \ leftarrow E]}wp (x: = E, R) \ = \ R [x \ leftarrow E]

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

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

wp (x: = x - 5, x>10) = x - 5>10 ⇔ Икс>15 {\ Displaystyle {\ begin {array} {rcl} wp (x: = x-5, x>10) = x-5>10 \\ \ Leftrightarrow x>15 \ end {array}} }{\begin{array}{rcl}wp(x:=x-5,x>10) = x-5>10 \\ \ Leftrightarrow x>15 \ end {array}}

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

Последовательность

wp (S 1; S 2, R) = wp (S 1, wp (S 2, R)) {\ displaystyle wp (S_ {1}; S_ {2}, R) \ = \ wp (S_ {1}, wp ( S_ {2}, R))}wp (S_ {1}; S_ {2}, R) \ = \ wp ( S_ {1}, wp (S_ {2}, R))

Например,

wp (x: = x - 5; x: = x ∗ 2, x>20) = wp (x: = x - 5, wp ( х: = х * 2, x>20)) = wp (x: = x - 5, x ∗ 2>20) = (x - 5) ∗ 2>20 = x>15 {\ displaystyle {\ begin {array} {rcl} wp (x: = x-5; x: = x * 2 \, \ x>20) = wp (x: = x-5, wp (x: = x * 2, x>20)) \\ = wp (x: = x-5, x * 2>20) \\ = (x-5) * 2>20 \\ = x>15 \ end {array}}{\begin{array}[t]{rcl}wp(x:=x-5;x:=x*2\,\ x>20) = wp (x: = x-5, wp (x: = x * 2, x>20)) \\ = wp (x: = x-5, x * 2>20) \\ = (x-5) * 2>20 \\ = x>15 \ end {array}}

Условный

wp (если E, то S 1, иначе S 2 end, R) = (E ⇒ wp (S 1, R)) ∧ (¬ E ⇒ wp (S 2, R)) {\ displaystyle wp ({\ textbf {if}} \ E \ {\ textbf {then}} \ S_ {1} \ {\ textbf {else}} \ S_ {2} \ {\ textbf {end}}, R) \ = \ (E \ Rightarrow wp (S_ {1}, R)) \ wedge (\ neg E \ Rightarrow wp (S_ {2}, R))}wp ({\ textbf {if}} \ E \ {\ textbf {then}} \ S_ {1} \ {\ textbf {else}} \ S_ {2} \ {\ textbf {end}}, R) \ = \ (E \ Rightarrow wp (S_ {1}, R)) \ wedge (\ neg E \ Rightarrow wp (S_ {2}, R))

Как пример:

wp (if x < y then x := y else skip end, x ≥ y) = ( x < y ⇒ w p ( x := y, x ≥ y)) ∧ ( ¬ ( x < y) ⇒ w p ( skip, x ≥ y)) = ( x < y ⇒ y ≥ y) ∧ ( ¬ ( x < y) ⇒ x ≥ y) ⇔ true {\displaystyle {\begin{array}{rcl}wp({\textbf {if}}\ x{\ begin { array} [t] {rcl} wp ({\ textbf {if}} \ x <y \ {\ textbf {then}} \ x: = y \ {\ textbf {else}} \; \; {\ textbf { skip}} \; \; {\ textbf {end}}, \ x \ geq y) = (x <y \ Rightarrow wp (x: = y, x \ geq y)) \ \ wedge \ (\ neg (x <y) \ Rightarrow wp ({\ textbf {skip}}, x \ geq y)) \\ = (x <y \ Rightarrow y \ geq y) \ \ wedge \ (\ neg (x <y) \ Rightarrow x \ geq y) \\ \ Leftrightarrow {\ textbf {true}} \ end {array}}

while loop

Partial Correctness

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

wlp (в то время как E do S done, R) = I ∧ ∀ y, ((E ∧ I) ⇒ wlp (S, I)) [x ← y] ∧ ∀ Y, ((¬ E ∧ I) ⇒ R) [x ← y] {\ displaystyle wlp ({\ textbf {while}} \ E \ {\ textbf {do}} \ S \ {\ textbf {done}}, R) \ = \ {\ begin {array} {l} I \\\ wedge \ \ forall y, ((E \ wedge I) \ Rightarrow wlp (S, I)) [x \ leftarrow y] \\\ wedge \ \ forall y, ((\ neg E \ wedge I) \ Rightarrow R) [x \ leftarrow y] \ end {array}}}{\ displaystyle wlp ({\ textbf {while}} \ E \ {\ textbf {do}} \ S \ {\ textbf {done}) }, R) \ = \ {\ begin {array} {l} I \\\ wedge \ \ forall y, ((E \ wedge I) \ Rightarrow wlp (S, I)) [x \ leftarrow y] \\ \ wedge \ \ forall y, ((\ neg E \ wedge I) \ Rightarrow R) [x \ leftarrow y] \ end {array}}}

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

Полная корректность

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

wp (в то время как E do S done, R) = I ∧ ∀ y, ((E ∧ I) ⇒ wp (S, I ∧ x < y)) [ x ← y ] ∧ ∀ y, ( ( ¬ E ∧ I) ⇒ R) [ x ← y ] {\displaystyle wp({\textbf {while}}\ E\ {\textbf {do}}\ S\ {\textbf {done}},R)\ =\ {\begin{array}{l}I\\\wedge \ \forall y,((E\wedge I)\Rightarrow wp(S,I\wedge x{\ displaystyle wp ({\ textbf {while}} \ E \ {\ textbf {do}} \ S \ {\ textbf {done}}, R) \ = \ {\ begin {array} {l} I \\\ клин \ \ forall y, ((E \ wedge I) \ Rightarrow wp (S, I \ wedge x <y)) [x \ leftarrow y] \\\ клин \ \ forall y, ((\ neg E \ wedge I) \ Rightarrow R) [x \ leftarrow y] \ конец {массив}}}

, где y - свежий набор переменных

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

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

В семантике преобразователей предикатов, инвариант и вариант создаются путем имитации Теорема Клини о неподвижной точке. Ниже эта конструкция в общих чертах описана в теории множеств. Мы предполагаем, что U - это множество, обозначающее пространство состояний. Сначала мы определяем семейство подмножеств U, обозначенное (A k) k ∈ N {\ displaystyle (A_ {k}) _ {k \ in \ mathbb {N}}}(A_ {k}) _ {{k \ in {\ mathbb {N}}}} индукцией по натуральному числу k. Неформально A k {\ displaystyle A_ {k}}A_{k}представляет набор начальных состояний, которые удовлетворяют R после менее чем k итераций цикла:

A 0 = ∅ A k + 1 = {y ∈ U | ((E ⇒ wp (S, x ∈ A k)) ∧ (¬ E ⇒ R)) [x ← y]} {\ displaystyle {\ begin {array} {rcl} A_ {0} = \ emptyset \ \ A_ {k + 1} = \ left \ {\ y \ in U \ | \ ((E \ Rightarrow wp (S, x \ in A_ {k})) \ wedge (\ neg E \ Rightarrow R)) [x \ leftarrow y] \ \ right \} \\\ end {array}}}{\ begin {array} {rcl} A_ {0} = \ emptyset \\ A _ {{k + 1}} = \ left \ {\ y \ in U \ | \ ((E \ Rightarrow wp (S, x \ in A_ {k})) \ wedge (\ neg E \ Rightarrow R)) [x \ leftarrow y] \ \ right \} \\\ end {array}}

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

  • инвариант I как предикат ∃ k, x ∈ A k {\ displaystyle \ существует k, x \ в A_ {k}}\ существует k, x \ in A_ {k} .
  • варианте y < z {\displaystyle yy <z как предложение ∃ i, y ∈ A i ∧ (∀ j, z ∈ A j ⇒ i < j) {\displaystyle \exists i,y\in A_{i}\wedge (\forall j,z\in A_{j}\Rightarrow i\ существует i, y \ в A_ {i} \ wedge (\ forall j, z \ in A_ {j} \ Rightarrow i <j)

С этими определениями, wp (пока E do S готово, R) {\ displaystyle wp ({\ textbf {while}} \ E \ {\ textbf {do}} \ S \ {\ textbf {done}}, R)}wp ({\ textbf {while}} \ E \ {\ textbf {do}} \ S \ {\ textbf {done}}, R) сводится к формуле ∃ k, x ∈ A k {\ displaystyle \ exists k, x \ in A_ {k}}\ существует k, x \ in A_ {k} .

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

Недетерминированные охраняемые команды

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

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

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

Выбор

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

wp (if E 1 → S 1 []… [] E n → S nfi, R) = (E 1 ∨… ∨ E n) ∧ (E 1 ⇒ wp (S 1, R))… ∧ (E n ⇒ wp (S n, R)) {\ displaystyle wp (\ mathbf {if} \ E_ {1} \ rightarrow S_ {1} \ [\!] \ \ Ldots \ [\!] \ E_ {n} \ rightarrow S_ {n} \ \ mathbf {fi}, R) \ = {\ begin {array} {l} (E_ {1} \ vee \ ldots \ vee E_ {n}) \\\ клин \ (E_ {1} \ Rightarrow wp (S_ {1}, R)) \\\ ldots \\\ клин \ (E_ {n} \ Rightarrow wp (S_ {n}, R)) \\\ end {array}}}wp ({\ mathbf {if}} \ E_ { 1} \ rightarrow S_ {1} \ [\!] \ \ Ldots \ [\!] \ E_ {n} \ rightarrow S_ {n} \ {\ mathbf {fi}}, R) \ = {\ begin {array } [t] {l} (E_ {1} \ vee \ ldots \ vee E_ {n}) \\\ клин \ (E_ {1} \ Rightarrow wp (S_ {1}, R)) \\\ ldots \ \\ клин \ (E_ {n} \ Rightarrow wp (S_ {n}, R)) \\\ end {array}}

Здесь, когда два охранника E i {\ displaystyle E_ {i}}E_ {i} и E j {\ displaystyle E_ {j}}E_ {j} одновременно истинны, тогда выполнение этого оператора может запускать любой из связанных операторов S i {\ displaystyle S_ {i }}S_{i}или S j {\ displaystyle S_ {j}}S_j .

Повторение

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

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

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

P | {\ displaystyle P \ |}P \ | @у. Q → x: = y {\ displaystyle y. \ Q \ rightarrow x: = y}y. \ Q \ rightarrow x: = y

где

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

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

wp (P | {\ displaystyle wp (P \ |}wp (P \ | @y. Q → x: = y, R) = P ∧ ∀ z, Q [y ← z] ⇒ R [x ← z] {\ displaystyle y. \ Q \ rightarrow x: = y \, \ R) \ = \ P \ wedge \ forall z, Q [y \ leftarrow z] \ Rightarrow R [x \ leftarrow z]}y. \ Q \ rightarrow x: = y \, \ R) \ = \ P \ wedge \ forall z, Q [y \ leftarrow z] \ Rightarrow R [x \ leftarrow z]

где z - новое имя

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

∀ x 0, (P ⇒ wp (S, Q [x ← x 0] [y ← x])) [x ← x 0] {\ displayst yle \ forall x_ {0}, (P \ Rightarrow wp (S, Q [x \ leftarrow x_ {0}] [y \ leftarrow x])) [x \ leftarrow x_ {0}]}\ forall x_ {0}, (P \ Rightarrow wp (S, Q [x \ leftarrow x_ {0}] [y \ leftarrow x])) [x \ leftarrow x_ {0}]

где x 0 {\ displaystyle x_ {0}}x_ {0} - новое имя (обозначающее начальное состояние)

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

wp (P | {\ displaystyle wp (P \ |}wp (P \ | @y. Q → x: = y, R) ⇒ wp (S, R) {\ displaystyle y. \ Q \ rightarrow x: = y \, \ R) \ Rightarrow wp (S, R)}y. \ Q \ rightarrow x: = y \, \ R) \ Rightarrow wp (S, R)

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

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

Наименьшее либеральное предусловие

Важным вариантом самого слабого предусловия является самое слабое либеральное предусловие wlp (S, R) {\ displaystyle wlp (S, R)}wlp (S, R) , что дает самое слабое условие, при котором S либо не завершается, либо устанавливает R. Следовательно, он отличается от wp тем, что не гарантирует завершения. Следовательно, он частично соответствует логике Хоара : для языка операторов, приведенного выше, wlp отличается от wp только на while-loop, не требуя варианта (см. Выше).

Сильнейшее постусловие

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

∀ x, sp (S, P) ⇒ Q {\ displaystyle \ forall x, sp (S, P) \ Rightarrow Q}\ forall x, sp (S, P) \ Rightarrow Q

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

(∀ x, P ⇒ wlp (S, Q)) ⇔ (∀ x, sp (S, P) ⇒ Q) {\ displaystyle (\ forall x, P \ Rightarrow wlp (S, Q)) \ \ Leftrightarrow \ (\ forall x, sp (S, P) \ Rightarrow Q)}( \ forall x, P \ Rightarrow wlp (S, Q)) \ \ Leftrightarrow \ (\ forall x, sp (S, P) \ Rightarrow Q)

Например, при назначении мы имеем:

sp (Икс: = E, R) знак равно ∃ Y, x = E [x ← y] ∧ R [x ← y] {\ displaystyle sp (x: = E, R) \ = \ \ существует y, x = E [x \ leftarrow y] \ wedge R [x \ leftarrow y]}sp (x: = E, R) \ = \ \ существует y, x = E [x \ leftarrow y] \ wedge R [x \ leftarrow y]

где y свежий

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

sp (x: = x - 5, x>15) = ∃ y, x = y - 5 ∧ y>15 ⇔ x>10 {\ displaystyle sp (x: = x-5, x>15) \ = \ \ существует y, x = y-5 \ wedge y>15 \ \ Leftrightarrow \ x>10}sp(x:=x-5,x>15) \ = \ \ exists y, x = y-5 \ wedge y>15 \ \ Leftrightarrow \ x>10

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

sp (S 1; S 2, R) = sp (S 2, sp (S 1, R)) {\ displaystyle sp ( S_ {1}; S_ {2} \, \ R) \ = \ sp (S_ {2}, sp (S_ {1}, R))}sp (S_ {1}; S_ {2} \, \ R) \ = \ sp (S_ {2}, sp (S_ {1}, R))

Преобразователи предикатов Win и sin

Лесли Лэмпорт предложил win и sin в качестве преобразователей предикатов для параллельного программирования.

Свойства преобразователей предикатов

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

Монотонный

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

(∀ x, P ⇒ Q) ⇒ (∀ x, T (P) ⇒ T (Q)) {\ displaystyle (\ forall x, P \ Rightarrow Q) \ Rightarrow (\ forall x, T (P) \ Rightarrow T (Q))}(\ forall x, P \ Rightarrow Q) \ Rightarrow (\ forall x, T (P) \ Rightarrow T (Q))

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

Строгий

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

T (false) ⇔ false {\ displaystyle T (\ mathbf {false}) \ \ Leftrightarrow \ \ mathbf {false}}T ({\ mathbf {false}}) \ \ Leftrightarrow \ {\ mathbf {false}}

Для Например, wp является строгим, тогда как wlp обычно нет. В частности, если оператор S не может завершиться, то w l p (S, f a l s e) {\ displaystyle wlp (S, \ mathbf {false})}wlp (S, {\ mathbf {false}}) является выполнимым. У нас есть

wlp (whiletruedoskipdone, false) ⇔ true {\ displaystyle wlp (\ mathbf {while} \ \ mathbf {true} \ \ mathbf {do} \ \ mathbf {skip} \ \ mathbf {done}, \ mathbf {false}) \ \ Leftrightarrow \ mathbf {true}}wlp ({\ mathbf {while}} \ {\ mathbf {true}} \ {\ mathbf {do}} \ {\ mathbf {skip}} \ {\ mathbf {done}}, {\ mathbf {false}}) \ \ Leftrightarrow {\ mathbf {true}}

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

Завершение

Преобразователь предикатов T завершение iff:

T (true) ⇔ true {\ displaystyle T (\ mathbf {true}) \ \ Leftrightarrow \ \ mathbf {true}}T ({\ mathbf { true}}) \ \ Leftrightarrow \ {\ mathbf {true}}

Фактически, эта терминология имеет смысл только для строгих преобразователей предикатов: действительно, wp (S, true) {\ displaystyle wp (S, \ mathbf {true})}wp (S, {\ mathbf {true}}) является самым слабым предварительным условием, обеспечивающим прекращение S.

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

Конъюнктив

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

T (P ∧ Q) ⇔ (T (P) ∧ T (Q)) {\ displaystyle T (P \ wedge Q) \ \ Leftrightarrow \ (T (P) \ wedge T (Q))}T (P \ wedge Q) \ \ Leftrightarrow \ (T (P) \ wedge T (Q))

Это относится к wp (S,.) {\ displaystyle wp (S,.)}wp (S,.) , даже если оператор S недетерминирован как оператор выбора или оператор спецификации.

Дизъюнктивный

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

T (P ∨ Q) ⇔ (T (P) ∨ T (Q)) {\ displaystyle T (P \ vee Q) \ \ Leftrightarrow \ (T (P) \ vee T (Q))}T (P \ vee Q) \ \ Leftrightarrow \ (T (P) \ vee T (Q))

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

S = iftrue → x: = 0 [] true → x: = 1 fi {\ displaystyle S \ = \ \ mathbf {if} \ \ mathbf {true} \ rightarrow x: = 0 \ [\!] \ \ mathbf {true} \ rightarrow x: = 1 \ mathbf {fi}}S \ = \ {\ mathbf {if}} \ {\ mathbf {true}} \ rightarrow x: = 0 \ [\!] \ {\ mathbf {true}} \ rightarrow x: = 1 \ {\ mathbf {fi}}

Затем wp (S, R) {\ displaystyle wp (S, R)}wp (S, R) сводится к формуле R [x ← 0] ∧ R [x ← 1] {\ displaystyle R [x \ leftarrow 0] \ wedge R [x \ leftarrow 1]}R [x \ leftarrow 0] \ wedge R [x \ leftarrow 1] .

Следовательно, wp (S, x = 0 ∨ x = 1) {\ displaystyle wp (S, \ x = 0 \ vee x = 1)}wp (S, \ x = 0 \ vee x = 1) сводится к тавтологии (0 знак равно 0 ∨ 0 знак равно 1) ∧ (1 знак равно 0 ∨ 1 = 1) {\ Displaystyle (0 = 0 \ vee 0 = 1) \ клин (1 = 0 \ vee 1 = 1)}(0 = 0 \ vee 0 = 1) \ wedge (1 = 0 \ vee 1 = 1)

Принимая во внимание, что формула wp (S, x = 0) ∨ wp (S, x = 1) {\ displaystyle wp (S, x = 0) \ vee wp (S, x = 1)}wp (S, x Знак равно 0) \ vee wp (S, x = 1) сводится к неверному утверждению (0 = 0 ∧ 1 = 0) ∨ (1 = 0 ∧ 1 = 1) {\ displaystyle (0 = 0 \ wedge 1 = 0) \ vee (1 = 0 \ wedge 1 = 1)}(0 = 0 \ клин 1 = 0) \ ve e (1 = 0 \ wedge 1 = 1) .

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

S = true | {\ Displaystyle S \ = \ \ mathbf {true} \ |}S \ = \ {\ mathbf {true}} \ | @у. y ∈ {0, 1} → x: = y {\ displaystyle y. \ y \ in \ {0,1 \} \ rightarrow x: = y}y. \ Y \ in \ {0,1 \} \ rightarrow x: = y
Приложения
  • В основном используются вычисления самых слабых предварительных условий для статической проверки утверждений в программах с помощью средства доказательства теорем (например, SMT-решателей или помощников по доказательству ): см. Frama-C или ESC / Java2.
  • В отличие от многих других семантических формализмов, семантика преобразователя предикатов не разрабатывалась как исследование основ вычислений. Скорее, он был предназначен для того, чтобы предоставить программистам методологию разработки своих программ как «правильных по построению» в «стиле вычислений». Этот «нисходящий» стиль пропагандировали Дейкстра и Н. Вирт. Он был формализован Р.-Дж. Вернемся к и другим в исчислении уточнения. Некоторые инструменты, такие как B-Method, теперь предоставляют автоматизированное рассуждение для продвижения этой методологии.
  • В мета-теории логики Хоара, самые слабые предварительные условия появляются как ключевое понятие в доказательстве относительной полноты.
Помимо преобразователей предикатов

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

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

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

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

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

См. Также
Примечания
Ссылки
Последняя правка сделана 2021-06-02 04:28:56
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте