Essa não é uma resposta geral para sua pergunta, mas pelo teorema da programação estruturada , tudo o que é necessário é a capacidade de fazer seleção (por exemplo, if
em C / C ++) e repetição (por exemplo, while
em C / C ++). Edit: como apontado por Dave Clarke nos comentários, o teorema da programação estruturada também requer sequência. Inicialmente, não listei isso, pois considerava que o leitor entenderia que também são necessários blocos básicos de outras instruções, como as mencionadas posteriormente para leitura e gravação no armazenamento de memória etc.). É claro que é melhor ser explícito; você precisa ser capaz de fazer essas coisas também.
Como ambos podem ser implementados usando uma instrução de salto condicional (por exemplo, JNZ
em x86), isso também é suficiente para a equivalência de Turing.
Observe que outras coisas são necessárias, ou seja, a capacidade de escrever um número ilimitado de símbolos (por exemplo, bits ... 0 ou 1) em algum tipo de armazenamento de memória externa. Nesse sentido, computadores reais não são equivalentes a Turing, pois nenhum deles possui uma quantidade infinita de armazenamento. O modelo de Turing ainda é útil, já que a quantidade de memória é geralmente enorme e, mesmo que qualquer problema que um computador real possa resolver possa ser resolvido por um autômato finito determinístico, o uso desse modelo de computação não é particularmente útil (uma vez que o número de estados seria absurdamente enorme).
Observe que isso não está necessariamente em desacordo com a resposta de sepp2k; essa é apenas uma maneira diferente de pensar sobre a mesma pergunta.
EDITAR:
Observe também que você realmente não precisa de ambos if
e while
em C / C ++. Você pode simular if
usando while
o seguinte:
bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program
O código a seguir é sempre equivalente:
bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program
Bem ... a construção deve funcionar e ser possível se você for cuidadoso. Observe também que, se você tiver funções recursivas, também precisará de seleção; como as funções recursivas sem seleção não podem realmente implementar casos base, então qualquer função recursiva resultaria em recursão infinita.
EDITAR:
Além disso, com relação à sua pergunta sobre se a capacidade de escrever um programa que não interrompe é suficiente para a equivalência de Turing, a resposta é não; é necessário, mas não suficiente. Podemos resolver o problema da parada de programas escritos em um idioma que não pode expressar programas que não são interrompidos; a resposta é "o programa pára" para todas as instâncias. No entanto, podemos definir um idioma em que a única instrução faz com que a máquina entre em um loop infinito ... esse idioma não é equivalente a Turing.