Eu acho que a resposta para a primeira pergunta é que geralmente é muito trabalho com as ferramentas atuais. Para entender, sugiro tentar provar a correção do Bubble Sort no Coq (ou se você preferir um pouco mais de desafio, use o Quick Sort). Não acho que seja razoável esperar que os programadores escrevam programas verificados, desde que provar que a correção de tais algoritmos básicos seja tão difícil e demorado.
Essa pergunta é semelhante a perguntar por que os matemáticos não escrevem provas formais verificáveis por verificadores de provas? Escrever um programa com uma prova formal de correção significa provar um teorema matemático sobre o código escrito, e a resposta a essa pergunta também se aplica à sua pergunta.
Isso não significa que não houve casos de sucesso de programas verificados. Eu sei que existem grupos que estão provando a correção de sistemas como o hipervisor da Microsoft . Um caso relacionado é o Verified C Compiler da Microsoft . Mas, em geral, as ferramentas atuais precisam de muito desenvolvimento (incluindo seus aspectos SE e HCI) antes de se tornarem úteis para programadores gerais (e matemáticos).
Em relação ao parágrafo final da resposta de Neel sobre o crescimento do tamanho do programa para linguagens com apenas funções totais, é fácil provar ainda mais (se eu entendi direito). É razoável esperar que a sintaxe de qualquer linguagem de programação seja ce e o conjunto de funções computáveis totais não seja ce; portanto, para qualquer linguagem de programação em que todos os programas sejam totais, há uma função computável total que não pode ser calculada por nenhum programa ( de qualquer tamanho) nesse idioma.
Para a segunda pergunta, eu respondi uma pergunta semelhante no blog de Scott há algum tempo. Basicamente, se a classe de complexidade tem uma boa caracterização e é representável computacionalmente (ou seja, é ce), podemos provar que alguma representação dos problemas na classe de complexidade é comprovadamente total em teorias muito fracas correspondentes à classe de complexidade. A idéia básica é que as funções comprovadamente totais da teoria contenham todas as funções e um problema que é A C 0AC0AC0-completo para a classe de complexidade, portanto, contém todos os problemas na classe de complexidade e pode provar a totalidade desses programas. A relação entre provas e teoria da complexidade é estudada na complexidade da prova; consulte o livro recente de SA Cook e P. Nguyen " Fundamentos lógicos da complexidade da prova ", se você estiver interessado. (Um rascunho de 2008 está disponível.) Portanto, a resposta básica é a de muitas classes "Provably C = C".
Isso não é verdade em geral, pois existem classes de complexidade semântica que não possuem caracterização sintática, por exemplo, funções computáveis totais. Se por recursiva você quer dizer funções recursivas totais, então as duas não são iguais, e o conjunto de funções computáveis que são comprovadamente totais em uma teoria é bem estudado na literatura da teoria da prova e é chamado de funções comprovadamente totais da teoria. Por exemplo: as funções comprovadamente totais de são £ 0 funções -recursive (ou equivalentemente funções no sistema de Gódel T ), as funções comprovadamente totais de P UmPAϵ0T são função no sistema de Girard F , as funções comprovadamente totais dePA2F são funções recursivas primitivas, ....IΣ1
Mas não me parece que isso signifique muito no contexto de verificação de programas, pois também existem programas que estão computando extensionalmente a mesma função, mas não podemos provar que os dois programas estão computando a mesma função, ou seja, os programas são extensionalmente iguais, mas não intencionalmente. (Isso é semelhante à Estrela da Manhã e à Estrela da noite.) Além disso, é fácil modificar um determinado programa comprovadamente total para obter um programa que a teoria é incapaz de provar sua totalidade.
Eu acho que as duas perguntas estão relacionadas. O objetivo é obter um programa verificado. Um programa verificado significa que o programa atende a uma descrição, que é uma declaração matemática. Uma maneira é escrever um programa em uma linguagem de programação e, em seguida, provar suas propriedades como satisfaz a descrição, que é a prática mais comum. Outra opção é tentar provar a afirmação matemática que descreve o problema usando meios restritos e depois extrair um programa verificado. Por exemplo, se provarmos na teoria correspondente a que, para qualquer número dado n, existe uma sequência de números primos cujo produto é igual a n , podemos extrair um PPnnPalgoritmo para fatoração da prova. (Também existem pesquisadores que tentam automatizar a primeira abordagem o máximo possível, mas verificar propriedades interessantes não triviais dos programas é computacionalmente difícil e não pode ser completamente verificado sem falsos positivos e negativos.)