Définitions alternatives
On a vue que le modèle de la machine de Turing permet de créer des programmes ayant les mêmes structures de contrôle que le pseudo-assembleur. C'est au niveau de la gestion de la mémoire que le modèle de la machine de Turing semble moins complet :
- on ne peut lire/écrire qu'au niveau du curseur qui ne peut se déplacer que d'une case par instruction
- il n'y a pas de registre
Nous allons montrer que ce n'est qu'une apparence et qu'en réalité, on peut gérer la mémoire exactement comme on le ferait en pseudo-code.
Nous allons pour cela donner 4 définitions alternatives mais équivalentes d'une machine de Turing.
Machine de Turing à accès aléatoire en mémoire
Commençons par un cas simple, le fait de ne pas avoir à se déplacer que de 1 case à la fois :
définition
Une machine de Turing à accès aléatoire en mémoire est composée :
- d'un ruban (supposé infini) constitué de cases contiguës pouvant chacune contenir soit le caractère
0
soit le caractère1
- d'un curseur qui est positionné sur une case du ruban (on suppose que le ruban est infini à gauche et à droite du curseur)
- d'un ensemble fini
d'états possibles, contenant les étatsSTART
etSTOP
- d'un état courant
- d'une fonction de transition
dépendant de l'état de la machine et du caractère contenu dans la case du ruban pointée par le curseur. Cette fonction définie sur permet de modifier :- l'état de la machine :
- le caractère de la case du ruban pointée par le curseur :
- la position du curseur :
- l'état de la machine :
À l'exécution d'une machine de Turing à accès aléatoire en mémoire, le curseur peut se déplacer d'autant de case vers la droite (si positif) ou la gauche (si négatif) qu'il le souhaite.
Simulation d'une machine à accès aléatoire en mémoire par une machine simple
Comme le nombre de cases où se déplace le curseur est dans la fonction de transition, c'est une constante associée à chaque état. On peut alors pour chaque état ajouter une chaîne d'état se déplaçant que d'une case et modifier la machine à accès aléatoire en mémoire pour qu'elle ne se déplace plus que d'une case à droite ou une case à gauche.
Ainsi, supposons que
: dans ce cas là on modifie la transition et on ajoute 1 états : ( valant 0 ou 1)
: dans ce cas là on modifie la transition et on ajoute états :- ...
( valant 0 ou 1)- ...
( valant 0 ou 1)
: identique au cas précédent, mais dans l'autre sens.
En appliquant ce procédé à tous les état de la machine, on a maintenant une machine équivalente à la machine précédente mais qui se déplace toujours d'une case vers la droite ou une case vers la gauche : c'est une machine classique.
Equivalence avec la machine de Turing classique
La construction précédente permet d'écrire :
Proposition
Toute machine de Turing à accès aléatoire en mémoire peut être simulée par une machine de Turing simple.
Les deux notions sont donc équivalentes.
Machine à plusieurs curseurs
Une machine de Turing à
définition
Une machine de Turing à
- de un ruban (supposé infini) constitué de cases contiguës pouvant chacune contenir soit le caractère
0
soit le caractère1
- de
curseurs, positionnés sur une case de son ruban (on suppose que le ruban est infini à gauche et à droite du curseur) - d'un ensemble fini
d'états possibles, contenant les étatsSTART
etSTOP
- d'un état courant
- d'une fonction de transition
dépendant de l'état de la machine et des caractères contenus dans chaque case des rubans pointée par son curseur associé. Cette fonction définie sur permet de modifier :- l'état de la machine :
- les caractères des cases pointées par chaque curseur
: - les positions des
curseurs :
- l'état de la machine :
Cette machine permet de prendre en compte plusieurs cases du ruban pour les transition. La gestion des curseurs est faite ainsi :
- A l'initialisation, les
curseurs sont considérés être sur la même case - A l'exécution, on effectue l'écriture dans l'ordre des curseurs pour rendre déterministe le comportement d'une étape où deux curseurs sont sur la même case.
On va montrer que cette extension n'en est pas vraiment une car on peut toujours transformer une machine à plusieurs curseurs en une machine de Turing normale équivalente.
Nous allons pour cela montrer que l'on peut simuler une machine à 2 curseurs par une machine à un curseur.
Simulation d'une machine à curseurs par une machine simple
Le principe de cette conversion est d'associer à chaque case du ruban de la machine à deux curseurs, une
Chaque paquet est décomposé ainsi :
- case d'indice 0 : une borne. Un marqueur valant 1 pour une case strictement plus à gauche de tous les curseurs (sera utile pour la suite)
- case d'indice 1 : un marqueur valant 1 si le curseur 1 est est dans la case, 0 sinon
- case d'indice 2 : un marqueur valant 1 si le curseur 2 est est dans la case, 0 sinon
- ...
- case d'indice
: un marqueur valant 1 si le curseur est est dans la case, 0 sinon - case d'indice
: valeur de la case associée
Par exemple si l'on a la machine à 2 curseurs suivante :
numéro case : 12345
ruban : 00101
curseurs : ^ ^
1 2
Machine à 1 curseur simulant la machine :
case machine à 2 curseurs : 1 2 3 4 5
ruban : 10000100000100100001
indice paquet de 4 cases : 01230123012301230123
On initialise la machine comme suit :
ruban : 10000110000000000000
curseur : ^
indice paquet de 4 cases : 01230123012301230123
L'idée force est de multiplier les états de la machine pour stocker l'état de tous les curseur et le nouvel état vers lequel aller. Ceci est possible car il n'y a que 2 possibilités de valeur pour chaque case (0 ou 1) et un nombre fini d'états. Pour chaque état
On suppose que l'on est dans le cas où la machine à 1 ruban simulant la machine à deux rubans est telle que :
- son état est
- une seule case contient le marqueur du curseur
à 1 ( ) - une seule case contient le marqueur de la borne à 1 et est strictement à gauche des marqueurs des curseurs 1 et 2
- le curseur est placé sur la case contenant le marqueur de borne
Les différentes étapes ci-après permettent de simuler l'avancement de la machine à
- préparer le nouvel état :
- passer de l'état
à l'état
- passer de l'état
- trouver l'état actuel. On exécute la procédure suivante avec les paramètres
pour allant de 1 à k:- se déplacer de
cases vers la droite - si
1
sur le ruban aller en 5 - se déplacer de
cases vers la droite - aller en 1
- se déplacer de
cases vers la droite - passer de l'état
à l'état où : pour tout vaut la valeur du ruban (1
ou0
)
- se déplacer de
cases vers la gauche - se déplacer de
cases vers la gauche - si
0
sur le ruban aller en 7.
- se déplacer de
- passer de l'état
à l'état - Écriture des nouvelles valeurs sur le ruban. On exécute la procédure suivante avec les paramètres
pour allant de 1 à k:- se déplacer de
cases vers la droite - si
1
sur le ruban aller en 5 - se déplacer de
cases vers la droite - aller en 1
- se déplacer de
cases vers la droite - placer
sur le ruban - se déplacer de
cases vers la gauche - se déplacer de
cases vers la gauche - si
0
sur le ruban aller en 7.
- se déplacer de
- Déplacement des curseurs. On exécute la procédure suivante avec les paramètres
pour allant de 1 à k:- se déplacer de
cases vers la droite - si
1
sur le ruban aller en 5 - se déplacer de
cases vers la droite - aller en 1
- écrire
0
sur le ruban - si
se déplacer de cases vers la droite, sinon cases vers la gauche - écrire
1
sur le ruban - se déplacer de
cases vers la gauche - si
0
sur le ruban aller en 14. - écrire
0
sur le ruban - se déplacer de
cases vers la gauche - écrire
1
sur le ruban - aller en 15
- se déplacer de
cases vers la gauche - si
0
sur le ruban aller en 14.
- se déplacer de
- fin de transition :
- passer de l'état
à l'état
- passer de l'état
Après ces 6 méta-étapes, la machine est de nouveau dans un état stable et peut recommencer son cycle.
Les étapes précédentes peuvent être écrite en utilisant le formalisme des compositions de machine. Ceci fonctionne car
Exemple
Supposons que l'on ait la machine à deux ruban suivante :
numéro case : 12345
ruban : 010101
curseurs : ^ ^
2 1
Et qu'il soit simulé par la machine à 1 ruban :
indice paquet de 4 cases : 012301230123012301230123
ruban : 000010010010000101000001
curseur : ^
On veut passer de à l'état
indice 4-cases : 012301230123012301230123
étape - état
1 - (q, x, x, z) : 000010010010000101000001
: ^
2.1 - (1, q, x, x, z) : 000010010010000101000001
: ^
...
TBD finir l'exemples faire l'exemple avec 2 curseurs. Parler des différentes parties. En particulier le décalage de la borne
Cela fait tout un tas de transitions, mais on arrive bien à simuler les
Equivalence avec la machine de Turing classique
Proposition
Toute machine de Turing à
Les deux notions sont donc équivalentes.
Machine à plusieurs rubans
Une machine de Turing à
définition
Une machine de Turing à
- de
rubans (supposés infinis) constitués de cases contiguës pouvant chacune contenir soit le caractère0
soit le caractère1
- de
curseurs, un par ruban, positionnés sur une case de son ruban (on suppose que le ruban est infini à gauche et à droite du curseur) - d'un ensemble fini
d'états possibles, contenant les étatsSTART
etSTOP
- d'un état courant
- d'une fonction de transition
dépendant de l'état de la machine et des caractères contenus dans chaque case des rubans pointée par son curseur associé. Cette fonction définie sur permet de modifier :- l'état de la machine :
- les caractères des cases de chaque ruban
pointées par les curseurs : - les positions des
curseurs :
- l'état de la machine :
L'exécution est alors identique à la machine simple. Tout se passe comme si on avait
De même, l'entrée et la sortie se généralise aisément en considérant l'ensemble des
Cette généralisation semble permettre plein de choses nouvelles ! Mais il n'en est rien : on peut toujours transformer une machine à plusieurs rubans en une machine de Turing normale équivalente.
Pour prouver ceci, nous allons montrer que l'on peut simuler une machine à 2 rubans par une machine à 1 ruban. Ceci va prendre plusieurs étapes.
Simulation d'une machine à 2 rubans par une machine classique
Représentons une machine à 2 rubans par le schéma suivant :
curseur 1 : v
ruban 1 : ...000111001001001...
ruban 2 : ...000111001001001...
curseur 2 : ^
A priori les deux rubans sont décorrélées, mais comme à l'initialisation les deux rubans sont remplis de 0, les deux rubans peuvent être considérés comme superposés :
curseur 1 : v
ruban 1 : ...000000000000000...
ruban 2 : ...000000000000000...
curseur 2 : ^
- déplace de deux
- superpose les 2 rubans en affectant les cases paire au ruban 1 et les cases impaires au ruban 2
Une machine à deux rubans est donc équivalente à une machine à un ruban et 2 curseurs. Chaque curseur :
curseur 1 : v
ruban : ...000000000000000...
curseur 2 : ^
ruban initial : 212121212121212
On modifie également la fonction de transition pour qu'elle se déplace de 2 cases à chaque déplacement de curseur.
Equivalence avec la machine de Turing classique
La procédure précédente peut se généraliser à
Proposition
Toute machine de Turing à
Les deux notions sont donc équivalentes.
Machines à plusieurs curseurs et rubans
On peut bien sur combiner les deux approches et construire une machine de Turing à
Proposition
Toute machine de Turing à
Les deux notions sont donc équivalentes.
preuve
preuve
En utilisant les technique de preuve précédentes on arrive facilement à montrer que :
- toute machine de Turing à
rubans et curseurs peut être simulée par une machine de Turing rubans et curseurs. - toute machine de Turing à
rubans et curseurs peut être simulée par une machine de Turing rubans et curseur.
Alphabets
Ne travailler qu'avec des 0
et des 1
peut sembler réducteur :
définition
Une machine de Turing sur un alphabet
- d'un ensemble fini
nommé alphabet - un caractère blanc, élément de
- d'un ruban (supposé infini) constitué de cases contiguës pouvant chacune contenir des caractères de
- d'un curseur qui est positionné sur une case du ruban (on suppose que le ruban est infini à gauche et à droite du curseur)
- d'un ensemble fini
d'états possibles, contenant les étatsSTART
etSTOP
- d'un état courant
- d'une fonction de transition
dépendant de l'état de la machine et du caractère contenu dans la case du ruban pointée par le curseur. Cette fonction définie sur permet de modifier :- l'état de la machine :
- le caractère de la case du ruban pointée par le curseur :
- la position du curseur :
- l'état de la machine :
L'exécution est alors identique à la machine simple, sauf pour l'initialisation où le ruban est rempli de caractères blanc plutôt que de 0
.
Equivalence avec la machine de Turing classique
On simule une machine de Turing sur un alphabet
L'idée est d'associer chaque caractère de
pour le caractère blanc pour un caractère donné
Par exemple si
associé à associé à associé à
La fonction de transition de la machine est alors répartie sur les rubans. Par exemple si
De façon formelle. Soit une machine de Turing sur un alphabet
On construit la fonction de transition de la machine à
si si
On a donc simulé une machine de Turing d'alphabet
Proposition
Toute machine de Turing d'alphabet
Les deux notions sont donc équivalentes.
Machine de Turing 01#
La définition d'une machine de Turing la plus couramment utilisée en algorithmie théorique est la machine de Turing d'alphabet #
comme caractère blanc et la possibilité de ne pas avancer le ruban :
définition
Nous nommerons : Machine de Turing 01#
une machine #
comme caractère blanc avec les caractéristiques suivantes :
(ou les si la machine possède plusieurs rubans ou curseurs) prend ses valeurs dans . Si la valeur est le curseur ne bouge pas.- la sortie Machine de Turing
01#
sera la portion de ruban entourant le curseur du premier caractère blanc à la gauche de celui-ci exclu au premier caractère blanc à la droite de celui-ci exclu. - l'entrée sera :
avec uniquement composée de0
ou de1
avec avec les E_i uniquement composée de0
ou de1
Une machine Machine de Turing 01#
à
La fait d'accepter de ne pas se déplacer permet des transitions de type
Mais, comme toujours, ce n'est qu'une facilité d'écriture, on ne peut faire plus qu'avec une machine de Tuning simple :
Proposition
On peut simuler une machine de Turing 01#
à plusieurs rubans et plusieurs curseurs par une machine de Turing.
preuve
preuve
Il nous faut juste montrer que l'ajout de transitions où le curseur d'un ruban ne bouge pas peut être simulé par une machine de Turing.
Pour cela on ne va écrire que sur les cases paires du ruban et ajouter des état tampons permettant de simuler le sur place. Ci après un exemple avec 2 rubans et on suppose que le second ruban ne bouge pas alors que le premier va à droite (les autres cas sont identiques):
curseur du ruban 1 : v
parité de la case : 01010101010
curseur du ruban 2 : ^
Premier état tampon, on se déplace sur une case impaire. Celui qui doit bouger avance et celui qui doit rester sur place recule :
curseur du ruban 1 : v
parité de la case : 01010101010
curseur du ruban 2 : ^
Second état tampon, les deux se déplacent dans la même direction :
curseur du ruban 1 : v
parité de la case : 01010101010
curseur du ruban 2 : ^