Se você estiver familiarizado com a verificação do programa, provavelmente preferirá ler a pergunta antes do plano de fundo . Se você não estiver familiarizado com a verificação do programa, ainda poderá responder a essa pergunta, mas é provável que prefira ler o Plano de fundo primeiro.
fundo
Afirma-se frequentemente que a verificação da correção parcial é indecidível. Para fins de discussão, vamos escolher uma maneira muito específica de tornar essa afirmação precisa, no estilo de Floyd-Hoare. Um fluxograma é um dígrafo com um nó inicial distinto do qual todos os nós são alcançáveis. Um programa é um fluxograma cujos nós são comandos. Existem três tipos de comandos (1) suposições assumem q , (2) afirmações afirmam q e (3) atribuições v: = e. Aqui q é uma fórmula fol (lógica de primeira ordem), e é um termo fol e v é uma variável.
Dizemos que um programa está parcialmente correto quando existe uma maneira de anotar cada nó x com uma pré-condição a (x) e uma pós-condição b (x), de modo que (1) a pré-condição do nó inicial seja válida, (2) { a (x) } x { b (x) } é válida para todos os comandos x , e (3) ( b (x) implica que a (y) ) é válida para todas as arestas de x a y . Aqui, os triplos Hoare são definidos da seguinte forma:
- { p } afirmar q { r } significa que ( p implica ( q e r )) é válido
- { p } assuma q { r } significa que (( p e q ) implica r ) é válido
- { p } v: = e { r } significa que (( p com e substituído por v ) implica r ) é válido
Aqui está um argumento ondulante sobre por que verificar essa correção parcial é indecidível: Depois de preencher alguns a (x) e alguns b (x), é necessário verificar se algumas fórmulas fol são válidas e isso é indecidível.
Uma maneira típica de codificar a terminação com exatidão parcial é adicionar algumas afirmações especiais que dizem essencialmente "desde a última vez que fui executado, houve um progresso em direção à terminação". Essas asserções de progresso devem ser colocadas de forma que todas as caminhadas infinitas no fluxograma (que começam no nó inicial) contenham infinitas asserções de progresso. Para ser mais específico, vamos dizer que as afirmações de progresso sempre tem a forma assert u < v , onde u e v são inteiros positivos, são precedidos pela atribuição u : = f , e são seguidos pela atribuição v : = u . Aqui f é umfunção variante , u é o seu valor atual e v é o seu valor anterior. Agora, como falamos sobre "números inteiros positivos" e os comparamos, precisamos garantir que um pouco mais do que fol esteja disponível: Digamos que a aritmética Peano esteja disponível. (Não me preocupo muito com essa escolha. Fique à vontade para desconsiderar, se for conveniente.) É claro que f pode usar outras funções e constantes mencionadas no programa. (Observe que adicionar suposições no início do programa é equivalente a introduzir axiomas não lógicos.)
Agora, se o programa com afirmações de progresso ainda estiver parcialmente correto, sabemos que o programa original é finalizado.
Questão
Dado um programa de encerramento, parece difícil criar funções variantes para asserções de progresso. Mas quão difícil? (Eu sei que, mesmo com o vasto histórico acima, ainda deixei essa pergunta meio aberta, ou mal definida, dependendo de como você deseja vê-la.)
Em outras palavras: estou procurando uma referência que formalize o problema de reduzir a terminação à correção parcial e, em seguida, diga algo sobre sua complexidade. Uma resposta que faça tudo isso seria bem-vinda.