• Aucun résultat trouvé

Machine de Turing, calculabilité et complexité

On rappelle maintenant quelques notions de calculabilité et de complexité. Il serait impossible d’être exhaustif sur ce sujet, et l’on se contente donc de donner les concepts utiles pour la suite. Pour plus de détails sur ces notions, on consultera par exemple [69, 82, 44].

On commence par rappeler la notion de machine de Turing. Informellement, il s’agit d’une machine possédant un contrôle fini et travaillant sur un ruban qui est infini à droite. Sur ce ruban est écrit un mot fini suivi d’une infinité de symboles blancs. La machine possède une tête de lecture qui pointe au départ sur la case la plus à gauche. Un calcul commence dans un état de contrôle particulier, l’état initial. Selon l’état de contrôle et la lettre sous la tête de lecture, la machine récrit le symbole courant, change d’état de contrôle, et peut éventuellement se déplacer d’une case vers la gauche ou vers la droite. Enfin, elle peut s’arrêter, signifiant ainsi que le calcul est terminé, et éventuellement que le mot est accepté ou rejeté. Plus formellement, on a les définitions suivantes (calquées sur [69]).

Définition 1.38 Une machine de Turing déterministe est un quadruplet M = (Q,A, qin,δ), où Q est un ensemble fini d’états, qin ∈ Q est l’état initial, et A est un alphabet

fini, disjoint de Q. L’alphabet A contient toujours deux symboles particuliers, ⊔ et ¤: le blanc et le marqueur de début. Enfin, la fonction de transition δ est une application de Q × A dans (Q ∪ {yes,no,h}) × A × {← , → ,−}, où l’on suppose que l’état acceptant yes, l’état rejetant no, et l’état d’arrêt h ne sont pas dans Q, et que les symboles ← , → ,− ne sont pas dans Q ∪ A.

La fonction de transition δ donne, pour tout état de contrôle q ∈ Q et tout symbole courant a ∈ A, un triplet δ(q,a) = (q′,a,D), où qest le nouvel état de

contrôle, a′ le symbole qui doit être écrit à la place de a, et D ∈ {← , → ,−} la

direction dans laquelle doit aller la tête de lecture. Si D =←, la tête se déplace vers la gauche, si D =→, la tête se déplace vers la droite, et si D = − elle ne bouge pas. On demande de plus, pour tout état q, que δ(q,¤) soit toujours de la forme

(q′, ¤ , →) : le marqueur de début n’est jamais effacé, et l’on ne va jamais à sa gauche.

Au départ, l’état de contrôle est qin, et le ruban contient ¤ suivi d’un mot fini

x ∈ (A \ {⊔})∗. On dit que x est l’entrée de la machine de Turing. La tête de lecture pointe sur le premier symbole, c’est-à-dire sur ¤.

A partir de la configuration initiale, la machine applique une transition selon δ, en changeant d’état, en écrivant un nouveau symbole, et en déplaçant sa tête de lecture. Elle applique ensuite une nouvelle transition et ainsi de suite. Les restrictions sur δ(q,¤) permettent de faire en sorte que ¤ ne soit jamais remplacé par un autre symbole, et que la tête de lecture ne sorte pas à gauche du ruban.

Lorsque la tête arrive sur une case jamais lue, on considère que celle-ci contient le symbole blanc ⊔, qui peut alors être récrit. Ainsi le contenu du ruban peut devenir arbitrairement long.

Comme δ est une application, la machine ne s’arrête à priori jamais. Cependant, elle s’arrête dans trois cas : en atteignant l’état h, l’état yes ou l’état no. Si elle atteint l’état yes, on dit que la machine accepte, si elle atteint l’état no, on dit qu’elle rejette. Si elle s’arête sur l’entrée x, on définit la sortie M(x) de la machine comme suit. Si on arrive dans yes, M(x) = yes, si on arrive dans no, M(x) = no et si on arrive dans h, M(x) est le contenu du ruban au moment où la machine s’arête. Dans ce dernier cas, M(x) = ¤y avec y ∈ A∗. Enfin, si la machine ne s’arrête pas

sur x, on note M(x) =ր

Pour une définition plus formelle d’un calcul d’une machine de Turing, on intro- duit la notion de configuration. Une configuration est un triplet (q,u,v), où q ∈ Q et où uv est le contenu du ruban, c’est-à-dire que uv ∈ ¤A∗. Le triplet (q,u,v) re-

présente une configuration de la machine dans laquelle l’état de contrôle est q, où le ruban contient uv, et où la tête de lecture pointe sur le premier symbole de v.

Considérons une configuration (q,u,v). On appelle a le premier symbole de v = av′′ et l’on pose δ(q,a) = (q,a,D). Si D =→, on pose u= uaet v= v′′. Si

D =←, on pose u = u′b et v′ = ba′v′′. Enfin, si D = −, on pose u′ = u et

v′ = av′′. La configuration (q,u,v) est alors le successeur de (q,u,v), ce que l’on

note (q,u,v)−→ (qM ′,u,v). Enfin, on note−→ la clôture transitive de la relationM∗ −→.M

Dans la suite, nous serons souvent amenés à simuler des machines de Turing. Pour cela on adoptera le codage suivant des configurations : une configuration (q,u,v) sera identifiée au mot uqv.

Le principal intérêt des machines de Turing est de caractériser des langages. Définition 1.39 Soit un langage L sur l’alphabet A \ {⊔}. Soit une machine de Turing M sur l’alphabet A, telle que pour toute entrée x ∈ (A \ {⊔})∗ si x ∈ L alors

M (x) = yes, et si x /∈ L alors M (x) = no. On dit alors que M décide L. Si L est décidé par une machine de Turing, on dit qu’il est récursif ou décidable.

On dit que M accepte un langage L lorsque pour toute entrée x ∈ (A \ {⊔})∗

si x ∈ L alors M (x) = yes, et si x /∈ L alors M (x) =ր. Si L est accepté par une machine de Turing, on dit qu’il est récursivement énumérable ou demi-décidable.

Considérons enfin une application de (A \ {⊔})∗ dans Aet une machine de

Turing sur l’alphabet A. On dit que M calcule f si pour toute entrée x ∈ (A \ {⊔})∗,

Les machines de Turing permettent donc de reconnaître des langages. Si l’on considère comme entrée le codage d’une instance d’un problème, on peut alors voir une machine de Turing comme un algorithme acceptant ou rejetant l’entrée. Ainsi, un problème (et un codage associé) sera dit décidable si le langage des codages des instances positives du problème est décidable.

On souhaite raffiner la notion précédente en considérant deux facteurs : le temps (c’est-à-dire le nombre de transitions) mis par la machine de Turing pour accepter, ainsi que l’espace utilisé par cette dernière. On définit alors les notions suivantes. Définition 1.40 Soit une fonction f de N dans lui même. Un langage L est décidé en temps f (n) par une machine M , si M décide L, et si pour toute instance x, la machine accepte ou rejette x en f (|x|) étapes de calcul au plus. Dans ce cas, on dit que L ∈ time(f (n)). On définit facilement la même notion pour les fonctions calculables.

Définition 1.41 Soit une fonction f de N dans lui même. Un langage L est décidé en espace f (n) par une machine M si M décide L et si pour toute instance x, le nombre de symboles non blancs écrits sur le ruban lors du calcul de la machine sur x n’excède pas f (|x|). Dans ce cas, on dit que L ∈ space(f (n)). On définit facilement la même notion pour les fonctions calculables.

Pour toute fonction f de N dans lui même, les classes de langages time(f(n)) et space(f(n)) sont des classes de complexité en temps et en espace.

Comme dans le cas des automates finis (qui sont un cas particulier de machines de Turing qui lisent de gauche à droite sans récrire et qui s’arrêtent une fois le mot lu en entier), on définit les notions de machine de Turing non déterministes et alternantes. Nous nous contentons ici de donner des définitions informelles de ces deux notions.

Une machine de Turing non déterministe est un quadruplet M = (Q,A,qin,∆),

défini comme précédemment, sauf que maintenant ∆ est à valeur dans P((Q ∪ {yes,no,h}) × A × {← , → ,−}). Ainsi, une configuration peut avoir plusieurs successeurs, et il n’y a donc plus un unique calcul sur une entrée donnée. Un langage L ⊆ A∗ est accepté par une machine de Turing non déterministe M si pour tout

x ∈ A∗, x ∈ L si et seulement s’il existe un calcul acceptant sur x

A nouveau, on définit les notions de temps et d’espace. On considère une fonction f de N dans lui-même. On dit qu’une machine de Turing non déterministe M décide un langage L en temps f(n) si M décide L, et si pour toute entrée x, tout calcul de M sur x prend au plus f (|x|) étapes. De même, on dit qu’une machine de Turing non déterministe M décide un langage L en espace f(n) si M décide L, et si pour toute entrée x, le nombre de symboles écrits sur le ruban lors d’un calcul de la machine sur x n’excède pas f(|x|). On note ntime(f(n)) et nspace(f(n)) les classes de complexité associées.

Une machine de Turing alternante est un quadruplet M = (Q,A,qin,δ) défini

comme précédemment, sauf que maintenant δ est à valeur dans B+((Q∪{yes,no,h})×

A × {← , → ,−}). Ainsi, dans une configuration, la machine lance plusieurs calculs en parallèle correspondant à des transitions satisfaisant une formule booléenne po- sitive. Un calcul est donc un arbre dont les branches sont des calculs au sens des

machines déterministes. Un calcul est acceptant si toutes les branches le composant sont des calculs acceptants. Un langage L ⊆ A∗ est accepté par une machine de

Turing alternante M si pour tout x ∈ A∗, x ∈ L si et seulement s’il existe un arbre

de calcul acceptant sur x.

A nouveau, on définit les notions de temps et d’espace. On considère une fonction f de N dans lui-même. On dit qu’une machine de Turing alternante M décide un langage L en temps f(n) si M décide L, et si pour toute entrée x, toute branche dans un calcul de M sur x prend au plus f(|x|) étapes. De même, on dit qu’une machine de Turing alternante M décide un langage L en espace f(n) si M décide L, et si, pour toute entrée x, le nombre de symboles écrits sur le ruban lors d’une branche du calcul de la machine sur x n’excède pas f(|x|). On note atime(f(n)) et aspace(f (n)) les classes de complexité associées.

On donne maintenant quelques classes de complexité classiques : – P =Sj>0time(nj). – NP =Sj>0ntime(nj). – Pspace =Sj>0space(nj). – NPspace =Sj>0nspace(nj). – Dexptime =Sj>0time(2nj). – Expspace =Sj>0space(2nj ).

– k-Dexptime = Sj>0time(tow(k,nj)), où la fonction tow(k,n) est la tour d’exponentielle de hauteur k, c’est-à-dire que tow(0,n) = n et tow(k + 1,n) = 2tow(k,n)

– Elementary =Sk>0k-Dexptime est la classe des problèmes élémentaires. – pour toute classe de complexité C on pose coC = {L | L ∈ C} la classe des

langages dont le complémentaire est dans C. On donne quelques résultats classiques.

Proposition 1.8 Pour toute fonction propre de complexité (voir [69] pour la défi- nition précise) on a :

– time(f (n)) ⊆ ntime(f (n)) ⊆ space(f (n)) ⊆ nspace(f (n)). – nspace(f (n)) ⊆Sj≥1time(jlog n+f (n)).

Proposition 1.9 (Savitch) Pour toute fonction propre de complexité f (n) ≥ log n, on a nspace(f (n)) ⊆ space(f2(n)). En particulier, on a l’égalité suivante :

NPspace= Pspace.

Proposition 1.10 (Immerman-Szelepscényi) Pour toute fonction propre de com- plexité f (n) ≥ log n, on a nspace(f (n)) = conspace(f (n)).

Enfin, on a le lien suivant entre les classes de complexité alternantes en espace et les classes de complexité déterministes en temps.

Proposition 1.11 [25, 48, 24] Pour toute fonction propre de complexité f (n) ≥ log n, on a aspace(f (n)) =Sj≥1time(jf (n)). En particulier, on a les égalités sui-

vantes :

– k-Dexptime =Sj≥1aspace(tow(k − 1,nj)), pour tout k ≥ 2.

Etant donné un problème, on souhaitera déterminer s’il est décidable et le cas échéant dans quelle classe de complexité se trouve le langage des instances positives du problème. Cependant, on sera également intéressé par donner une borne supé- rieure. Pour cela, on introduit la notion de réduction polynomiale et de problème complet.

Définition 1.42 Soient deux langages L1 et L2. On dit que L1 se réduit polyno-

mialement à L2 s’il existe une fonction f calculable en temps polynomial telle que

pour tout x, x ∈ L1 si et seulement si f (x) ∈ L2. En particulier, si L2 ∈ C on a

L1 ∈ C pour toute classe C = P,NP,coNP,Pspace,Dexptime,2-Dexptime, . . . .

Soit une classe de complexité C et un langage L. Le langage L est C-dur si et seulement si tout problème dans C se réduit polynomialement à L. De plus, si L ∈ C, il est dit C-complet.

On a alors le résultat suivant.

Proposition 1.12 Soit une classe de complexité en temps time(f (n)) (respective- ment ntime(f (n))). Le langage des descriptions de machines de Turing détermi- nistes (respectivement non déterministes) fonctionnant en temps f (n) et acceptant l’entrée vide est time(f (n))-complet (respectivement ntime(f (n))-complet).

Soit une classe de complexité en espace space(f (n)) (respectivement

aspace(f (n))). Le langage des descriptions des machines de Turing déterministes (respectivement alternantes) fonctionnant en espace f (n) et acceptant l’entrée vide est space(f (n))-complet (respectivement aspace(f (n))-complet).

Par exemple, lorsque l’on souhaitera prouver qu’un problème est Dexptime-dur, il suffira de prouver qu’il est aspace(n)-dur, et pour cela, il suffira de montrer qu’il permet de simuler le comportement d’une machine de Turing alternante d’espace linéaire.

Enfin, on termine par le théorème de Cook.

Théorème 1.6 (Cook) Le problème sat, consistant à décider si une formule de la logique propositionnelle sous forme normale disjonctive avec trois littéraux par clause est satisfiable, est un problème NP-complet.

Chapitre

2

Jeux à deux joueurs sur un graphe

Sommaire

2.1 Définitions . . . 48

2.1.1 Jeu, partie, condition de gain . . . 48

2.1.2 Stratégies et positions gagnantes . . . 51

Documents relatifs