Document

publicité
Chapitre 3
Machines de Turing
1
Qu’est-ce qu’un algorithme?
1. Quelque chose qui peut être à l’examen de
IFT-17588.
2. Quelque chose qui peut être programmé.
(Mais que veut dire “programmer”?)
3. Un ensemble fini d’instructions permettant
d’effectuer une tâche donnée.
4. Une recette finie que l’on peut suivre pour
obtenir en temps fini une réponse à une
question donnée.
5. 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?
•
1.
2.
3.
4.
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:
1. Pourquoi pas en Java, en COBOL, en Lisp?
2. 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
1. La tête peut se déplacer dans les deux
sens.
2. C’est une tête de lecture/écriture.
3. 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
1. lit un symbole ;
2. fait une transition d’état (elle peut rester
dans le même état) ;
3. 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
/a

  est l’état initial.
h
b/R
 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ù
1. S est un ensemble fini d’états.
2.  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   .
3.  est l’alphabet du ruban. On a    et   .
4.  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 .)
5.  est l’état initial. Dans les diagrammes de
transitions, il sera indiqué de la même
manière que pour les automates finis.
6. 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
•
1.
2.
3.
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

S = {, h}
 = {a, b}
 = {a, b, }
(, a) = (, R)
(, b) = (, R)
(, ) = (h, a)
/a
h
b/R
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
 abba…

/a
b/R
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.
h
Supposons que la configuration initiale soit  abba…
Les configurations successives sont alors:
État




h
a/R
Ruban
abba…
abba…
abba…
abba…
abbaa… arrêt
/a

b/R
h
Exercice
• Supposons que la configuration initiale de la
machine de Turing suivante soit
1 aaa… Donnez les configurations
successives à cette configuration initiale.
3
/ 
1
a/R
 /R
a /R
2
Solution
3
État
/ 
Ruban
1
aaa…
2
aaa…
1
aaa…
2
aaa…
1
aaa…
3
aaa…
1
a/R
 /R
a /R
2
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
b/R
/R
a/R
/R
1
2
3
a/R
b/R
4
a/R
5
b/R
a/R
b/R
/R
/R
 = 1, h = 5
État
Ruban
1
aabab…
2
aabab…
1
aabab…
2
aabab…
3
aabab…
4
aabab…
5
aabab…
arrêt
État
1
Ruban
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;
1. Vérifier que w  a*b*c*;
2. 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;
3. 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;
1. Vérifier que w  a*b*c*;
2. 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 .
•
•
•
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
1. L’écriture d’un symbole de  dans le bloc sous le
pointeur.
2. Possiblement pointeur:= pointeur + 1 ou
pointeur := pointeur – 1.
3. 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 a a
É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.
1.
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’).
2.
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)
1.
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;
1.
2.
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)
1.
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;
1.
2.
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
…
 x y 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.
• Par exemple, ces
deux rubans
seraient
représentés par le
ruban suivant.
# x y x
  1
 x y
  
x   
   
y   
 1  
x y x x
…
 x y y
…
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.
# x y x
  1
 x y
  
x   
   
y   
 1  
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.
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.
1
1/R
0/L
1/L
/L
2
/0
1/0
4
3
0/R
0/L
1/L
/L
1/R
1
2
3
/0
1/0
0/R
4
Cette machine n’est pas déterministe:
1. 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.
0/L
1/L
/L
1/R
1
2
3
/0
1/0
0/R
4
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.
1. Le ruban 1 contient la séquence d’entrée w.
2. Le ruban 2 est un ruban de travail sur lequel E
copie w et essaie chacune des séquences
d’exécution possibles.
3. 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.
0/L
1/L
/L
1/R
1
2
3
/0
1/0
0/R
4
• 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 Turingacceptable 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;
1.
2.
3.
4.
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.”
•
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?
1. S’assurer que la machine termine. (mais
comment faire ça?)
2. 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 noncontextuel 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;
1. Définir k := |w|;
2. Énumérer toutes les dérivations possibles de
longueur 2k – 1 dans G.
3. 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.
Preuve
Supposons que L est décidable grâce à la
machine de Turing T.
Considérons la machine suivante:
S = « entrée w:
1. Simuler T sur w;
2. 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:
1. Répéter étapes 2 et 3 jusqu’à l’arrêt;
2. Simuler une étape du calcul de M sur x. Si M
accepte x, alors T accepte x;
3. 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.
Téléchargement