Qu'est-ce que Turing Complete?

Réponses:

325

Voici l'explication la plus brève:

Un système Turing Complete signifie un système dans lequel un programme peut être écrit qui trouvera une réponse (bien que sans aucune garantie concernant l'exécution ou la mémoire).

Donc, si quelqu'un dit "mon nouveau truc est Turing Complete", cela signifie en principe (bien que souvent pas en pratique) qu'il pourrait être utilisé pour résoudre tout problème de calcul.

Parfois, c'est une blague ... un gars a écrit un simulateur Turing Machine dans vi, il est donc possible de dire que vi est le seul moteur de calcul jamais nécessaire dans le monde.

Mark Harrison
la source
18
Pour plus de lecture, voir The Annotated Turing. Très accessible. amazon.com/Annotated-Turing-Through-Historic-Computability/dp/…
i_am_jorf
43
"souvent pas dans la pratique" est incorrect. Aucun système n'est jamais complet de Turing dans la pratique, car aucun système réalisable n'a une bande infinie. Ce que nous voulons vraiment dire, c'est que certains systèmes ont la capacité d'approximer l'intégralité de Turing jusqu'aux limites de leur mémoire disponible.
Shelby Moore III
22
Mais Vi est le seul moteur de calcul jamais nécessaire au monde ... ;-)
Joe Edgar
4
Emacs est-il aussi une machine à tourner? XD
alem0lars
6
Quelqu'un a récemment montré que PowerPoint est également complet.
Tagc
193

Voici l'explication la plus simple

Alan Turing a créé une machine qui peut prendre un programme, l'exécuter et afficher un résultat. Mais ensuite, il a dû créer différentes machines pour différents programmes. Il a donc créé "Universal Turing Machine" qui peut prendre n'importe quel programme et l'exécuter.

Les langages de programmation sont similaires à ces machines (bien que virtuels). Ils prennent des programmes et les exécutent. Maintenant, un langage de programmation est appelé "Turing complete", s'il peut exécuter n'importe quel programme (quel que soit le langage) qu'une machine Turing peut exécuter avec suffisamment de temps et de mémoire.

Par exemple: disons qu'il existe un programme qui prend 10 nombres et les ajoute. La machine de Turing peut facilement exécuter ce programme. Mais imaginez maintenant que pour une raison quelconque, votre langage de programmation ne peut pas effectuer le même ajout. Cela le rendrait "Turing incomplet" (pour ainsi dire). D'un autre côté, si elle peut exécuter n'importe quel programme que la machine universelle de Turing peut exécuter, alors c'est Turing complet.

La plupart des langages de programmation modernes (par exemple Java, JavaScript, Perl, etc.) sont tous Turing complets car ils implémentent chacun toutes les fonctionnalités requises pour exécuter des programmes comme l'ajout, la multiplication, la condition if-else, les instructions de retour, les moyens de stocker / récupérer / effacer données et ainsi de suite.

Mise à jour: vous pouvez en savoir plus sur mon article de blog: "JavaScript is Turing Complete" - Explained

Raja Rao
la source
5
L'idée qu'il y aurait même un terme pour ce type de machine a beaucoup plus de sens quand je me souviens que Turing et d'autres premiers informaticiens construiraient une machine spécifique chaque fois qu'ils voulaient résoudre un problème spécifique. Nous sommes habitués à une machine qui peut être reprogrammée pour toujours. Merci pour le contexte, Raja.
Jacob Ford
Comment JavaScript peut-il être complet? Il manque un système de fichiers, une API multithreading appropriée. Il a des tonnes de limitations, principalement en raison de sa nature de sandbox de sécurité de navigateur. Il peut difficilement être qualifié de «langage de programmation» .Voir combien de variantes d'abstraction de script existent (réagir, dactylographier ... vous l'appelez), tout cela pour compenser ce que JS n'a pas. (asm.js doit être mentionné ici). Java, Python ou C ++ sont de vrais exemples 'Turing Complete'. Mais js? Je ne pense pas.
Michael IV
2
@MichaelIV La machine de tournée n'avait pas non plus de système de fichiers / threads. JS est absolument en tournée complète.
Bax
@MichaelIV Pour ajouter à la réponse de Bax, on pourrait considérer qu'un ordinateur moderne se compose de plusieurs machines Turing qui fonctionnent ensemble pour permettre toutes ces belles choses que vous mentionnez. Par exemple, le CPU produit une "bande" pour le GPU à lire afin qu'il puisse écrire une "bande" pour le moniteur afin que le moniteur puisse écrire une "bande" pour l'utilisateur. De même, le processeur pourrait produire une "bande" pour les disques durs, les cartes réseau, les cartes son, etc.
86

De wikipedia :

L'exhaustivité de Turing, du nom d'Alan Turing, est importante en ce que chaque conception plausible d'un appareil informatique jusqu'à présent avancé peut être émulée par une machine Turing universelle - une observation qui est devenue connue sous le nom de thèse de Church-Turing. Ainsi, une machine pouvant servir de machine de Turing universelle peut, en principe, effectuer tout calcul dont tout autre ordinateur programmable est capable. Cependant, cela n'a rien à voir avec l'effort requis pour écrire un programme pour la machine, le temps que cela peut prendre à la machine pour effectuer le calcul ou les capacités que la machine peut posséder qui ne sont pas liées au calcul.

Alors que les machines vraiment complètes de Turing sont très probablement physiquement impossibles, car elles nécessitent un stockage illimité, l'exhaustivité de Turing est souvent attribuée de manière lâche à des machines physiques ou à des langages de programmation qui seraient universels s'ils avaient un stockage illimité. Tous les ordinateurs modernes sont Turing-complets dans ce sens.

Je ne sais pas comment vous pouvez être plus non technique que cela, sauf en disant "turing complete signifie" capable de répondre à un problème calculable avec suffisamment de temps et d'espace "".

Ran Biron
la source
4
Dans ce contexte, qu'est-ce qu'un "appareil informatique"?
dopatraman
30
Comme pour la plupart des articles Wikipedia, bien que cette citation soit techniquement correcte, elle n'apporte aucune valeur à une personne qui n'a aucune connaissance sur le sujet et essaie de la comprendre. Être capable d'expliquer les choses correctement est une science en soi :)
Lacho Tomov
76

Définition informelle

Un langage complet de Turing est celui qui peut effectuer n'importe quel calcul. La thèse de Church-Turing indique que tout calcul réalisable peut être effectué par une machine de Turing. Une machine Turing est une machine avec une mémoire à accès aléatoire infinie et un `` programme '' fini qui dicte quand elle doit lire, écrire et se déplacer dans cette mémoire, quand elle doit se terminer avec un certain résultat et ce qu'elle doit faire ensuite. L'entrée d'une machine de Turing est mise en mémoire avant de démarrer.

Choses qui peuvent rendre un langage NON Turing complet

Une machine de Turing peut prendre des décisions en fonction de ce qu'il voit dans la mémoire - La « langue » qui soutient que +, -, *et /sur les entiers ne sont pas Turing complet car il ne peut pas faire un choix en fonction de son entrée, mais une machine de Turing peut.

Une machine Turing peut fonctionner indéfiniment - Si nous prenions Java, Javascript ou Python et supprimions la possibilité de faire tout type de boucle, GOTO ou appel de fonction, ce ne serait pas Turing complet car il ne peut pas effectuer un calcul arbitraire qui ne termine jamais. Coq est un prouveur de théorème qui ne peut pas exprimer des programmes qui ne se terminent pas, donc ce n'est pas Turing complet.

Une machine Turing peut utiliser une mémoire infinie - Un langage qui était exactement comme Java mais qui se terminerait une fois qu'il aurait utilisé plus de 4 gigaoctets de mémoire ne serait pas Turing complet, car une machine Turing peut utiliser une mémoire infinie. C'est pourquoi nous ne pouvons pas réellement construire une machine Turing, mais Java est toujours un langage complet Turing car le langage Java n'a aucune restriction l'empêchant d'utiliser une mémoire infinie. C'est une des raisons pour lesquelles les expressions régulières ne sont pas complètes.

Une machine Turing a une mémoire à accès aléatoire - Un langage qui vous permet uniquement de travailler avec de la mémoire pushet des popopérations sur une pile ne serait pas Turing complet. Si j'ai un `` langage '' qui lit une chaîne une fois et ne peut utiliser la mémoire qu'en poussant et en sautant à partir d'une pile, il peut me dire si chaque élément (de la chaîne a le sien )plus tard en poussant quand il voit (et en sautant quand il voit ). Cependant, il ne peut pas me dire si chacun (a le sien )plus tard et chacun [a le sien ]plus tard (notez que ([)]cela répond à ces critères mais ([]]ne le fait pas). Une machine de Turing peut utiliser sa mémoire à accès aléatoire pour suivre ()« s et[]est séparément, mais cette langue avec seulement une pile ne peut pas.

Une machine Turing peut simuler n'importe quelle autre machine Turing - Une machine Turing, lorsqu'elle reçoit un «programme» approprié, peut prendre le «programme» d'une autre machine Turing et le simuler sur une entrée arbitraire. Si vous aviez un langage qui était interdit d'implémenter un interpréteur Python, ce ne serait pas Turing complet.

Exemples de langues complètes de Turing

Si votre langue a une mémoire à accès aléatoire infinie, une exécution conditionnelle et une certaine forme d'exécution répétée, c'est probablement Turing complet. Il existe des systèmes plus exotiques qui peuvent encore réaliser tout ce qu'une machine Turing peut faire, ce qui les rend également complets:

  • Calcul lambda non typé
  • Le jeu de la vie de Conway
  • Modèles C ++
  • Prolog
Gordon Gustafson
la source
11
SQL est très certainement complet. Il a des capacités de script qui permettent tout calcul.
nzifnab
53
Non, vous confondez SQL avec des extensions telles que T-SQL / PL-SQL. ANSI SQL n'est pas complet. Mais TSQL / PLSQL - l'est.
Agnius Vasiliauskas
15
Apparemment, SQL est complet: stackoverflow.com/questions/900055/…
Newtang
2
Selon l' exhaustivité de Turing - le système est Turing complet s'il peut être utilisé pour simuler n'importe quelle machine de Turing à bande unique. Mais dans l'exemple ci-dessus, si j'ai bien compris, les développeurs ont construit des éléments particuliers cyclic tag systemet non universal cyclic tag system. Par conséquent, l'article ne prouve pas l'exhaustivité de SQL turing. (Ou j'ai mal compris quelque chose)
Agnius Vasiliauskas
2
Il n'y a pas d'implémentation réalisable d'un langage complet de Turing, car il n'y a pas de bandes infinies. Ce que nous voulons vraiment dire, c'est que certains langages ont la capacité d'approximer l'intégralité de Turing jusqu'aux limites de la mémoire disponible de la machine hôte.
Shelby Moore III
17

Fondamentalement, l'intégralité de Turing est une exigence concise, une récursion illimitée.

Pas même limité par la mémoire.

J'y ai pensé indépendamment, mais voici une discussion de l'affirmation. Ma définition de LSP fournit plus de contexte.

Les autres réponses ici ne définissent pas directement l'essence fondamentale de la complétude de Turing.

Shelby Moore III
la source
Les automates à états finis peuvent avoir une récursion illimitée. Exemple: a*.
3
@ Les FSM rhymoïdes ont une mémoire limitée - le nombre fini d'états) - mais une récursion illimitée sans optimisation de queue doit avoir une mémoire illimitée. Je n'ai pas limité ma définition au sous-ensemble de la récursion illimitée uniquement avec l'optimisation de la queue. Veuillez retirer votre downvote.
Shelby Moore III
vous avez gardé la définition de brouillard de récursion illimitée. Voulez-vous dire «récursivité» au sens de «récursion primitive» et «illimité» en le rendant «partiel» (ou «général» ou «mu»)? Alors vous avez peut-être raison. Mais votre formulation actuelle est bien trop proche des déclarations critiquées dans "On Folk Theorems" de David Harel. Il est important d'être rigoureux en mathématiques, et en omettant des définitions précises, vous ignorez cela. Soit dit en passant: les FSM peuvent être généralisés pour modéliser l'interaction; ce qui les distingue des MT est que l'environnement de ces derniers est également modélisé (comme la bande).
@ L'énumération rhymoïde est l'antithèse de la précision, par exemple, énumérer la précision maximale des fractions de pouce. Une récursion illimitée signifie toutes les formes possibles de récursivité, ce qui est impossible sans une bande infinie. La récursion entièrement généralisée (et pas seulement générale dans le modèle) est toujours complète de Turing. J'affirme l'équivalence entre la récursivité généralisée et la possibilité d'effectuer tout calcul possible. Il s'agit d'une équivalence importante à noter.
Shelby Moore III
"Une récursion illimitée signifie toutes les formes possibles de récursivité" C'est votre lecture. Pour la plupart des utilisateurs SO, «récursion illimitée» signifie while (p) { /* ... */ }. "J'affirme l'équivalence entre la récursivité généralisée et la possibilité d'effectuer tout calcul possible." La thèse de Church est une question très différente et devrait vraiment être discutée séparément.
13

Turing Complete signifie qu'elle est au moins aussi puissante qu'une machine de Turing . Cela signifie que tout ce qui peut être calculé par une machine de Turing peut être calculé par un système Turing Complete.

Personne n'a encore trouvé un système plus puissant qu'une machine de Turing. Donc, pour le moment, dire qu'un système est Turing Complete revient à dire que le système est aussi puissant que n'importe quel système informatique connu (voir la thèse de Church-Turing ).

Waylon Flinn
la source
3
Notez que tout cela ne tient pas compte du temps passé au mur. Il dit simplement "cela peut être fait".
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen en fait, il ignore complètement la calculabilité physique. Non seulement cela pourrait prendre plus de temps que l'âge de l'univers, mais il pourrait également utiliser plus de mémoire que ce qui peut être construit avec tous les fermions et bosons de l'univers.
Waylon Flinn
Il n'y a peut-être aucune limite à la quantité de bosons et de fermions dans l'univers. Nous ne savons pas, et ne saurons probablement jamais, sa taille. Chaque fois que vous lisez le nombre de X dans «l'univers», les gens parlent en fait de l' univers observable . Bien qu'intéressant, ce n'est pas une véritable limite physique.
Stijn de Witt
9

En termes simples, un système complet de Turing peut résoudre tout problème de calcul possible.

L'une des principales exigences est que la taille du bloc-notes soit illimitée et qu'il est possible de revenir en arrière pour accéder aux écritures antérieures sur le bloc-notes.

Ainsi, dans la pratique, aucun système n'est complet à Turing.

Certains systèmes se rapprochent plutôt de la complétude de Turing en modélisant la mémoire illimitée et en effectuant tout calcul possible pouvant tenir dans la mémoire du système.

Shelby Moore III
la source
2

Je pense que l’importance du concept "Turing Complete" réside dans la capacité à identifier une machine informatique (pas nécessairement un "ordinateur" mécanique / électrique) qui peut voir ses processus être déconstruits en instructions "simples", composées de plus en plus simples instructions qu'une machine universelle pourrait interpréter puis exécuter.

Je recommande vivement The Annotated Turing

@ Mark, je pense que ce que vous expliquez est un mélange entre la description de la machine de Turing universelle et Turing Complete.

Quelque chose qui est Turing Complete, dans un sens pratique, serait une machine / processus / calcul pouvant être écrit et représenté comme un programme, à exécuter par une machine universelle (un ordinateur de bureau). Bien qu'il ne prenne pas en compte le temps ou le stockage, comme mentionné par d'autres.

Brian Leahy
la source
2

Ce que je comprends en termes simples:

Turing Complete: Un langage / programme de programmation capable de faire du calcul est Turing complete.

Par exemple :

  1. Pouvez-vous ajouter deux nombres en utilisant Just HTML . (Ans est ' Non ', vous devez utiliser javascript pour effectuer l'ajout.), Par conséquent, HTML n'est pas Turing Complete.

  2. Des langages comme Java, C ++, Python, Javascript, Solidity pour Ethereum, etc. sont Turing Complete car vous pouvez effectuer des calculs comme ajouter deux nombres à l'aide de ces langages.

J'espère que cela t'aides.

Shirish Singh
la source
0

Son complet s'il peut tester et se brancher (a un «si»)

Allan Wrobel
la source
1
Pour une question aussi ancienne, il serait utile de vérifier si d'autres ont déjà fait des contributions similaires ou plus substantielles
Alan Ocallaghan
Pas sûr de l'exactitude de la réponse. Mais c'est une explication vraiment simple que je n'avais jamais vue auparavant. Chose drôle: il y a très longtemps (après avoir écrit mon premier morceau de code), j'ai également utilisé la même explication pour définir le processeur le plus simple possible.
Victor Yarema
Il s'agit d'un excellent premier essai d'une définition opérationnelle incisive, concise et précise. Cependant, la branche doit autoriser le bouclage et, n'est-il pas vrai que la machine doit également autoriser les appels de sous-programme (c'est-à-dire: la récursivité)? Existe-t-il un programme aplati de boucles imbriquées pour chaque programme avec récursivité?
user3673
0

Une machine de Turing nécessite que tout programme puisse effectuer des tests de condition. C'est fondamental.

Considérez un rouleau de piano de joueur. Le piano du joueur peut jouer un morceau de musique très compliqué, mais il n'y a jamais de logique conditionnelle dans la musique. C'est Turing complet.

La logique conditionnelle est à la fois la puissance et le danger d'une machine Turing Complete.

Le rouleau de piano est garanti de s'arrêter à chaque fois. Il n'y a pas de telle garantie pour une MT. C'est ce qu'on appelle le «problème de l'arrêt».

Richard Riehle
la source
-1

Comme l'a dit Waylon Flinn :

Turing Complete signifie qu'elle est au moins aussi puissante qu'une machine de Turing.

Je crois que c'est incorrect, un système est Turing complet s'il est exactement aussi puissant que la machine de Turing, c'est-à-dire que tous les calculs effectués par la machine peuvent être effectués par le système, mais aussi tous les calculs effectués par le système peuvent être effectués par la machine de Turing .

ChrisC
la source
1
Je pense que vous supposez que la thèse de Church-Turing est vraie pour arriver à cette conclusion. Cela reste à prouver. La propriété que vous décrivez s'appelle «Turing Equivalent».
Waylon Flinn
1
@WaylonFlinn Non, il a raison. "Complétude" signifie à la fois qu'il est au moins aussi fort qu'une chose, mais aussi pas plus fort. Comparez avec "NP-Complete".
Devin Jeanpierre
3
@DevinJeanpierre Je ne veux pas commencer une guerre de flammes ici mais je suis presque certain que la classe de calcul que vous décrivez s'appelle "Turing Equivalent". Turing Complete a cependant une relation similaire avec NP-Complete. NP-Complete est égal à NP si et seulement si P = NP. De la même manière, Turing Complete est égal à Turing Equivalent si et seulement si la thèse de Church-Turing est correcte.
Waylon Flinn
@Waylon Source? Rien de ce que je lis n'est d'accord avec cela (par exemple en.wikipedia.org/wiki/Turing_completeness )
Devin Jeanpierre
4
@DevinJeanpierre Il est dit ici même dans l'article wikipedia auquel vous accédez. Citant la section Définitions formelles: "Un système de calcul qui peut calculer chaque fonction calculable de Turing est appelé Turing complet", "Un système Turing-complet est appelé équivalent de Turing si chaque fonction qu'il peut calculer est également Turing calculable"
Waylon Flinn
-2

En termes de langage pratique familier à la plupart des programmeurs, la manière habituelle de détecter l'intégralité de Turing est si le langage permet ou permet la simulation des instructions imbriquées sans limite (par opposition au style Pascal pour les instructions, avec des limites supérieures fixes).

Keith Douglas
la source
1
Une seule boucle while non bornée suffit pour simuler une machine de Turing.
masterxilo
-8

Une base de données relationnelle peut-elle entrer des latitudes et des longitudes de lieux et de routes et calculer le chemin le plus court entre elles - non. Il s'agit d'un problème qui montre que SQL n'est pas Turing complet.

Mais C ++ peut le faire et peut faire n'importe quel problème. Il en est ainsi.

Akshay Jain
la source
10
Être capable de calculer le chemin le plus court entre les points n'est pas la définition de Turing complète. Il y a tellement plus que juste cet exemple.
Eva
1
Je vais juste mettre ça ici ... hansolav.net/blog/ImplementingDijkstrasAlgorithmUsingTSQL.aspx
Matthew Whited