Ce n'est pas une réponse générale à votre question, mais selon le théorème de programmation structurée , tout ce dont vous avez besoin est la capacité de faire une sélection (par exemple, if
en C / C ++) et une répétition (par exemple, while
en C / C ++). Edit: comme l'a souligné Dave Clarke dans les commentaires, le théorème de la programmation structurée requiert également une séquence. Au départ, je ne l'avais pas énuméré, car je pensais que le lecteur comprendrait que des blocs d'instructions de base, tels que ceux mentionnés plus tard pour lire et écrire dans le magasin de mémoire, étaient également nécessaires). Il vaut évidemment mieux être explicite; vous devez être capable de faire ces choses aussi.
Étant donné que les deux peuvent être implémentés en utilisant une instruction de saut conditionnel (par exemple, JNZ
en x86), cela suffit également pour l'équivalence de Turing.
Notez que d'autres éléments sont nécessaires, à savoir la possibilité d'écrire un nombre illimité de symboles (par exemple, des bits ... 0 ou 1) dans une sorte de mémoire de stockage externe. En ce sens, les ordinateurs réels ne sont pas équivalents à Turing, car aucun d’entre eux n’a une capacité de stockage infinie. Le modèle de Turing est toujours utile, car la quantité de mémoire est généralement énorme, et même si tout problème qu'un ordinateur réel peut résoudre peut être résolu par un automate fini déterministe, l'utilisation de ce modèle de calcul n'est pas particulièrement utile (car nombre d’États serait ridiculement énorme).
Notez que ce n'est pas nécessairement en contradiction avec la réponse de sepp2k; c'est en quelque sorte une façon différente de penser à la même question.
MODIFIER:
Notez également que vous n’avez pas vraiment besoin des deux if
et while
en C / C ++. Vous pouvez simuler en if
utilisant while
comme suit:
bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program
Le code suivant est toujours équivalent:
bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program
Eh bien ... la construction devrait fonctionner et être possible si vous êtes prudent, c'est. Notez également que si vous avez des fonctions récursives, vous aurez éventuellement besoin de la sélection; comme les fonctions récursives sans sélection ne peuvent pas réellement implémenter les cas de base, toute fonction récursive entraînerait une récursion infinie.
MODIFIER:
De plus, en ce qui concerne votre question sur le point de savoir si la capacité à écrire un programme qui ne s’arrête pas est suffisante pour l’équivalence de Turing, la réponse est non. c'est nécessaire, mais pas suffisant. Nous pouvons résoudre le problème d’arrêt des programmes écrits dans une langue qui ne peut pas exprimer des programmes qui ne s’arrêtent pas; la réponse est "le programme s'arrête" pour toutes les instances. Cependant, nous pouvons définir un langage où la seule instruction entraîne la machine à entrer dans une boucle infinie ... un tel langage n'est pas équivalent à Turing.