A perfeição de Turing diz uma coisa e apenas uma coisa: um modelo de computação é Turing-complete, se qualquer computação que pode ser modelada por uma Máquina de Turing também pode ser modelada por esse modelo.
Então, quais são os cálculos que uma máquina de Turing pode modelar? Bem, acima de tudo, Alan Turing e todos os seus colegas estavam sempre interessados em funções em números naturais. Portanto, a Máquina de Turing (e o cálculo λ, o cálculo combinador SK, funções urs-recursivas, ...) falam apenas sobre a computabilidade das funções em números naturais. Se você não está falando sobre uma função em números naturais, o conceito de completeza de Turing nem faz sentido, simplesmente não é aplicável.
Observe, no entanto, que podemos codificar muitas coisas interessantes como números naturais. Podemos codificar strings como números naturais, podemos codificar gráficos como números naturais, podemos codificar booleanos como números naturais. Podemos codificar as Máquinas de Turing como números naturais, o que nos permite criar Máquinas de Turing que falam sobre Máquinas de Turing!
E, é claro, nem todas as funções em números naturais são computáveis. Uma máquina de Turing pode computar apenas algumas funções em números naturais, o cálculo λ pode calcular apenas algumas funções em números naturais, o cálculo combinador SK pode calcular apenas algumas funções em números naturais,…. Surpreendentemente (ou não), verifica-se que todo modelo de computação (que é realmente realizável em nosso universo físico) pode computar as mesmas funções em números naturais (pelo menos para todos os modelos que encontramos até agora). [Nota: obviamente, existem modelos mais fracos de computação, mas ainda não encontramos um que seja mais forte, exceto alguns que são obviamente incompatíveis com o nosso universo físico, como modelos usando números reais ou viagens no tempo.]
Esse fato, que depois de muito tempo pesquisando muitos modelos diferentes, descobrimos, todas as vezes, que eles podem calcular exatamente as mesmas funções, é a base da Tese da Igreja-Turing, que diz (grosso modo) que todos modelos de computação são igualmente poderosos, e todos eles capturam a noção "ideal" do que significa ser "computável". (Há também um segundo aspecto mais filosófico dos CTT, a saber, que um ser humano seguindo um algoritmo também pode calcular exatamente as mesmas funções que uma MT pode calcular e não mais.)
No entanto , nada disso diz algo sobre
- quão eficientes são os vários modelos
- quão conveniente eles são usar
- o que mais eles podem fazer além de funções de computação nos números naturais
E que é precisamente onde as diferenças entre diferentes modelos de computação (e linguagens de programação) entram em jogo.
Como exemplo de desempenho diferente, uma máquina de acesso aleatório e uma máquina de Turing podem copiar uma matriz. Porém, uma RAM precisa de operações para fazer isso, enquanto uma TM precisa de operações , pois precisa pular os elementos da matriz para copiar cada elemento e existem elementos para copiar.O ( s i z e 2 a r r a y ) s i z e a r r a y s i z e a r r a yO ( s i zea r r a y)O ( s i ze2a r r a y)s i zea r r a ys i zea r r a y
Como exemplo de conveniência diferente, você pode comparar o código escrito em uma linguagem de alto nível, o código escrito em assembly e a descrição de uma TM para resolver o mesmo problema.
E seu interruptor de luz é um exemplo do terceiro tipo de diferença, coisas que alguns modelos podem fazer que não funcionam em números naturais e, portanto, não têm nada a ver com a perfeição de Turing.
Para responder suas perguntas específicas:
Mas qualquer programa escrito em um idioma completo de Turing pode ser reescrito em outro?
Não. Somente se o programa computar uma função computável de Turing em números naturais. E mesmo assim, pode precisar de uma codificação complexa. Por exemplo, o cálculo λ nem sequer possui números naturais, eles precisam ser codificados usando funções (porque funções é a única coisa que o cálculo λ possui).
Essa codificação da entrada e da saída pode ser muito complexa, assim como a expressão do algoritmo. Portanto, embora seja verdade que qualquer programa pode ser reescrito, o programa reescrito pode ser muito mais complexo, muito maior, usar muito mais memória e muito mais lento.
E se minha montagem tiver um código de operação LIGHTBUTTON? Fisicamente, não posso emular esse idioma em um sistema (idioma) sem uma lâmpada.
Uma lâmpada não é uma função computável de Turing em números naturais. Realmente, uma lâmpada não é uma função nem uma computação. Ligar e desligar uma lâmpada é um efeito colateral de E / S. As máquinas de Turing não modelam efeitos colaterais de E / S e a conclusão de Turing não é relevante para eles.
Em números reais arbitrários.
A perfeição de Turing lida apenas com funções computáveis em números naturais, não se preocupa com números reais.
A perfeição de Turing simplesmente não é muito interessante quando se trata de perguntas como a sua por dois motivos:
- Não é um obstáculo muito alto. Tudo que você precisa é
IF
, GOTO
, WHILE
, e uma variável único inteiro (assumindo que a variável pode conter arbitrariamente grandes números inteiros). Ou recursão. Muitas e muitas coisas estão completas em Turing. O jogo de cartas Magic: The Gathering está completo em Turing. CSS3 é Turing-completo. O sendmail
arquivo de configuração é Turing-complete. O Intel x86 MMU é Turing-complete. A MOV
instrução Intel x86 é Turing-complete. As animações do PowerPoint são completas de Turing. O Excel (sem scripts, usando apenas fórmulas) é Turing-complete. O protocolo de roteamento BGP é Turing-complete. sed
é Turing completo. As mod_rewrite
regras do Apache são completas de Turing. Google for " (acidentalmente ou surpreendentemente) completo"para encontrar outros exemplos interessantes. Se quase tudo estiver completo em Turing, ser completo em Turing deixa de ser uma propriedade interessante.
- Na verdade, não é necessário ser útil. Muitas coisas úteis não são completas para Turing. CSS antes da versão 3 não é Turing-completo (eo fato de que CSS3 é não é realmente usado por qualquer pessoa). O SQL antes de 1999 não era completo para Turing, mas ainda era tremendamente útil. A linguagem de programação C sem bibliotecas adicionais não parece estar completa com Turing . As linguagens de tipo dependente são, mais ou menos por definição, não completas para Turing; no entanto, você pode escrever sistemas operacionais, servidores da Web e jogos neles.
Edwin Brady, autor de Idris, usa o termo "Tetris-complete" para falar sobre alguns desses aspectos. Ser completo com Tetris não é definido rigorosamente (exceto o óbvio "pode ser usado para implementar o Tetris"), mas abrange coisas como ser de alto nível e expressivo o suficiente para que você possa escrever um jogo sem enlouquecer, ser capaz de interagir com o mundo externo (entrada e saída), ser capaz de expressar efeitos colaterais, ser capaz de escrever um loop de eventos, ser capaz de expressar programação reativa, assíncrona e simultânea, ser capaz de interagir com o sistema operacional, ser capaz interagir com bibliotecas estrangeiras (em outras palavras: poder chamar e ser chamado pelo código C) e assim por diante. Essas são características muito mais interessantes de uma linguagem de programação de propósito geral do que a integridade de Turing.
Você pode achar interessante a minha resposta à pergunta que você vinculou , que aborda alguns dos mesmos pontos, embora ela responda a uma pergunta diferente.