Quão difícil é reduzir a terminação à correção parcial?

14

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.

Radu GRIGore
fonte
Deixe-me verificar se eu entendo isso. O que você está solicitando nos daria, entre outras coisas, um algoritmo que utiliza um programa que calcula uma função recursiva total e produz uma prova de uma afirmação de que a função é total (na forma de funções variantes e provas de que são adequadas )? Isso me parece muito desconfortável.
Andrej Bauer
Andrej, isso me parece incontestável. O que estou pedindo é uma prova de que é incontestável.
Radu GRIGore

Respostas:

7

Uma maneira de responder a isso é considerar a complexidade computacional dos problemas de decisão para as classes de consultas parciais de correção e finalização que são conhecidas por serem decidíveis. A interpretação abstrata usando o domínio poliédrico pode inferir as anotações de correção parcial mencionadas nos casos em que as anotações necessárias são conjunções de desigualdades lineares. O cálculo da pós-condição abstrata é exponencial no número de variáveis. Depois, há a sobrecarga de encontrar o ponto fixo. Veja os primeiros documentos de Cousot para saber mais sobre isso e a biblioteca de aventais, se você quiser brincar diretamente com ele.

Encontrar funções variantes é decidível quando as funções variantes são lineares. Não consegui encontrar uma caracterização completa da complexidade disso, mas "Rescisão de programas lineares" de Tiwari tem uma seção que discute a complexidade. Veja também "Um método completo para a síntese de funções de classificação lineares" de Podelski e Rybalchenko. Além disso, Byron Cook fez um trabalho para alavancar a interpretação abstrata para ajudar a construir argumentos de terminação. Consulte, por exemplo, "Classificando abstrações" e "Análises de variância de análises de invariância". Isso pode fornecer uma visão mais detalhada da relação entre correção parcial e rescisão.

Ligações:

Stephen Magill
fonte
1
Espero que você não se importe em editar sua resposta e ativar os links.
Andrej Bauer
4

Há uma redução óbvia da não terminação necessária para a correção parcial, a saber:

P nunca termina quando iniciado em um estado inicial satisfazendo φ se { { }} P {false} é válido.

Estou ciente de que essa é outra não resposta. Sua vantagem é que é mais curto que os acima.

Kai
fonte
3

Existe uma tecnologia padrão - geralmente indecidível, é claro - para preencher seu gráfico com suas pré e pós-condições, ou seja, a semântica de pré-condição liberal mais fraca , que é uma forma de semântica de transformador de predicado que fornece pré-condições mais fracas para satisfação da especificação ou não. -terminação. Essa é essencialmente uma teoria completa da correção parcial para essas linguagens e, de fato, a correção total

É o giz e o queijo que decidem qual a terminação e a correção parcial é onde está o trabalho duro, pois ambos são tão indecidíveis. Mas a correção parcial está atrapalhada com os problemas de design da linguagem, tanto para as linguagens de programa quanto para as especificações, enquanto a dificuldade da terminação é clara: para qualquer teoria usada para provar a terminação, haverá algoritmos que terminam, mas que comprovadamente terminam relativo. a essa teoria. Por exemplo, os cálculos no cálculo lambda polimórfico puro devem terminar, mas a aritmética Peano não pode provar isso.

Minha impressão é que o trabalho sobre interpretação abstrata, iniciado por Patrick Cousot, foi o mais dinâmico nessa área, mas não pretendo ser um especialista.

Charles Stewart
fonte
Eu estava tentando perguntar sobre a complexidade de inferir funções variantes. Desculpe por não ser claro! Como curiosidade, Rustan Leino apresentou um exemplo na noite passada (em um pub) que me sugeriu fortemente que o wlp não funciona tão bem quanto o wp & sp para o tipo de programas que descrevo aqui. Vou ter que verificar novamente quando eu chegar a um lugar mais adequado para o trabalho :)
Radu Grigore
@Radu: Há um trabalho feito em provas de terminação automática, com um bom trabalho sendo feito para o Prolog. Eu posso desenterrar alguns árbitros quando encontro tempo.
Charles Stewart