Aqui está uma pergunta da "faixa B", se é que alguma vez houve. Resumo: a primeira coisa que penso quando tento dar uma semântica a programas não determinísticos resulta em uma semântica em que não posso provar coisas sobre loops que terminam apenas de forma não determinística. Certamente alguém descobriu o que fazer nessa situação, ou pelo menos apontou que é difícil, mas não sei como procurá-la (daí a tag "solicitação de referência").
fundo
Eu quero modelar uma linguagem while com não-determinismo. Acho que essa é a maneira óbvia (ou pelo menos ingênua) de modelar essa linguagem com um domínio de poder Smyth, mas me corrija se eu estiver errado. Modelaremos o significado de um comando nessa linguagem como uma função cujo domínio é o conjunto de estados e cujo código-fonte é o conjunto , em que é o elemento menos representativo da não terminação e é o conjunto de estados dos estados.P ( S ) ⊥ = { ⊥ } ∪ P ( S ) ⊥ P ( S )
Interpretamos comandos como mapas de states para o evento sem término ou para conjuntos de estados que representam possíveis resultados. é uma escolha não determinística.
- se , caso contrário
- se ou , caso contrário,
- se ou para alguns , caso contrário
Existe uma ordem parcial completa direcionada , em que para qualquer e se e forem conjuntos adequados e , e podemos estender isso para funções de para pointwise: se para cada , e é a função que mapeia todos os estados para .
O significado de um loop é é o limite superior mínimo da cadeia , onde se , caso contrário se ou para alguns , caso contrário . (Esta definição pressupõe que o I acabou de definir é Scott contínua, mas eu acho que é seguro para deixar isso de lado.)
Questão
Considere este programa:
Intuitivamente, este é um loop que pode retornar qualquer número par positivo ou não terminar, e que corresponde ao que podemos provar sobre esse loop usando a pré-condição liberal mais fraca (é possível mostrar que é um loop invariante). No entanto, como o loop tem a capacidade de não terminar (podemos refinar a escolha não determinística pelo programa que sempre assume o ramo direito), o significado desse programa, dado qualquer estado inicial, é . (Menos informalmente: a função que mapeia qualquer estado em que é falso para si mesmo e qualquer estado em que é verdadeiro para é um ponto fixo de usado para definir o loop.)
Isso significa que a semântica ingênua que propus não corresponde da maneira que espero ser capaz de raciocinar sobre os programas. Eu culpo minha semântica, mas não como corrigi-las.