Note que, embora eu saiba programar, sou bastante iniciante na teoria do CS.
De acordo com esta resposta
Turing completude é um conceito abstrato de computabilidade. Se um idioma é Turing completo, ele é capaz de fazer qualquer cálculo que qualquer outro idioma completo de Turing possa fazer.
E qualquer programa escrito em qualquer idioma completo de Turing pode ser reescrito em outro .
Está bem. Isso faz sentido. Posso traduzir (compilar) C em Assembly (e faço isso todos os dias!) E traduzir o Assembly em C (você pode escrever uma máquina virtual em C). E o mesmo se aplica a qualquer outro idioma - você pode compilar qualquer idioma no Assembly e executá-lo em uma VM escrita em outro outro idioma.
Mas qualquer programa escrito em um idioma completo de Turing pode ser reescrito em outro?
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.
Está bem. Então você dirá que, como estamos lidando com a teoria dos computadores , não estamos discutindo limitações de dispositivos físicos.
Mas e um dispositivo que não tem multiplicação? divisão? Que eu saiba (embora isso seja mais uma pergunta para math.SE), não se pode emular multiplicação (e definitivamente não divisão) com adição e subtração [1].
Então, como um "idioma completo completo" (que pode adicionar, subtrair e pular) emularia outro idioma que pode adicionar, subtrair, multiplicar e pular?
EDITAR
[1] Em números reais arbitrários.
Respostas:
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
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 y s 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:
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.
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.
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:
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. Osendmail
arquivo de configuração é Turing-complete. O Intel x86 MMU é Turing-complete. AMOV
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. Asmod_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.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.
fonte
Claro que você pode implementar a multiplicação com adição e subtração:
O fato de você provavelmente não fazer isso não torna menos possível.
Divisão é dificilmente mais difícil:
E como você acha que a multiplicação e a divisão são realmente realizadas pelos circuitos da CPU? Dica: não é uma tabela de pesquisa enorme. É mais eficiente do que o anterior, pois a troca de bits também é usada, mas é fundamentalmente implementada em termos de adição e subtração.
fonte
Nenhuma máquina física (realmente existente) é ou pode ser completa em Turing, porque a perfeição em Turing exige armazenamento infinito e o universo não é infinito.
Daqui resulta que a resposta afirmativa para se duas máquinas abstratas são equivalentes não ajuda a responder à pergunta se duas aproximações físicas dessas máquinas são equivalentes.
Portanto, a equivalência de Turing dos modelos abstratos de (por exemplo) duas linguagens não significa que cada uma pode calcular tudo o que a outra pode computar na prática. Um pode enfrentar limitações físicas antes do outro.
fonte
De fato, as operações "adicionar 1", "subtrair 1" e "salto condicional se um registro especificado for zero" são suficientes para tornar um modelo computacional completo de Turing (consulte a máquina de 2 contadores como referência para um modelo computacional muito mínimo de Turing).
fonte
tl; dr - Máquinas de Turing são apenas uma descrição lógica básica para a operação de um sistema lógico geral. Eles podem fazer a maioria das coisas que podemos descrever, incluindo chamar opcodes especializados e operações matemáticas construídas.
Em um modelo de Turing, símbolos como um
LIGHTBUTTON
código de operação são apenas cadeias de caracteres em qualquer alfabeto que o computador de Turing use.Portanto, a máquina de Turing seria responsável por produzir a string
"LIGHTBUTTON"
ou algum valor inteiro que corresponda ao código de operação; se uma entidade externa age ou não sobre ela, não é da conta do computador de Turing.Programas C têm a mesma limitação.
LIGHTBUTTON
Ou seja, um programa C só pode chamar o código de operação , no entanto, se a CPU efetua ou não uma operação associada a esse código de operação depende da CPU.Sim, uma máquina de Turing poderia fazer essas coisas, mesmo em números reais, na medida em que qualquer lógica descritiva por humanos pudesse. A máquina de Turing pode ser tão simples quanto a automação celular da Regra 110 .
O truque é construir um sistema lógico a partir de qualquer física que a máquina tenha naturalmente. Por exemplo, as CPUs principais podem fazer multiplicação e divisão porque possuem unidades lógicas aritméticas (ALU) . Mas as ULAs não são mágicas; eles são apenas portas lógicas simples . E esses portões lógicos são feitos de transistores . E esses transistores são feitos de areia dopada .
Portanto, para obter um dispositivo completo de Turing para fazer contas, basta programar dessa maneira.
fonte
Se a entrada para o programa for uma sequência de bits arbitrariamente longa e a saída também for uma sequência de bits arbitrariamente longa, então YES. Supondo que você tenha tempo e energia para reescrevê-lo e que não se importe com o desempenho e que tenha memória física suficiente para ambas as implementações.
As considerações práticas que significam duas linguagens completas de Turing não são intercambiáveis incluem:
eles suportam diferentes tipos de entrada e saída (por exemplo, acesso ao banco de dados SQL)
eles têm diferentes bibliotecas de tipos de dados (por exemplo, suporte para strings Unicode)
eles fornecem diferentes paradigmas de programação otimizados para diferentes tarefas (por exemplo, objetos, threads, corotinas, funções de primeira classe)
eles fornecem bibliotecas de funções diferentes (por exemplo, análise e serialização de XML)
fonte
Não. Turing-completeness não tem nada a ver com programas , trata-se de funções matemáticas (ou algoritmos ). Qualquer algoritmo - qualquer cálculo - você pode fazer em C, em qualquer outra linguagem completa de Turing (isso deve ser óbvio). Mas a integridade de Turing na verdade não diz que você pode executar E / S - de maneira alguma. Ele não fala sobre o hardware. Apenas os cálculos.
Você pode estender uma linguagem Turing-completo com qualquer operação de hardware que você quer (tecnicamente, é assim
fputc
efgetc
trabalho em C). Se você pegar duas linguagens completas de Turing e as estender com operações específicas de hardware idênticas , elas permanecerão intercambiáveis. Portanto, sua linguagem assembly comLIGHTBULB
operação é mais poderosa que a completa Turing; você poderia dizer que é Turing completoLIGHTBULB
. Para tornar qualquer outro idioma idêntico a ele, ele também precisa estar completo em TuringLIGHTBULB
; a maneira mais fácil de fazer isso é adicionar umaLIGHTBULB
primitiva / instrução / função / etc. a ela.É por isso que as implementações C geralmente oferecem suporte ao assembler embutido ou documentam uma maneira de chamar funções escritas no assembler, e porque implementações de outras linguagens geralmente fornecem uma maneira de chamar funções escritas em C.
fonte