web-dev-qa-db-fra.com

Comment est célébrité Turing complète

J'essaie d'écrire un peu de code dans Brainfuck, mais je suis tombé sur certains problèmes.

Cela m'a demandé de vous demander comment BrainFuck Turing Turing complète, si je comprends, il contient des moyens complètes, une langue ou une machine peut calculer n'importe quelle fonction.

Qu'est-ce qui me demandait comment, c'est que je n'ai pas été capable de trouver ou de trouver un moyen de trouver le signe d'un numéro. Étant donné que la fonction Signum est une fonction et une machine complète Turing peut calculer toutes les fonctions, comment peut-on être complète de Brainfuck?

La réponse que je recherche est une explication pour laquelle ma déclaration est vraie ou fausse ou un algorithme pouvant calculer le signe d'un nombre.

8
S.Klumpers

En supposant que les "cellules de mémoire" de Brainfuck ont ​​des valeurs minimales et maximales *, il suffit de mettre le numéro dans deux cellules, puis continuez d'incrémenter un et continuez à décrémenter l'autre jusqu'à ce que l'un d'entre eux frappe zéro. Il y a votre algorithme de signe.

Maintenant pour la question générale. "Une machine complète Turing peut calculer toutes les fonctions" n'est pas une excellente définition pour commencer, car "la fonction" est trop vague. Cela vous permettrait de discuter que Brainfuck ne soit pas terminé, car il est impossible d'écrire des serveurs Web et des navigateurs Web, ou que C++ 03 ne soit pas terminé, car il est impossible d'écrire des programmes multi-filetés (sans non- extensions standard).

Apprendre à former formellement la totalité de la complétude de Turcy, c'est quelque chose de mieux tiré d'un manuel sur la théorie du calcul. Mais il existe de nombreuses heuristiques utiles que vous pouvez utiliser dans la pratique, telles que:

  • La ramification conditionnelle est possible dans n'importe quelle langue Turing-Complete.
  • Des boucles qui s'exécutent pour des itérations infiniment de nombreuses itérations ou des itérations finies de nombreuses itérations finies sont possibles dans une langue complète de Turing.
  • Toute langue Turing-Complete peut être utilisée pour écrire un programme nécessitant une mémoire infinte ou une quantité de mémoire arbitraire.
  • Toutes les langues Turing-complètent prennent en charge au moins une sorte d'entrée et de sortie pour leurs programmes.
  • Le problème d'arrêt est insoluble pour toute langue Turing-Complete. En d'autres termes, il est impossible d'écrire un programme capable d'examiner d'autres programmes et de dire avec certitude si elles sont capables d'entrer dans une boucle infinie.

Brainfuck répond à tous ces critères. La plupart des implémentations en matière d'hébergement échouent sans soumission des critères de mémoire, mais cet argument s'applique à toutes les langues de programmation puisque dans les ordinateurs du monde réel ont toujours une mémoire finie.


* Techniquement, la norme non officielle célébrités permet une mise en œuvre "Bignum", et j'ignore également la possibilité de saisir un numéro qui ne correspond pas à une cellule de mémoire pour une implémentation non-Bignum . Mais j'ai décidé de ne pas me nerd-snipe moi-même avec ces problèmes pour le moment; Je suis à peu près sûr qu'ils peuvent être résolus si nous voulions vraiment.

12
Ixrec