Por que as funções totais não são enumeráveis?


29

Aprendemos sobre o conceito de enumerações de funções. Na prática, eles correspondem a linguagens de programação.

Em uma observação de passagem, o professor mencionou que a classe de todas as funções totais (ou seja, as funções que sempre terminam para cada entrada) não é enumerável. Isso significaria que não podemos conceber uma linguagem de programação que nos permita escrever todas as funções totais, mas nenhuma outra --- o que seria bom ter!

Então, como é que nós (aparentemente) temos que aceitar o potencial de não terminação se queremos poder computacional decente?

Respostas:


24

Por causa da diagonalização. Se fosse uma enumeração computável de todas as funções computáveis ​​totais de N a N , de modo que todo f e fosse total, então g ( i ) = f i ( i ) + 1 também seria um total computável função, mas não estaria na enumeração. Isso contradiz as suposições sobre a sequência. Portanto, nenhuma enumeração computável de funções pode consistir exatamente no total de funções computáveis.(fe:eN)NNfeg(Eu)=fEu(Eu)+1

Suponha que pensemos em uma função computável universal , onde "universal" significa h é uma função binária computável e que para cada função unária computável total f ( n ) há alguns e tais que f ( i ) = h ( e , i ) para todos os i . Então também deve haver alguns e tais que g ( n ) = h ( e ,h(e,Eu)hf(n)ef(Eu)=h(e,Eu)Eueg(n)=h(e,n)não é uma função total, devido ao parágrafo anterior. Caso contrário, daria uma enumeração computável do total de funções unárias computáveis ​​que inclui todas as funções unárias computáveis ​​totais.h

Assim, o requisito de que toda função é um sistema de funções é total é incompatível com a existência de uma função universal nesse sistema. Para alguns sistemas fracos, como as funções recursivas primitivas, todas as funções são totais, mas não existem funções universais. Sistemas mais fortes que possuem funções universais, como a computabilidade de Turing, simplesmente precisam ter funções parciais para permitir a existência da função universal.


Eu só queria acrescentar que alguém encontrou o que parece ser uma brecha na diagonalização. Se você usar uma representação digitada para o programa, poderá usar o sistema de tipos para desabilitar a diagonalização e criar um auto-intérprete total. Consulte Rompendo a barreira da normalização: um auto-intérprete para o F-ômega para obter detalhes.
hatch22

Obviamente, o Sistema F não é um sistema completo de Turing. O artigo que você vinculou é interessante; parece que eles conseguem alavancar a não-Turing-completude de uma maneira interessante.
Carl Mummert

g(Eu)=fEu(Eu)+1gk,fk=gg(k) requires evaluating g(k)=fk(k)+1=g(k)+1gg
AGEMO

E mesmo usando uma diagonal deslocada para evitar esse problema parece levar a contradições.
AGEMO

10

Só para esclarecer, precisamos distinguir funções matemáticas (eu as chamarei de funções e muitas vezes existem inúmeras delas para que não sejam de todo enumeráveis) e funções que você pode escrever: eu as chamarei de programas ou também de funções computáveis .

SExExSxSS

O conjunto de todos os programas que são totais em um conjunto finito é enumerável porque você pode escrever um intérprete que apenas execute o programa em todos os elementos do conjunto finito e retorne "yes" se todos terminarem. (Mas não consigo ver se algum deles não)

Seu professor disse que o conjunto de todos os programas que são totais em um conjunto infinito não é enumerável porque você não pode simplesmente executar o programa em um número infinito de elementos.

Mas isso não significa que isso é ruim:

  1. Por exemplo, o conjunto se todos os programas comprovadamente totais forem enumeráveis porque você pode enumerar todas as provas e verificar mecanicamente se elas provam que seu programa é total.

  2. Mesmo um conjunto enumerável não seria prático, pois talvez você precise esperar para sempre sem ter certeza de que o procedimento seria encerrado um dia. Não vejo como usar programas que enumeram todas as funções totais ...

Existem algumas linguagens de programação em que tudo o que você escreve é ​​garantido para terminar apenas com a digitação estática! Existem até alguns que garantem um limite polinomial. Eles são principalmente acadêmicos por enquanto, escrever nesses provavelmente o fará sentir mais as restrições do que escrever em Python, mas há muitos pesquisadores trabalhando nisso.

Então, para responder à sua pergunta: de certa forma, sim. É possível que a não terminação potencial seja completa em Turing (maior poder computacional por enquanto). Mas não acho isso diretamente relevante ao fato de que o total de funções é enumerável ou não. Você ainda pode escrever todos os programas totais!


2
"porque você não pode simplesmente executar seu programa em um número infinito de elementos" - este é um argumento fraco, pois talvez eu não precise fazer isso se puder recuperar todas as informações necessárias do próprio programa. Veja aqui uma pergunta que ilustra o perigo do seu raciocínio.
Raphael

De fato. Não afirmei que fosse uma prova (como sempre é necessário criar um argumento diagonal) e talvez eu não devesse ter usado a palavra "porque". Eu estava tentando responder à sua pergunta, que (pensei) não era uma prova da afirmação do seu professor, mas sobre por que a terminação entra em conflito com o poder computacional.
Jmad
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.