Hoare logic - total correção de loops

7

Considere um loop while do formulário:

enquanto (C) {S}

com a condição e o corpo do loop.CS

Seja Eu e V respectivamente, uma invariável e uma variante desse loop. A regra para a correção total dos loops while é dada no meu livro por:

Se EuV0 0

E [EuCV=v0 0]S[EuV<v0 0]

Então [Eu]enquanto (C) {S}[Eu¬C]

Pelo que acho que entendi, para que o loop termine, a variante V deve diminuir estritamente e também deve ser delimitada por zero. No entanto, quando traduzo isso matematicamente, obtenho uma proposição diferente daquela do meu livro:

[V0 0V=v0 0]S[V0 0V<v0 0]

Minha pergunta : esta última proposição e a regra do meu livro estão dizendo a mesma coisa sobre o que precisa ser comprovado para que o loop termine? Em outras palavras: é

[EuCV0 0V=v0 0]S[EuV0 0V<v0 0]

o mesmo que

EuV0 0 junto com[EuCV=v0 0]S[EuV<v0 0]

Por que ou por que não?

Dory
fonte
A afirmação de que "𝚅 deve diminuir estritamente e que também deve ser delimitada por zero" é suficiente é enganosa. Você também precisa que 𝚅 seja uma função com um alcance bem fundamentado. Imagine usar os números racionais não negativos e construa um contra-exemplo.
Kai

Respostas:

4

Eles são equivalentes, no sentido de que toda vez que você pode aplicar a regra do livro didático, também pode aplicar sua própria regra e vice-versa. O invariante para as duas regras é semelhante, mas não é o mesmo.

Convertendo uma instância de regra de livro didático em uma instância de sua regra

Suponha que tenhamos uma aplicação ou sua regra de livro didático. seja, encontramos alguns para os quais:I

IV0 junto com[ICV=v0]S[IV<v0]

Então, graças à implicação acima, também temos . Usando a regra PrePost, podemos reescrever a invariante em seu equivalente e obtemos uma aplicação da sua regra:IIV0

[ICV0V=v0]S[IV0V<v0]

Aqui, usamos o mesmo invariante da regra do livro.

Convertendo uma instância de sua regra em uma instância de regra de livro didático

Agora, para a direção inversa. Suponha que encontramos para sua regra:I

[ICV0V=v0]S[IV0V<v0]

Agora, não podemos assumir , portanto, não podemos usar para a regra do livro didático. No entanto, podemos usar como um novo invariante . Nós trivialmente temos por construção (*). Além disso, a partir da hipóteseIV0II:=IV0IV0

[ICV0V=v0]S[IV0V<v0]

podemos obter (pelo PrePost)

[ICV=v0]S[IV<v0] (**)

As propriedades (*) e (**) são exatamente o que precisamos para aplicar a regra do livro.

chi
fonte