Considere um loop while do formulário:
com a condição e o corpo do loop.
Seja e 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
E
Então
Pelo que acho que entendi, para que o loop termine, a variante 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:
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: é
o mesmo que
junto com
Por que ou por que não?
fonte
Respostas:
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
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:I⟺I∧V≥0
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
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óteseI⇒V≥0 I I′:=I∧V≥0 I′⇒V≥0
podemos obter (pelo PrePost)
As propriedades (*) e (**) são exatamente o que precisamos para aplicar a regra do livro.
fonte