Esta no es una respuesta general a su pregunta, pero según el teorema de programación estructurada , todo lo que se necesita es la capacidad de hacer selección (por ejemplo, if
en C / C ++) y repetición (por ejemplo, while
en C / C ++). Editar: como señaló Dave Clarke en los comentarios, el teorema de programación estructurada también requiere secuencia. Inicialmente no enumeré esto, dado que daba por sentado que el lector entendería que también eran necesarios bloques básicos de otras instrucciones, como las mencionadas más adelante para leer y escribir en el almacén de memoria, etc. Por supuesto, es mejor ser explícito; también necesitas poder hacer estas cosas.
Dado que ambos pueden implementarse utilizando una instrucción de salto condicional (por ejemplo, JNZ
en x86), eso también es suficiente para la equivalencia de Turing.
Tenga en cuenta que se requieren otras cosas, es decir, la capacidad de escribir un número ilimitado de símbolos (por ejemplo, bits ... 0 o 1) en algún tipo de almacén de memoria externa. En ese sentido, las computadoras reales no son equivalentes a Turing, ya que ninguna de ellas tiene una cantidad infinita de almacenamiento. Sin embargo, el modelo de Turing sigue siendo útil, ya que la cantidad de memoria suele ser enorme, y aunque cualquier problema que una computadora real pueda resolver puede resolverse mediante un autómata finito determinista, usar ese modelo de cálculo no es particularmente útil (ya que número de estados sería ridículamente enorme).
Tenga en cuenta que esto no está necesariamente en desacuerdo con la respuesta de sepp2k; Esta es una forma diferente de pensar sobre la misma pregunta.
EDITAR:
Tenga en cuenta también que realmente no necesita ambos if
y while
en C / C ++. Puede simular if
usando while
lo siguiente:
bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program
El siguiente código siempre es equivalente:
bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program
Bueno ... la construcción debería funcionar y ser posible si tienes cuidado, eso es. Tenga en cuenta también que si tiene funciones recursivas, eventualmente necesita selección también; Como las funciones recursivas sin selección realmente no pueden implementar casos base, cualquier función recursiva daría como resultado una recursión infinita.
EDITAR:
Además, con respecto a su pregunta sobre si la capacidad de escribir un programa que no se detenga es suficiente para la equivalencia de Turing, la respuesta es no; Es necesario, pero no suficiente. Podemos resolver el problema de detención de programas escritos en un lenguaje que no puede expresar programas que no se detienen; la respuesta es "el programa se detiene" para todas las instancias. Sin embargo, podemos definir un idioma donde la única instrucción hace que la máquina entre en un bucle infinito ... tal lenguaje no es equivalente a Turing.