Chapitre 3 Machines de Turing.

Slides:



Advertisements
Présentations similaires
Explorer un espace d’états
Advertisements

« 1.5. Les fonctions logiques »
Algorithmes et structures de données avancés
Calculs de complexité d'algorithmes
Séminaire Biblio LISC - 3/04/02 Complexité, information Daprès JP Delahaye (1999)
Logique et Raisonnement Scientifique A. Lecomte Gödel et lincomplétude.
Séminaire Florin Périer Alain Gély LIMOS
Chap 1 Grammaires et dérivations.
INTRODUCTION.
Chapitre 1 Automates finis
IFT313 Introduction aux langages formels
Traitement Co-Séquentiel: Appariment et Fusion de Plusieurs Listes
Section VI Structures répétitives (suite)
Utilisation des tableaux
Les bases de l’Algorithmique
Conception et analyse des algorithmes
Introduction à l’Intelligence Artificielle
Cours 7 - Les pointeurs, l'allocation dynamique, les listes chaînées
Structures de données linéaires
Partie 1 Etude de l'existant
Démarche de résolution de problèmes
Algorithmique et Programmation
Chapitre 7: Les polynômes
Preuves interactives: IP, AM, MA et isomorphisme de graphe
8PRO100 Éléments de programmation Comment faire prendre une décision à un ordinateur?
Sémantique axiomatique
Notions de base de la théorie des langages
1.2 COMPOSANTES DES VECTEURS
Algorithmique et Programmation
Espaces vectoriels Montage préparé par : S André Ross
Algorithme de Bellman-Ford
Inéquations du 1er degré
Systèmes Superscalaires et VLIW
IFT313 Introduction aux langages formels
IFT313 Introduction aux langages formels Froduald Kabanza Département dinformatique Université de Sherbrooke Automates à pile LR Notion de poignée.
Expressions régulières et hash tables
Introduction à la programmation I Fonctions Structures de contrôle Structures de données (arrays simples et indexés) Variables locales et globales.
Semaine #1 INF130 par Frédérick Henri.
Semaine #1 INF135 par Frédérick Henri.
IFT Complexité et NP-complétude
IFT Chapitre 1 Classes de complexité fondamentales:
IFT Au delà de NP: hiérarchie polynomiale, EXP, NEXP.
1 CSI3525: Concepts des Languages de Programmation Notes # 3: Description Syntaxique des Languages.
CSI3525: Concepts des Languages de Programmation
8PRO107 Éléments de programmation
Partie II Sémantique.
Sémantique dénotationnelle
Indécidabilité.
Programmation linéaire en nombres entiers : les méthodes de troncature
Plan cours La notion de pointeur et d’adresse mémoire.
IFT Complexité et NP-complétude Chapitre 0 Rappels.
Expressions régulières et hash tables
Paradigmes des Langages de Programmation
Paradigmes des Langages de Programmation
Les machines de Turing Lionel Blavy Sébastien Giraud Fabien Tricoire
Programmation linéaire en nombres entiers
D.E ZEGOUR Ecole Supérieure d’Informatique. Problèmes de décision Concepts de base Expressions régulières Notation particulière pour exprimer certaines.
D.E ZEGOUR Ecole Supérieure d’Informatique
Introduction et Généralités sur l’Algorithmique
Introduction au langage C : Structures de contrôle 1 ère année Génie Informatique Dr Daouda Traoré Université de Ségou
Abdelkader Heni FUNDP Syntaxe et sémantique Abdelkader Heni FUNDP
1. Spoon Christophe Delagarde, septembre 1998 I.U.T., Université de la Méditerrainée 2.
Chap 1 Grammaires et dérivations.
Scripts et fonctions Instructions de contrôle
Résolution des équations différentielles
Chapitre 4 La représentation des nombres.
Objets et Actions Élémentaires.
Algorithmique Boucles et Itérations
Chap. 3 Récursion et induction. Les définitions par récurrence consistent à construire des objets finis, à partir d'autres, selon certaines règles. Les.
L ES INSTRUCTIONS DE L ECTURE, E CRITURE ET A FFECTATION Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université.
Transcription de la présentation:

Chapitre 3 Machines de Turing

Qu’est-ce qu’un algorithme? Quelque chose qui peut être à l’examen de IFT-17588. Quelque chose qui peut être programmé. (Mais que veut dire “programmer”?) Un ensemble fini d’instructions permettant d’effectuer une tâche donnée. Une recette finie que l’on peut suivre pour obtenir en temps fini une réponse à une question donnée. Je ne sais pas ce que c’est mais je sais faire la différence entre un algorithme et une vache.

Quelques algorithmes Comment additionner/multiplier deux entiers avec plus que 1 chiffre. Algorithme d’Euclide (300 av. J.C) pour calculer le plus grand diviseur commun de deux entiers. Algorithme pour déterminer si une équation ax2 + bx + c = 0 admet une solution. Historiquement, les algorithmes ont d’abord été des façons systématiques d’effectuer une série de calculs afin de résoudre une question mathématique.

Comment formaliser la notion? Une notion formelle d’algorithme devrait répondre aux critères suivants: La description d’un algorithme est finie. On peut également désirer que cette description soit une liste d’instructions. Chaque étape d’exécution peut être effectuée en temps fini. Un algorithme reçoit une entrée finie et retourne une réponse de longueur finie. L’exécution d’un algorithme se termine toujours après un nombre fini d’étapes.

Essais de définition Algorithme: programme C de longueur finie. Pas si mal. Quelques problèmes quand même: Pourquoi pas en Java, en COBOL, en Lisp? Où est la garantie que l’algorithme termine toujours son éxécution après un nombre fini d’étapes?

Espoirs mathématiques fin XIXe Existe-t-il un algorithme qui étant donné un énoncé logique permet de décider si cet énoncé est vrai ou pas. Énoncé de Fermat n  3  x, y, z > 0: xn + yn  zn vrai Subtil algorithme faux

Bref historique Gödel a démontré qu’il existe des vérités mathématiques qu’on ne peut pas démontrer: théorème d’incomplétude. Alan Turing définit en 1934 un processus précis qui est assez général pour représenter toute méthode bien définie pour résoudre des problèmes de façon méthodique et automatisable. De là est né le concept de la machine de Turing. Machines de Turing  formalisation minimaliste de la notion d’algorithme. Thèse de Turing ou Church-Turing : toute notion « raisonnable » d’algorithme est équivalente à la notion de machine de Turing.

Voici une représentation schématique d’une machine de Turing: … ruban Mécanisme de contrôle et indicateur d’état Comme pour les automates finis, le ruban est infini vers la droite.

Différences avec les automates finis La tête peut se déplacer dans les deux sens. C’est une tête de lecture/écriture. Il y a un seul état final, qui est un état d’arrêt (aussitôt que la machine l’atteint, elle s’arrête).

À chaque étape, la machine de Turing lit un symbole ; fait une transition d’état (elle peut rester dans le même état) ; fait l’une des trois actions suivantes : écriture d’un symbole ; déplacement de la tête vers la droite ; déplacement de la tête vers la gauche.

Exemple Voici un diagramme de transitions d’une machine de Turing: a/R  h a/R b/R /a  est l’état initial. h est l’état final (état d’arrêt). /a signifie lire , puis écrire a. a/R signifie lire a, puis déplacer la tête vers la droite. b/R signifie lire b, puis déplacer la tête vers la droite

Définition Une machine de Turing est un sixtuplet ( S, , , , , h) où S est un ensemble fini d’états.  est l’alphabet de la machine ou alphabet d’entrée (les séquences d’entrée sont formées avec cet alphabet). L’espace libre (ou blanc), symbolisé par , ne fait pas partie de , i.e. qu’on a   .

 est l’alphabet du ruban. On a    et   .  est la fonction de transition  : (S - {h})   S  ({L,R}) où L, R . La signification de  est la suivante: (p, x) = (q, y) (où y ) : si dans l’état p le symbole sous la tête est x, remplacer x par y et passer dans l’état q. (p, x) = (q, L) : si dans l’état p le symbole sous la tête est x, déplacer la tête d’une case vers la gauche et passer dans l’état q. (p, x) = (q, R) : si dans l’état p le symbole sous la tête est x, déplacer la tête d’une case vers la droite et passer dans l’état q.

Puisque  est une fonction, la définition précédente est celle d’une machine déterministe, i.e. non ambiguë et totalement définie (l’état h, d’où n’origine aucune transition, a été enlevé de S avant de former le produit cartésien qui est le domaine de .)  est l’état initial. Dans les diagrammes de transitions, il sera indiqué de la même manière que pour les automates finis. h est l’état final (état d’arrêt). Dans les diagrammes de transitions, il sera indiqué par un double cercle, comme d’habitude.

Remarque Une machine de Turing peut : se rendre à l’état final et arrêter; boucler indéfiniment; terminer anormalement en déplaçant la tête à gauche du ruban.

Remarques On suppose que  représente une case inoccupée du ruban : initialement, toutes les cases autres que celles qui contiennent la séquence d’entrée contiennent un . Notez aussi qu’il y a un seul état final.

Exemple Avec la machine suivante on a: a/R /a  h b/R S = {, h}  = {a, b}  = {a, b, } (, a) = (, R) (, b) = (, R) (, ) = (h, a) Tant que cette machine rencontre des a et des b, elle déplace la tête vers la droite. Lorsqu’elle rencontre un blanc, elle passe dans l’état final, en remplaçant ce blanc par un a.

Définition Une configuration d’une machine de Turing, c’est la donnée d’un état et une description du contenu du ruban avec une indication de la position de la tête de lecture. La description du ruban se fait en donnant la séquence de symboles du ruban en commençant par la première case. Le symbole sous la tête de lecture/écriture est souligné. Des … à droite de cette séquence indiquent que le reste du ruban contient des blancs.

Exemple Une configuration possible de la machine suivante est a/R /a  h a/R b/R /a  abba… L’état est . Le premier symbole du ruban est le a de gauche; il est suivi d ’un b,puis d ’un autre b sur lequel se trouve la tête de lecture de la machine.

Supposons que la configuration initiale soit  abba… Les configurations successives sont alors:  h a/R b/R /a État Ruban  abba…  abba…  abba…  abba… h abbaa… arrêt

Exercice Supposons que la configuration initiale de la machine de Turing suivante soit 1 aaa… Donnez les configurations successives à cette configuration initiale. 1 3 a/R  /R a /R /  2

Solution État Ruban 1 aaa… 2 aaa… 3 aaa… 1 3 a/R  /R a /R / 

Exercice Construisez une machine de Turing M = (S, {a, b}, {a, b, }, , , h) qui arrête si et seulement si le patron abab se trouve sur le ruban à droite de la position initiale de la tête de lecture. Donnez la suite de configurations si la configuration initiale est  aabab… Que se passe-t-il si la configuration initiale est  ab ?

Solution 1 5 2 3 4 b/R /R a/R /R b/R  = 1, h = 5

État Ruban 1 aabab… 2 aabab… 1 aabab… 3 aabab… 4 aabab… 5 aabab… arrêt

État Ruban 1 ab… 2 ab… 3 ab… 1 ab… boucle infinie

Avantages et désavantages Simplicité du modèle. Chaque instruction est vraiment réduite à sa plus simple expression. Malgré la simplicité, possède une très grande puissance de calcul. Défaut résultant: pour décrire avec une machine de Turing un processus compliqué, la machine est forcément très complexe.

Machines de Turing calculant une fonction Les machines de Turing que l’on a présentées sont apparemment conçu pour simplement répondre “oui” ou “non”. On peut considérer plus généralement des MT qui calculent des fonctions, c’est à dire que leur sortie est une chaîne de caractères. Plusieurs façons possibles de formaliser cette notion. Par exemple, on peut considérer le contenu du ruban (jusqu’au premier ) après l’arrêt comme étant la valeur calculée par la machine.

Voici une représentation schématique d’une machine de Turing: … ruban Mécanisme de contrôle et indicateur d’état Comme pour les automates finis, le ruban est infini vers la droite.

Thèse de Church-Turing Facile à croire: tout programme en C peut être réécrit comme un programme en Java qui fait la même tâche. Facile à croire: tout programme en C peut-être réécrit comme un programme en assembleur qui fait la même tâche. Facile à croire: tout calcul effectué par une machine de Turing peut-être effectué par un programme en C.

Thèse de Church-Turing N’importe quel calcul automatique peut-être effectué à l’aide d’une machine de Turing. En d’autres mots: la notion intuitive d’algorithme correspond exactement à la notion de machine de Turing.

À cause de la thèse de Church-Turing, nous ne détaillerons pas les constructions de machines de Turing. Pour montrer qu’une tâche de calcul peut-être effectué à l’aide d’une machine de Turing M, on se contentera soit d’une description informelle du fonctionnement de M, soit d’une description de haut niveau d’un algorithme pour effectuer la tâche de calcul.

Exemples Nous avons construit une MT qui acceptait le langage {anbncn: n  N}. On aurait pu simplement écrire cette description informelle. M = “entrée w; Vérifier que w  a*b*c*; replacer la tête à l’extrème gauche et effacer un a, trouver le prochain b et l’effacer, trouver le prochain c et l’effacer. Si on ne peut trouver de b ou de c, arrêter et rejeter; Recommencer 2 tant qu’il reste des a. S’il reste un b ou un c après l’effacement des a, arrêter et rejeter. Sinon, arrêter et accepter.”

... ou cette description “haut-niveau” d’un algorithme pour cette tâche. M = “Entrée w; Vérifier que w  a*b*c*; Compter le nombre de a, de b et de c dans w. Si ces trois nombres sont égaux arrêter et accepter, sinon arrêter et rejeter.

On peut aussi imaginer un langage de programmation très primitif qui correspond presque parfaitement aux machines de Turing. Un pointeur vers la mémoire, initialisé à 1. Mémoire constitué d’un nombre infini de blocs indexés 1, 2, 3, ... Chaque bloc contient un symbole de . Initialement, les k premières cases de mémoire contiennent les k symboles de l’entrée. Les autres contiennent .

Le résultat des différents cas est Un programme est une liste finie d’instructions numérotées de 1 à t. Chaque instruction est un switch qui considère les valeurs possibles de l’instruction courante et du symbole sous le pointeur. Le résultat des différents cas est L’écriture d’un symbole de  dans le bloc sous le pointeur. Possiblement pointeur:= pointeur + 1 ou pointeur := pointeur – 1. Goto instruction ou Halt & accept ou Halt & reject. Les instructions sont simplement les états de la machine et le pointeur la tête de lecture.

Définition de la reconnaissance Soit L un langage sur  et w  *. La séquence w est acceptée (ou reconnue) par la machine de Turing M = (S, , , , , h) si et seulement si M s’arrête normalement (dans l’état final) à la suite d’une exécution commençant dans la configuration  w … Par exemple, avec w = abaa, la configuration initiale est   abaa  … c’est-à-dire … a b État initial

Comme d’habitude, L(M) = {w : M accepte w } est le langage accepté (ou reconnu) par M. Si L = L(M) pour une machine de Turing M, on dit que L est Turing-acceptable ou récursivement énumérable. Ce dernier terme est le terme usuel; il reflète le fait que les séquences d’un tel langage peuvent être énumérées (listées) par une machine de Turing.

Définition équivalente de reconnaissance Voici une définition équivalente de reconnaissance par machine de Turing. Cette définition est plus utile pour faire certaines preuves. Acceptation avec message. Soit M une machine de Turing. M accepte une séquence w avec message si Elle s’arrête dans la configuration O…lorsque w  L(M); Elle ne s’arrête pas ou s’arrête anormalement ou s’arrête dans une configuration autre que O… lorsque w  L(M).

Théorème L’acceptation par arrêt (i.e. la première définition d’acceptation) est équivalente à l’acceptation avec message. Soit M = (S, , , , , h) une machine de Turing qui accepte par arrêt. Il existe une machine de Turing M’ = (S’, , ’, ’, ’, h’) qui accepte avec message et telle que L(M) = L(M’). Soit M = (S, , , , , h) qui accepte avec message. Il existe une M’ = (S’, , ’, ’, ’, h’) qui accepte par arrêt telle que L(M) = L(M’).

Démonstration (aperçu) Soit M = (S, , , , , h) une machine de Turing qui accepte par arrêt. Il existe une machine de Turing M’ = (S’, , ’, ’, ’, h’) qui accepte avec message et telle que L(M) = L(M’). Description informelle de M’: M’ = “Entrée w; Suivre les mêmes étapes que M en marquant la case la plus à gauche du ruban et la case la plus à droite visitée lors du calcul. Si M atteint l’état d’arrêt alors aller à la case la plus à droite et, de droite à gauche, remplacer tout les symboles du ruban par , écrire O sur la seconde case, revenir à la première case et arrêter.”

Démonstration (aperçu) Soit M = (S, , , , , h) une machine de Turing qui accepte avec message. Il existe une machine de Turing M’ = (S’, , ’, ’, ’, h’) qui accepte avec arrêt et telle que L(M) = L(M’). Description informelle de M’: M’ = “Entrée w; Suivre les mêmes étapes que M en marquant la case la plus à gauche du ruban et la case la plus à droite visitée lors du calcul. Si M atteint l’état d’arrêt alors vérifier que la configuration est bien O ... . Si oui, arrêter. Sinon, rentrer dans une boucle infinie.”

Note: contrairement aux notes de cours, j’utiliserai plutôt la notion d’acceptation par message. Dans mes descriptions informelles j’utiliserai les mots clés: “arrêter et accepter” et “arrêter et rejeter”.

Machines de Turing à plusieurs rubans Considérons une machine de Turing à 2 rubans (la notion se généralise facilement à un nombre arbitraire de rubans). … x y x  x y

Une transition d’une telle machine dépend de l’état courant et de l’ensemble des symboles sous les têtes. Une transition consiste en un changement d’état et une écriture ou un déplacement sur un seul ruban. La configuration initiale est w1  … pour le ruban 1 et   … pour le ruban 2.

Théorème Pour toute machine de Turing M avec k rubans (k  N+), il y a une machine de Turing M’ à un ruban telle que L(M) = L(M’).

Démonstration Donnons un aperçu de la preuve. Supposons que M a deux rubans. L’idée de la preuve est que M’ utilise des quadruplets pour encoder la même information sur un ruban unique.

… x y x  x y Par exemple, ces deux rubans seraient représentés par le ruban suivant. # x y  1 La ligne 1 est le contenu du ruban 1; la ligne 2 indique la position de la tête de lecture/écriture du ruban 1; la ligne 3 est le contenu du ruban 2; la ligne 4 indique la position de la tête du ruban 2.

M’ considère que chaque case de ce ruban contient un seul symbole M’ considère que chaque case de ce ruban contient un seul symbole. Le ruban contient le symbole # dans la première cellule. M’ s’en sert comme marqueur afin de simuler M. # x y  1 Donc on ne gagne pas de puissance en utilisant des machines à plusieurs rubans.

Machines de Turing non déterministes Soit  = {0, 1, }. Considérons la machine suivante. 2 1 / R 3 1 0 / L 1 / L  / L 4 1 / 0  / 0 0 / R

Cette machine n’est pas déterministe: 2 1 / R 3 1 0 / L 1 / L  / L 4 1 / 0  / 0 0 / R Cette machine n’est pas déterministe: Elle n’est pas totalement définie car Il n’y a pas de transitions pour 0 et  dans l’état 1; Il n’y a pas de transitions pour 1 et  dans l’état 4.

4 2 1 / R 3 1 0 / L 1 / L  / L 1 / 0  / 0 0 / R Elle est ambiguë car Il y a deux transitions possibles si le symbole courant est 1 dans l’état 1; Il y a deux transitions possibles si le symboles courant est  dans l’état 2;

Définition Tout comme une machine de Turing déterministe, une machine de Turing non déterministe est un sixtuplet (S, , , , , h); cependant la quatrième composante est une relation plutôt qu’une fonction; c’est-à-dire qu’on a   ( S – {h})    S  (  {L, R}) plutôt que  : ( S – {h})    S  (  {L, R}).

Définition (suite) Le langage accepté par une machine de Turing non déterministe M est L(M) = {w : M peut atteindre l’état final à partir de la configuration initiale  w…}.

Théorème Pour chaque machine de Turing non déterministe M, il existe une machine de Turing déterministe D telle que L(M) = L(D).

Démonstration Voici un aperçu de la preuve. La machine D a trois rubans. Le ruban 1 contient la séquence d’entrée w. Le ruban 2 est un ruban de travail sur lequel E copie w et essaie chacune des séquences d’exécution possibles. Le ruban 3 contient une séquence d’exécution (séquence de transitions). Après l’essai d’une séquence, la séquence suivante est générée en ordre lexicographique.

2 1 / R 3 1 0 / L 1 / L  / L 4 1 / 0  / 0 0 / R Par exemple, la machine de Turing non déterministe ci-dessus a sept transitions; supposons qu’elles sont numérotées de 1 à 7. Les séquences d’exécution seraient 1, 2, 3, 4, 5, 6, 7, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1, 7, 2, 1, 2, 2, … 1, 1, 1, 1, 1, 2, 1, 1, 3,…

Plusieurs de ces séquences de transitions ne correspondent pas à une exécution possible. Ce n’est pas grave; ces séquences incorrectes conduisent simplement à un rejet de la séquence d’entrée. L’important c’est de générer éventuellement n’importe quelle séquence possible. Si l’une des simulations conduit à l’état d’acceptation (ici, 3), D accepte.

Remarque L’ajout du non-déterminisme ne permet pas de reconnaître plus de langages. Cependant, on voit que l’acceptation d’une séquence w par D peut nécessiter un nombre d’étapes beaucoup plus grand que celui qui est nécessaire à M pour accepter w.

Théorème Les langages reconnus par les machines de Turing sont exactement les langages générés par les grammaires à structures de phrase.

Rappel: un langage L est Turing-acceptable s’il existe une machine de Turing M tel que étant donnée une entrée w Si w  L alors M s’arrête et accepte w. Si w  L alors M s’arrête et rejette w ou ne s’arrête pas. La seconde condition pose problème car elle ne correspond pas à notre idée d’algorithme raisonnable.

Exemple Le langage L = {a0 + a1x + ... + anxn : il existe x  N+ tel que a0 + a1x + ... + anxn = 0} Montrons que ce langage est Turing-acceptable grâce à la machine M suivante. M = “Entrée a0 + a1x + ... + anxn; Initialiser x = 1; Si a0 + a1x + ... + anxn = 0 alors arrêter et accepter. Sinon x := x+1. Répéter 2 et 3 tant que M n’arrête pas.”

Comment résoudre ce problème? Bien que L soit Turing-acceptable, on ne peut pas raisonnablement utiliser l’algorithme ci-dessus car si l’équation n’a aucune solution, notre algorithme roulera indéfiniment. En ce sens, la notion de Turin-acceptable ne correspond pas vraiment à ce que l’on “peut faire avec un ordinateur”. Comment résoudre ce problème? S’assurer que la machine termine. (mais comment faire ça?) Raffiner nos concepts.

Définition Un langage L est Turing-décidable (ou simplement décidable) s’il existe une machine de Turing M qui recevant w en entrée s’arrête et accepte si w  L. s’arrête et rejette si w  L.

Note: par définition, tout les langages décidables sont également des langages Turing-acceptables. Par contre, nous verrons que l’inverse n’est pas vrai.

Théorème Si L est un langage non-contextuel, alors L est un langage décidable.

Démonstration Supposons que K est un langage non-contextuel et que G = (V, T, S, R) est une grammaire en forme normale de Chomsky telle que L(G) = K. On veut montrer qu’il existe une machine de Turing qui étant donné w s’arrête et accepte si w peut être généré par G et s’arrête et rejette si w ne peut être généré.

Description “haut-niveau” d’un algorithme. M = “Entrée w; Définir k := |w|; Énumérer toutes les dérivations possibles de longueur 2k – 1 dans G. Si une de ces dérivations génère w alors arrêter et accepter. Sinon, arrêter et rejeter.” Comme le nombre de dérivations de longueur 2k-1 est fini, cet algorithme finit toujours par s’arrêter. Dans une grammaire en CNF, la dérivation d’un mot de longueur k prend exactement 2k-1 étapes.

On a donc une série d’inclusions strictes: Langages réguliers a*b*, {w: w contient au moins 2 a}, etc. Langages non-contextuels {an bn: n  N}, ensemble des palindromes, etc. Langages décidables {an bn cn : n  N}, {<M>: M un automate fini et L(M) } Langages Turing-acceptables Lh = {<M>: M une m.t. et M accepte <M>} Langages non-acceptables {<M>: M une m.t. et M n’accepte pas <M>}, NVTM

Tous les langages Turing-acceptables Décidables Non-contextuels Réguliers

Théorème Si L est décidable alors son complément Lc est également décidable.

Supposons que L est décidable grâce à la machine de Turing T. Preuve Supposons que L est décidable grâce à la machine de Turing T. Considérons la machine suivante: S = « entrée w: Simuler T sur w; Si T accepte w alors rejeter w. Si T rejette w alors accepter w; »

Pour toute entrée w, la machine S simule T sur w et comme T décide L, cette simulation se termine toujours. Donc S s’arrête toujours. L(S) = Lc car w est accepté par S ssi w est rejeté par T. Donc S décide le langage Lc.

Théorème Si L est Turing acceptable et si son complément Lc est également Turing acceptable alors le langage L est décidable.

Preuve Supposons que M et N sont des machines de Turing telles que L(M) = L et L(N) = Lc. Nous n’avons par contre pas de garantie que M et N terminent les exécutions sur des mots qu’ils n’acceptent pas.

Considérons la machine suivante. T = « Entrée x: Répéter étapes 2 et 3 jusqu’à l’arrêt; Simuler une étape du calcul de M sur x. Si M accepte x, alors T accepte x; Simuler une étape du calcul de N sur x. Si N accepte x alors T rejette x; »

Que fait T? Considérons deux cas: Si x  L alors M accepte x en un nombre fini d’étapes. Donc T accepte x en un nombre fini d’étapes. Si x L alors on a x  Lc. Donc N accepte x en un nombre fini d’étapes. Donc T rejette x en un nombre fini d’étapes.  T décide L.