TD machines de Turing Exercice 1 Analyse d’une machine de Turing On donne le tableau suivant : Etat q0 , I q1 q2 , F 0 (q0 , ⊥, →) – – Symbole 1 (q1 , ⊥, →) (q1 , ⊥, →) – ⊥ – (q2 , ⊥, →) – 1. Représenter la machine de Turing associée. Quel langage reconnaît-elle ? 2. Écrire les représentations instantanées de la machine au cours de son exécution sur l’entrée 001110. Corrigé 0/⊥, → start q0 1/⊥, → 1/⊥, → q1 ⊥/⊥, → q2 1. Cette machine reconnaît le langage 0∗ 1+ . 2. q0 001110 ⊢ ⊥q0 01110 ⊢ ⊥⊥q0 1110 ⊢ ⊥⊥⊥q1 110 ⊢ ⊥⊥⊥⊥q1 10 ⊢ ⊥⊥⊥⊥⊥q1 0 ⊢ rejet. Exercice 2 Écriture d’une machine de Turing 1. Décrire une machine de Turing, étant donné un nombre X, retourne X+1. Par exemple, pour 26 en entrée, la machine retournera 27. 2. Construire une machine de Turing qui accepte les mots ayant le même nombre de 0 que de 1. 3. Décrire une machine de Turing qui accepte les palindromes de longueur paire. Par exemple, 10100101 est un palindrome de longueur paire. 1 Corrigé Il existe bien sûr de nombreuses solutions pour chaque problème. 1. q2 0 − 8/1 − 9, → ∗/∗, → start q0 ⊥/⊥, ← ⊥/1, ← q1 q3 9/0, ← On a utilisé quelques abus de notation : */* signifie "pour tout chiffre, réécrire le chiffre" et 0-8/1-9 signifie "pour tout chiffre entre 0 et 8, écrire le successeur de ce chiffre". 2. 0/0, → X/X, → q1 0/X, → start q0 1/X, ← ⊥/⊥, → q2 1/X, → X/X, → 0/X, ← q4 1/1, → X/X, → Ici */* signifie "tout ce qui est 0 ou 1" 2 0/0, ← 1/1, ← X/X, ← 3. ∗/∗, → q1 X/X, ← ⊥/⊥, ← q2 0/X, → 0/X, ← q0 start q3 X/X, → ∗/∗, ← 1/X, ← 1/X, → q4 X/X, ← ⊥/⊥, ← q5 ∗/∗, → Exercice 3 Variante d’une machine de Turing On appelle machine de Turing avec stationnarité une machine de Turing qui dispose de trois mouvements de ruban différents : ←, →, ∅. ∅ indique que le ruban ne bouge pas. Montrer que l’ensemble des fonctions calculées par les machines de Turing avec stationnarité est exactement l’ensemble des fonctions calculées par les machines de Turing. Corrigé Montrons dans un premier temps que toute machine de Turing peut être simulée par une machine de Turing avec stationnarité. C’est immédiat, car la machine de Turing avec stationnarité peut faire toutes les opérations élémentaires d’une machine de Turing. Montrons maintenant qu’une machine de Turing avec stationnarité peut être simulée par une machine de Turing. Pour cela, il est nécessaire de montrer que toutes les transitions de la machine avec stationnarité peuvent être simulées par une machine "classique". En particulier, il s’agit de montrer que les transitions de la forme A/B, ∅ peuvent être simulées. Considérons une transition de la forme A/B, ∅. Elle peut être simulée par une machine de Turing, qui effectuerait deux transitions successives, A/B, ← puis */*, → où * représente n’importe quel caractère : quel que soit le caractère lu, il est réécrit et on se déplace à droite. On peut appliquer deux transitions si à chaque fois que l’on veut simuler une transition stationnaire, on rajoute un état intermédiaire dont le seul rôle 3 q1 est de rajouter une transition. Ainsi, A/B, ← ′ ∗/∗, → q1 q2 q1 . Exercice 4 A/B, ∅ q2 peut être simulé par Reconnaisseur et décideur On appelle reconnaisseur d’un langage L une machine de Turing qui accepte exactement les mots de L. L est alors dit reconnaissable, ou récursivement énumérable et on note L ∈ RE. On appelle décideur d’un langage L une machine de Turing qui accepte exactement les mots de L, et qui rejette les autres. L est alors dit décidable, et on note L ∈ R. 1. Un reconnaisseur peut-il entrer dans une boucle infinie pour un mot donné en entrée ? Si oui, le mot est-il accepté ou refusé ? Même question pour un décideur. 2. Si L est décidable, est-ce que son complémentaire L est décidable ? 3. Montrer que L est décidable ⇔ L et L sont reconnaissables. 4. Si L est reconnaissable, est-ce que L est reconnaissable ? Corrigé 1. Par définition, un reconnaisseur n’accepte que les mots du langage qu’il reconnaît, donc il est possible qu’un reconnaisseur entre dans une boucle infinie pour un mot qui n’est pas du langage reconnu. Un décideur a un temps d’exécution fini, car il finit soit par accepter, soit par refuser une entrée. Il ne peut donc pas entrer dans une boucle infinie. On peut remarquer d’un décideur est un reconaisseur qui s’arrête toujours en un temps fini. 2. Oui. Soit D un décideur de L. Construisons la machine D qui, pour une entrée e, simule l’exécution de D sur e. Si D finit par accepter e, alors D refuse e ; et si D refuse e, alors D accepte e. Il est évident que D se termine toujours, et reconnaît L, donc D décide L. 3. ⇒ Supposons que L est décidable. Il est immédiat que L est reconnaissable, car un décideur de L est un reconnaisseur de L. De plus d’après la question 2, L est également décidable donc L est également reconnaissable. 4 ⇐ Supposons que L et L sont reconnaissables. Il existe un reconnaisseur R de L et un reconnaisseur R de L. Soit e un mot. Si e ∈ L, alors R(e) s’arrête. Si e ∈ / L, alors R(e) s’arrête. On crée donc une machine D qui, sur une entrée e, simule l’exécution en parallèle de R(e) et R(e). Si R accepte le mot, alors D accepte le mot, et si R accepte le mot, alors D refuse le mot. Par définition de R et R, il est nécessaire que D(e) s’arrête en un temps fini. Par ailleurs, il est immédiat que D reconnaît L, donc D décide L. 4. D’après la question 3, si L et L sont reconnaissables, alors L est décidable. Pour répondre à la question, il suffit donc d’exhiber un langage qui soit reconnaissable mais pas décidable. Soit L = {(M, e) | M (e) s’arrête}. Une machine de Turing qui déciderait de L serait en mesure de répondre au problème de l’arrêt, or un tel problème est indécidable, donc L est indécidable. En revanche, L est reconnaissable. En effet, n’importe quelle machine universelle permet de reconnaître L, en simulant l’exécution de M (e). Si l’exécution s’arrête, alors la machine universelle accepte le mot. Exercice 5 Fermeture des langages Soient A et B des langages décidables. 1. Montrer que A ∪ B, A ∩ B, A\B, AB, A∗ sont décidables. 2. Existe-t-il un langage fini indécidable ? 3. Soient C, D des langages reconnaissables. Est-ce que C\D est un langage reconnaissable ? Corrigé 1. Soit DA un décideur de A, DB un décideur de B. Pour chacune des sousquestions, on va construire un décideur du langage en fonction de DA et DB . A ∪ B Pour une entrée e, on simule l’exécution de DA (e). Si c’est accepté, on accepte. Sinon, on retourne DB (e). A ∩ B Pour une entrée e, on simule l’exécution de DA (e). Si c’est refusé, on refuse. Sinon, on retourne DB (e). A\B Pour une entrée e, on simule l’exécution de DA (e). Si c’est refusé, on refuse. Sinon, on retourne la négation de DB (e). 5 AB Il faut créer une machine qui va séparer en deux, de façon nondéterministique, le mot e donné en entrée : e = xy (toutes les possibilités pour x et y seront créées, ce qui est faisable en temps fini car x est de taille finie). On donne ensuite x à un décideur de A et y à un décideur de B. A∗ Remarquons que par généralisation de la question précédente, n’importe quel langage An est décidable, pour tout entier n. Pour décider de l’appartenance d’un mot à A∗ , on décide si l’entrée appartient à A, puis si l’entrée appartient à A2 , puis si l’entrée appartient à A3 , etc. Si l’entrée est de taille n, il n’y a pas besoin d’aller plus loin que l’appartenance à An , donc le test finit toujours. 2. Non. Étant donné un langage fini, il est immédiat de créer une machine de Turing qui possède les mots "codés en dur" dans ses états. Une démonstration plus formelle consiste à dire que tout langage Li = {wi } composé d’un seul mot wi est décidable, et que l’union finie de langages décidable est décidable. 3. Question très semblable à la question 4.4. Soit C = Σ∗ le langage de l’ensemble des mots, et soit D l’ensemble des couples (M, e) tels que M (e) s’arrête. C et D sont reconnaissables (C est reconnaissable par une machine qui accepte tout, D est reconnaissable par toute machine universelle), or C\D = D n’est pas reconnaissable, car D est indécidable d’après le théorème de l’arrêt. Exercice 6 Complexité P et NP On considère un langage dont toute instance de taille n est décidée en temps O(f (n)) par une machine de Turing non-déterministe. Montrer qu’il existe une machine de Turing déterministe qui peut décider de l’appartenance au langage de tout mot de taille n en temps 2O(f (n)) . Corrigé On rappelle comment déterminiser une machine de Turing : on simule, en parallèle, l’exécution de toutes les branches non-déterministes. Soit une machine de Turing non-déterministe qui décide du langage. Au cours d’une transition, le nombre de transitions non-déterministes parallèles est bornée par un entier M , qui dépend du nombre d’états de la machine et de la taille de l’alphabet. Notamment, M ne dépend pas de la taille de l’entrée. On suppose que la machine non-déterministe finit son calcul en O(f (n)), pour toute entrée de taille n. Alors cette machine non-déterministe effectue au maximum O(f (n)) opérations, et à chaque étape, choisira parmi au plus M choix non-déterministes. Ainsi, notre machine déterministe, qui simulera toutes 6 les branches possibles, lancera au maximum M O(f (n)) simulations de machines de Turing. Considérons le retour de la machine non-déterministe : • Soit elle rejette l’entrée (en moins de O(f (n))), ce qui veut dire que toutes les branches non-déterministes ont rejeté l’entrée en moins de O(f (n)) • Soit elle accepte l’entrée (en moins de O(f (n))), ce qui veut dire qu’une branche accepte l’entrée en moins de O(f (n)). Dans les deux cas, dans la machine de Turing déterministe, chaque simulation sera exécutée en moins de O(f (n)) : soit toutes les simulations rejettent, soit une simulation accepte (et on arrête toutes les autres simulations). Comme il y a au plus M O(f (n)) simulations et que chaque simulation dure au plus O(f (n)), notre machine de Turing déterministe s’arrêtera en un temps maximum de O(f (n))×M O(f (n)) = M logM O(f (n)) ×M O(f (n)) = M O(f (n))+logM (O(f (n))) = M O(f (n)) = 2log2 (M )O(f (n)) = 2O(f (n)) . Note : il faudrait techniquement montrer que la machine de Turing universelle utilisée pour les calculs ne rajoute pas de complexité supérieure à 2O(f (n)) . En pratique, on peut construire une machine de Turing universelle dont le temps d’exécution est un facteur polynomial du temps d’éxécution de la machine donnée en entrée. Exercice 7 Démonstration du théorème de Rice On se propose ici de prouver le théorème de Rice. Pour rappel, le théorème spécifie que toute propriété non triviale sur un langage reconnaissable est indécidable. On note (wi )i∈N et (Mi )i∈N deux énumérations des mots et des machines de Turing, et on utilise les deux langages suivants : K = {w | ∃i ∈ N, w = wi et Mi n’accepte pas wi } L = {(M, w) | M accepte w} 1. Montrer que K est indécidable. 2. En utilisant la question précédente, montrer que L est indécidable. On considère à présent une propriété P non triviale. On suppose que le langage vide ne vérifie pas P . Soit MP une machine de Turing dont le langage vérifie P . Soit (M, w) un couple (machine, { entrée). MP (x) si M accepte w On construit M ′ tel que M ′ (x) = Refuse x sinon 3. Montrer l’équivalence entre les propositions “le langage reconnu par M ′ vérifie P ” et (M, w) ∈ L. 7 4. Conclure. 5. Comment peut-on conclure si le langage vide vérifie P ? Corrigé 1. Supposons par l’absurde que K soit décidable. Il existe un décideur DK qui accepte exactement les mots de K, et refuse les autres. Puisque DK est une machine de Turing, il existe un entier j tel que DK = Mj . Regardons si wj appartient à K. • Si wj ∈ K, alors par définition Mj n’accepte pas wj , ce qui signifie que DK n’accepte pas wj , donc par définition d’un décideur, que wj ∈ / K. Contradiction. • Si wj ∈ / K, alors par définition Mj reconnaît wj , donc DK reconnaît wj , donc par définition wj ∈ K. Contradiction. On aboutit forcément à une contradiction, donc par l’absurde K n’est pas décidable. 2. Supposons que L soit décidable. Alors il existe un décideur DL qui décide en temps fini si M accepte w, pour tous M et w. En particulier, ∀i, DL décide en temps fini si Mi accepte wi , donc la négation de DL est un décideur pour K. Or K est indécidable, contradition. Donc L est indécidable. 3. ⇒ Si (M, w) ∈ L, alors les mots acceptés par M’ sont les mots acceptés par MP , donc le langage de M ′ vérifie P . ⇐ Si le langage de M ′ vérifie P , alors E = {x | M ′ accepte x} vérifie P . Or le langage vide ne vérifie pas P , donc E est non vide, donc il existe au moins un x accepté par M ′ , donc nécessairement M accepte w, donc (M, w) ∈ L. 4. Comme L est indécidable, le problème “Est-ce que le langage de M ′ vérifie P ” est indécidable. 5. Il suffit de reprendre le raisonnement avec P , car P est non-trivial. Puisque P est indécidable, alors P est indécidable (d’après la question 2 de l’exercice 4). 8 Exercice 8 Machine de Turing universelle à un état Shannon a prouvé en 1956 qu’il existe des machines de Turing universelles à deux états, mais aucune machine de Turing universelle à un état. Cet exercice a pour but de démontrer le second résultat. On suppose qu’il existe une machine de Turing universelle à un état. Notamment, on peut programmer cette machine les décimales √ √ pour qu’elle écrire toutes d’un nombre calculable, par exemple 2. On rappelle que 2 est un nombre irrationnel, donc possède une infinité de décimales qui ne se répètent jamais, mais est néanmoins calculable. On suppose que la machine dispose d’un ruban semi-infini (équivalent au ruban infini). On suppose que le ruban possède initialement les données EI sur le début du ruban. Les cellules suivantes sont initialisées à ⊥ (vide). On appelle la première cellule vide c1 , la suivante c2 , etc. Initialement, la tête√de lecture est sur c1 . On suppose que la machine va écrire les décimales de 2 dans les cellules c1 . . . cn . . . . Pour notre analyse, on compte le nombre de fois où la tête de lecture passe la frontière EI/c1 en se déplaçant vers la droite (D1 ) et en se déplaçant vers la gauche (G1 ). De même, D2 /G2 compte les passages entre c1 /c2 , etc pour toutes les variables Di , Gi . On récapitule notre construction dans le schéma ci-dessous. G1 G2 ⊥ EI D1 ... ⊥ c1 c2 D2 1. Montrer que si l’ensemble√des cellules lues par la machine est borné, alors elle ne peut pas calculer 2. 2. Montrer que G1 ∈ {D1 , D1 + 1}. Montrer que ∀i ≥ 2, Gi ∈ {Di , Di − 1}. 3. Supposons que G1 > D1 . Montrer que la machine n’écrit que sur un nombre fini de cellules. 4. Supposons que G1 = D1 = ∞. (a) En supposant que la machine écrit sur une infinité de cellules, montrer que chaque cellule (sauf une quantité finie) est lue une infinité de fois. (b) Montrer que dans le cas d’une machine de Turing à un état, la suite des valeurs contenue dans une cellule réécrite infiniment souvent est soit stationnaire, soit périodique. 9 (c) En supposant qu’une cellule vide converge vers une valeur stationnaire, montrer que toutes les cellules vides convergent vers la même valeur stationnaire. Montrer qu’un tel état final ne peut représenter √ 2. (d) Montrer qu’une machine dont toutes les cellules sauf une quantité √ finie sont soit stationnaires soit périodique ne peut pas calculer 2. √ Conclure que si G1 = D1 = ∞, la machine ne peut pas calculer 2. 5. Supposons que G1 = D1 ̸= ∞. (a) Supposons que G2 < G1 = D1 . Montrer que la tête de lecture finit "piégée" dans c1 , c’est-à-dire finit par y rentrer et √ n’en plus sortir. Conclure que la machine ne peut alors pas calculer 2. (b) Supposons que G2 = G1 . i. Montrer que si D2 = 0, la machine ne peut pas calculer √ 2. Si D2 ̸= 0, on reprend la même étude depuis (1), mais en considérant c2 comme notre cellule de référence. On peut se rendre compte qu’on finit systématiquement par prouver √ que la machine ne peut pas calculer 2 sauf si ∃N, ∀i, N = Gi = Di ̸= ∞. ii. Montrer que l’existence √ d’un tel N implique que notre machine ne peut pas calculer 2. iii. Montrer que si un tel N existe, alors chaque cellule est lue (et écrite) 2N fois par la tête de lecture. iv. Montrer qu’alors toutes les cellules ci ont la même valeur finale et conclure. 10