Turing-completeeness dit une chose et une seule chose: un modèle de calcul est Turing-complete, si tout calcul qui peut être modélisé par une machine de Turing peut également être modélisé par ce modèle.
Alors, quels sont les calculs qu'une machine de Turing peut modéliser? Eh bien, d'abord et avant tout, Alan Turing et tous ses collègues n'étaient intéressés que par les fonctions sur les nombres naturels. Ainsi, la machine de Turing (et le λ-calcul, le calcul combinateur SK, les fonctions μ-récursives,…) ne parlent que de la calculabilité des fonctions sur les nombres naturels. Si vous ne parlez pas d'une fonction sur des nombres naturels, alors le concept de Turing-complétude n'a même pas de sens, il n'est tout simplement pas applicable.
Notez, cependant, que nous pouvons encoder beaucoup de choses intéressantes en tant que nombres naturels. Nous pouvons encoder des chaînes en nombres naturels, nous pouvons encoder des graphiques en nombres naturels, nous pouvons encoder des booléens en nombres naturels. Nous pouvons encoder les machines de Turing en nombres naturels, ce qui nous permet de créer des machines de Turing qui parlent de machines de Turing!
Et, bien sûr, toutes les fonctions sur les nombres naturels ne sont pas calculables. Une machine de Turing ne peut calculer que certaines fonctions sur des nombres naturels, le λ-calcul ne peut calculer que certaines fonctions sur des nombres naturels, le calculateur SK combinateur ne peut calculer que certaines fonctions sur des nombres naturels,…. Étonnamment (ou non), il s'avère que chaque modèle de calcul (qui est réellement réalisable dans notre univers physique) peut calculer les mêmes fonctions sur des nombres naturels (au moins pour tous les modèles que nous avons trouvés jusqu'à présent). [Note: évidemment, il existe des modèles de calcul plus faibles , mais nous n'en avons pas encore trouvé un qui soit plus fort, sauf certains qui sont manifestement incompatibles avec notre univers physique, comme les modèles utilisant des nombres réels ou les voyages dans le temps.]
Ce fait, qu'après une longue période de recherche de nombreux modèles différents, nous trouvons, à chaque fois, qu'ils peuvent calculer exactement les mêmes fonctions, est la base de la thèse de Church-Turing, qui dit (grosso modo) que tous les modèles de calcul sont tout aussi puissants et que tous capturent la notion «idéale» de ce que signifie être «calculable». (Il y a aussi un deuxième aspect plus philosophique du CTT, à savoir qu'un humain suivant un algorithme peut également calculer exactement les mêmes fonctions qu'un MT peut calculer et pas plus.)
Cependant , rien de tout cela ne dit rien
- l'efficacité des différents modèles
- à quel point ils sont pratiques à utiliser
- quoi d' autre ils peuvent faire en plus des fonctions de calcul sur les nombres naturels
Et c'est précisément là que les différences entre les différents modèles de calcul (et les langages de programmation) entrent en jeu.
O ( s i zea r r a y)O ( s i ze2a r r a y)s i zea r r a ys i zea r r a y
Par exemple, pour plus de commodité, vous pouvez simplement comparer le code écrit dans un langage de très haut niveau, le code écrit en assembleur et la description d'une MT pour résoudre le même problème.
Et votre interrupteur d'éclairage est un exemple du troisième type de différence, des choses que certains modèles peuvent faire qui ne sont pas des fonctions sur les nombres naturels et n'ont donc rien à voir avec l'exhaustivité de Turing.
Pour répondre à vos questions spécifiques:
Mais n'importe quel programme écrit dans une langue complète de Turing peut-il être réécrit dans une autre?
Non. Seulement si le programme calcule une fonction calculable de Turing sur des nombres naturels. Et même alors, il pourrait avoir besoin d'un encodage complexe. Par exemple, le λ-calcul n'a même pas de nombres naturels, ils doivent être codés à l'aide de fonctions (car les fonctions sont la seule chose que le λ-calcul possède).
Ce codage de l'entrée et de la sortie peut être très complexe, tout comme l'expression de l'algorithme. Ainsi, s'il est vrai que n'importe quel programme peut être réécrit, le programme réécrit peut être beaucoup plus complexe, beaucoup plus volumineux, utiliser beaucoup plus de mémoire et être beaucoup plus lent.
Que faire si mon assemblage a un opcode LIGHTBUTTON? Je ne peux physiquement pas émuler cette langue sur un système (langue) sans ampoule.
Une ampoule n'est pas une fonction calculable de Turing sur les nombres naturels. En réalité, une ampoule n'est ni une fonction ni un calcul. Allumer et éteindre une ampoule est un effet secondaire d'E / S. Les machines de Turing ne modélisent pas les effets secondaires d'E / S et la complétude de Turing ne les concerne pas.
Sur des nombres réels arbitraires.
La complétude de Turing ne concerne que les fonctions calculables sur les nombres naturels, elle ne concerne pas les nombres réels.
Turing-exhausteness n'est tout simplement pas très intéressant quand il s'agit de questions comme la vôtre pour deux raisons:
- Ce n'est pas un obstacle très élevé. Tout ce que vous avez besoin est
IF
, GOTO
, WHILE
et une seule variable entier ( en supposant que la variable peut contenir arbitrairement grands nombres entiers). Ou, récursivité. Beaucoup, beaucoup et beaucoup de choses est Turing-complet. Le jeu de cartes Magic: The Gathering est Turing-complete. CSS3 est Turing-complet. Le sendmail
fichier de configuration est Turing-complete. L'Intel x86 MMU est Turing-complete. L' MOV
instruction Intel x86 est Turing-complete. Les animations PowerPoint sont complètes de Turing. Excel (sans script, utilisant uniquement des formules) est Turing-complete. Le protocole de routage BGP est Turing-complete. sed
est Turing-complet. Les mod_rewrite
règles Apache sont Turing-complete. Google pour " (accidentellement OU étonnamment) turing terminé"pour trouver d'autres exemples intéressants. Si presque tout est Turing-complete, être Turing-complete cesse d'être une propriété intéressante.
- Il n'est pas vraiment nécessaire d'être utile. Beaucoup de choses utiles ne sont pas complètes. CSS avant la version 3 n'est pas complet de Turing (et le fait que CSS3 n'est réellement utilisé par personne). SQL avant 1999 n'était pas Turing-complet, pourtant, il était extrêmement utile même alors. Le langage de programmation C sans bibliothèques supplémentaires ne semble pas être complet de Turing . Les langages typiquement dépendants ne sont pas, par définition, plus ou moins complets pour Turing, mais vous pouvez y écrire des systèmes d'exploitation, des serveurs Web et des jeux.
Edwin Brady, l'auteur d'Idris, utilise le terme "Tetris-complete" pour parler de certains de ces aspects. Être complet avec Tetris n'est pas défini de manière rigoureuse (à part ce qui est évident "peut être utilisé pour implémenter Tetris"), mais cela englobe des choses comme être assez haut niveau et suffisamment expressif pour pouvoir écrire un jeu sans devenir fou, pouvoir interagir avec le monde extérieur (entrée et sortie), être capable d'exprimer des effets secondaires, être capable d'écrire une boucle d'événement, être capable d'exprimer une programmation réactive, asynchrone et simultanée, être capable d'interagir avec le système d'exploitation, être capable pour interagir avec des bibliothèques étrangères (en d'autres termes: pouvoir appeler et être appelé par du code C) et ainsi de suite. Ce sont des caractéristiques beaucoup plus intéressantes d'un langage de programmation à usage général que Turing-completeeness.
Vous pouvez trouver ma réponse à la question que vous avez liée intéressante, qui touche à certains des mêmes points même si elle répond à une question différente.