Notez, bien que je sache programmer, je suis tout à fait un débutant en théorie CS.
Selon cette réponse
La complétude de Turing est un concept abstrait de calculabilité. Si un langage est Turing complet, il est capable de faire n'importe quel calcul que n'importe quel autre langage complet de Turing peut faire.
D'accord. C'est logique. Je peux traduire (compiler) C en Assembly (et je le fais tous les jours!), Et je peux traduire Assembly en C (Vous pouvez écrire une machine virtuelle en C). Et la même chose s'applique à n'importe quelle autre langue - vous pouvez compiler n'importe quelle langue dans Assembly, puis l'exécuter dans une machine virtuelle écrite dans une autre autre langue.
Mais n'importe quel programme écrit dans une langue complète de Turing peut-il être réécrit dans une autre?
Que faire si mon assemblage a un opcode LIGHTBUTTON? Je ne peux physiquement pas émuler cette langue sur un système (langue) sans ampoule.
D'accord. Donc, vous direz que puisque nous traitons de la théorie informatique , nous ne discutons pas des limitations des appareils physiques.
Mais qu'en est-il d'un appareil qui n'a pas de multiplication? division? À ma connaissance (bien que ce soit plus une question pour math.SE), on ne peut pas émuler la multiplication (et certainement pas la division) avec addition et soustraction [1].
Alors, comment un "langage complet turing" (qui peut ajouter, soustraire et sauter) émulerait-il une autre langue qui peut ajouter, soustraire, multiplier et sauter?
MODIFIER
[1]. Sur des nombres réels arbitraires.
Réponses:
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
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.
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:
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.
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.
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:
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. Lesendmail
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. Lesmod_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.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.
la source
Bien sûr, vous pouvez implémenter la multiplication avec addition et soustraction:
Le fait que vous ne feriez probablement pas cela ne le rend pas moins possible.
La division n'est guère plus difficile:
Et comment pensez-vous que la multiplication et la division sont réellement effectuées par les circuits du CPU? Astuce: ce n'est pas une énorme table de recherche. Il est plus efficace que ci-dessus, car le décalage de bits est également utilisé, mais il est fondamentalement mis en œuvre en termes d'addition et de soustraction.
la source
Aucune machine physique (réellement existante) n'est ou ne peut jamais être complète de Turing, car l'exhaustivité de Turing nécessite un stockage infini et l'univers n'est pas infini.
Il en résulte que la réponse affirmative à la question de savoir si deux machines abstraites sont équivalentes ne vous aide pas à répondre à la question de savoir si deux approximations physiques de ces machines sont équivalentes.
Par conséquent, l'équivalence de Turing des modèles abstraits de (par exemple) deux langues ne signifie pas que chacun peut calculer tout ce que l'autre peut calculer dans la pratique. L'un peut se heurter à des limitations physiques avant l'autre.
la source
En fait, les opérations «ajouter 1», «soustraire 1» et «saut conditionnel si un registre spécifié est nul» sont suffisantes pour rendre un modèle de calcul Turing-complet (voir la machine à 2 compteurs comme référence pour un modèle de calcul de Turing très complet).
la source
tl; dr - Les machines de Turing ne sont qu'une description logique de base pour le fonctionnement d'un système logique général. Ils peuvent faire la plupart des choses que nous pouvons décrire, y compris appeler des opcodes spécialisés et des opérations mathématiques construites.
Dans un modèle Turing, les symboles comme un
LIGHTBUTTON
opcode ne sont que des chaînes dans l'alphabet utilisé par l'ordinateur Turing.Ainsi, la machine de Turing serait responsable de la production de la chaîne
"LIGHTBUTTON"
, ou d'une valeur entière qui correspond à cet opcode; Qu'une entité externe agisse ou non n'est pas l'affaire de l'ordinateur Turing.Les programmes C ont la même limitation. C'est-à-dire qu'un programme C ne peut appeler l'opcode que pour
LIGHTBUTTON
, que le CPU exécute ou non une opération associée à cet opcode dépend du CPU.Oui, une machine de Turing pourrait faire ces choses, même sur des nombres réels, dans la mesure où n'importe quelle logique humaine pourrait le décrire. La machine Turing pourrait être aussi simple qu'une automatisation cellulaire Rule 110 .
L'astuce consiste à construire un système logique à partir de la physique de la machine. Par exemple, les CPU traditionnels peuvent faire de la multiplication et de la division car ils ont une unité logique arithmétique (ALU) . Mais les ALU ne sont pas magiques; ce ne sont que de simples portes logiques . Et ces portes logiques sont constituées de transistors . Et ces transistors sont faits de sable dopé .
Donc, pour obtenir un appareil complet de Turing pour faire des mathématiques, il suffit de le programmer de cette façon.
la source
Si l'entrée du programme est une séquence de bits arbitrairement longue, et la sortie est également une séquence de bits arbitrairement longue, alors OUI. En supposant que vous avez le temps et l'énergie pour le réécrire, que vous ne vous souciez pas des performances et que vous disposez de suffisamment de mémoire physique pour les deux implémentations.
Les considérations pratiques qui signifient que deux langues complètes de Turing ne sont pas interchangeables comprennent:
ils prennent en charge différents types d'entrée et de sortie (par exemple, l'accès à la base de données SQL)
ils ont différentes bibliothèques de types de données (par exemple, prise en charge des chaînes Unicode)
ils fournissent différents paradigmes de programmation optimisés pour différentes tâches (par exemple, objets, threads, coroutines, fonctions de première classe)
ils fournissent différentes bibliothèques de fonctions (par exemple, analyse XML et sérialisation)
la source
Non. La complétude de Turing n'a rien à voir avec les programmes , elle concerne les fonctions mathématiques (ou algorithmes ). N'importe quel algorithme - n'importe quel calcul - vous pouvez le faire en C, vous pouvez le faire dans n'importe quel autre langage Turing-complet (cela devrait être évident). Mais Turing-exhausteness ne signifie pas que vous pouvez faire des E / S - du tout. Il ne parle pas du tout du matériel. Juste les calculs.
Vous pouvez étendre un langage Turing-complete avec n'importe quelle opération matérielle que vous souhaitez (techniquement, c'est ainsi
fputc
que vousfgetc
travaillez en C). Si vous prenez deux langues complètes de Turing et les étendez avec des opérations spécifiques au matériel identiques , elles restent interchangeables. Ainsi, votre langage d'assemblage avecLIGHTBULB
opération est plus puissant que Turing-complete; on pourrait dire que Turing est terminéLIGHTBULB
. Pour que tout autre langage lui soit identique, il doit également être complet sur TuringLIGHTBULB
; la façon la plus simple de le faire est d'y ajouter uneLIGHTBULB
primitive / instruction / fonction / etc.C'est pourquoi les implémentations C prennent généralement en charge l'assembleur en ligne, ou documentent un moyen d'appeler des fonctions écrites en assembleur, et pourquoi les implémentations d'autres langages fournissent généralement un moyen d'appeler des fonctions écrites en C.
la source