Calcul et machine de Turing

Transcription

Calcul et machine de Turing
Calcul et machine de Turing
Partie A – Le problème de la correspondance de Post
Le tableau ci-dessous donne deux listes de mots formés avec les symboles 0 et 1.
La liste A contient les mots a1 = 1, a2 = 10111 et a3 = 10, la liste B les mots
b1 = 111, b2 = 10 et b3 = 0.
i
1
2
3
Liste A
ai
1
10111
10
Liste B
bi
111
10
0
Considérons la suite d’indices : 3, 1, 2, 1.
En concaténant les mots correspondant à cette suite d’indices on obtient :
• le mot 101101111 pour la liste A,
• le mot 011110111 pour la liste B.
On constate que ces deux mots sont différents.
Le problème de la correspondance de Post est le suivant :
« Existe-t-il une suite d’indices telle que les deux mots obtenus soit identiques ? »
(a) Trouvez une solution à ce problème pour les listes A et B du tableau ci-dessus.
(b) Existe-t-il une solution avec les listes A et B ci-dessous ?
i
1
2
3
Liste A
ai
10
011
101
Liste B
bi
101
11
011
On peut résoudre un problème donné en appliquant des raisonnements spécifiques à chaque cas particulier. Il est beaucoup plus satisfaisant de trouver une
méthode générale qui permettent de résoudre n’importe quelle instance du problème. Le problème devient alors :
Trouvez une méthode de calcul qui permette de savoir si, étant donné deux listes de
mots A et B, le problème de la correspondance de Post possède une solution ou pas.
Emil Post a démontré en 1946 qu’une telle méthode de calcul n’existe pas. Il peut être difficile de trouver une méthode générale de calcul
pour un problème donné. Mais il paraît encore
bien plus difficile de prouver qu’une telle méthode n’existe pas. Ce résultat est donc remarquable. Pour l’établir il a fallu de long travaux
théoriques préparatoires. Il faut en particulier
avoir une définition précise de ce que l’on entend par méthode de calcul.
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Partie B – Qu’est-ce qu’un calcul
• Qu’est-ce qu’un calcul ?
• Quelle est la part de calcul dans les activités humaines ?
• Toute l’activité humaine peut-elle se réduire à du calcul ?
• Existe-t-il des formes de calcul qu’un humain ne peut pas réaliser ?
• Une cellule biologique effectue-t-elle des
calculs ?
Dix années auparavant, en 1936, Alan Turing publie l’article fondateur de la
science informatique. Il démontre dans cet article qu’il n’existe pas de méthode
de calcul générale qui permette de décider si une proposition mathématique est
démontrable 1 . Pour établir sa démonstration il conçoit sur le papier les plans
d’une machine qu’on appellera désormais la machine de Turing. Il appelle alors
méthode de calcul une méthode qui peut être mise en œuvre sur sa machine et il
démontre que sa machine est incapable de décider si une proposition mathématique est démontrable.
Une question se pose immédiatement : les capacités de la machine de Turing
permettent-elles de mettre en œuvre toutes les méthodes de calcul susceptibles
d’être imaginées ? Si la réponse est non cela diminue considérablement la portée
du résultat de Turing. Mais en fait :
• Tout ce qui peut être calculé sur un ordinateur actuel peut aussi être calculé
sur une machine de Turing (et réciproquement).
• Personne n’a pu encore proposer une méthode de calcul qui ne puisse pas
être mis en œuvre sur une machine de Turing.
Alonzo Church a proposé la thèse selon laquelle la machine de Turing capture
complètement toute la notion de calculabilité. D’autres chercheurs ont proposés
d’autres définitions de la calculabilité. Ces autres définitions ont été démontrées
équivalentes à la calculabilité par la machine de Turing. Remarquez bien que
la thèse de Church n’est pas une proposition mathématique. Elle n’est donc pas
démontrable et ne sera donc jamais établie.
La machine de Turing est extrêmement rudimentaire et il est tout à fait remarquable qu’elle ait exactement les mêmes capacités qu’un ordinateur moderne.
D’une certaine façon cette machine est dépouillée de tout ce qui n’est pas nécessaire et met en lumière l’essence même de ce qu’est un calcul.
Calculez 54853 + 29514 en appliquant
la méthode de calcul que vous avez apprise à l’école primaire.
C’est en s’observant lui-même, effectuant ce genre de calcul, qu’Alan Turing
a inventé sa machine.
1. Cette question a un sens car il existe des langages aussi précis que les langages de programmation dans lesquels les propositions mathématiques peuvent être écrites. Les propositions
mathématiques écrites dans ce langage peuvent alors être lues et manipulées par un programme.
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 2
• Les objets sur lesquels on veut effectuer un calcul (ici deux nombres) doivent
tout d’abord être représentés par des suites de symboles (ici des chiffres).
• Les symboles sont disposés sur une feuille selon une règle bien précise.
Remarquez que la feuille est en deux dimensions.
• Calculer consiste alors à écrire de nouveaux symboles sur la feuille en appliquant de façon systématique les règles précises que l’on a apprises.
Si on étudie plus attentivement le processus on peut observer que :
• Le processus peut être découpé en un nombre fini d’étapes élémentaires.
• On ne peut observer à chaque instant qu’un seul symbole à la fois.
• L’action que l’on effectue dépend uniquement du symbole que l’on observe
actuellement et de l’état mental dans lequel on se trouve. Notre état mental est certe complexe mais si on n’en conserve que ce qui est nécessaire
pour effectuer une addition il se simplifie considérablement. Pour effectuer
l’addition 54853 + 29514, lorsqu’on lit le chiffre des unités de 29514 la
seule chose qui importe dans notre état mental est le souvenir du chiffre
des unités de 54853. Un nombre fini d’états mentaux différents est suffisant
pour mener à bien le calcul.
Partie C – La machine de Turing
La machine d’Alan Turing est conçue sur ces principes, en les simplifiant au maximum :
• La feuille de papier en deux dimensions est remplacée par un ruban (à une
dimension). Ce ruban est découpé en cases.
• Le ruban contient initialement une suite finie de symboles binaires 0 ou 1.
Cette suite est le codage de l’objet sur lequel va porter le calcul.
• La machine dispose d’une tête de lecture/écriture qui est initialement placée juste à gauche de la suite de symboles.
• À chaque instant la machine ne peut lire que la case située sous sa tête de
lecture.
• Le nombre d’états possibles pour la machine est fini. Initialement elle se
trouve dans l’état 1. Les autres états sont numérotés 2, 3, 4, etc. Le dernier
état est appelé FINAL. Lorsque la machine arrive dans cet état elle s’arrête.
• À chaque étape la machine lit le symbobe situé sous sa tête de lecture.
Selon le symbole lu et selon l’état dans lequel elle se trouve elle accomplit
les actions suivantes :
• Écrire un symbole 0, 1 ou BLANC sur la case située sous la tête de
lecture/écriture.
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 3
• Déplacer le ruban vers la gauche ou vers la droite.
• Changer d’état (ou éventuellement rester dans le même état).
Le fonctionnement de la machine est décrit dans une table appelée table de
transitions.
Illustrons le principe en concevant une machine qui ajoute 1 à un nombre codé
en binaire sur le ruban.
(a) Un petit test avant de poursuivre. Savez-vous ajouter 1 aux entiers suivants
codés en binaire : 1001100, 10010111 et 1111 ?
(b) Proposez une méthode systématique qui permettent d’obtenir le résultat voulu.
Le mot binaire se termine par une suite de 1 consécutifs (cette suite est éventuellement de longueur nulle). La machine doit remplacer cette suite de 1 par des 0
et remplacer par un 1 le 0 (ou le BLANC) situé à gauche de cette suite.
Voici une façon pour la machine d’accomplir cette tâche :
• État 1 : Positionner la tête sur le chiffre de gauche.
• État 2 : Positionner la tête sur le chiffre de droite.
• État 3 : Déplacer le ruban vers la droite en remplaçant les 1 par des 0. Dès
qu’elle trouve un 0 ou un BLANC elle le remplace par un 1 et passe dans
l’état FINAL.
Le fonctionnement de la machine est décrit avec précision par la table de transitions suivante :
État
Symbole lu
Symbole écrit
Déplacement
Nouvel état
1
BLANC
BLANC
Gauche
2
2
0
0
Gauche
2
2
1
1
Gauche
2
2
BLANC
BLANC
Droite
3
3
1
0
Droite
3
3
0
1
Droite
FINAL
3
BLANC
1
Droite
FINAL
Cette table de transitions peut avantageusement être représentée par un graphe
tel que celui ci-dessous.
1/1 ←
1
B/B ←
0/0 ←
2
B/B →
B/1 →
3
F
1/0 →
0/1 →
La façon mécanique et purement formelle avec laquelle la machine manipule les
symboles pour ajouter 1 donne à penser que la notion de nombre est absente
dans ces opérations. Ces manipulations ne prennent du sens qu’au travers l’interprétation que nous donnons à ces suites de symboles.
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 4
(c) Concevez une machine de Turing qui multiplie un nombre par deux.
(d) Concevez une machine de Turing qui soustrait 1 à un nombre.
Concevoir une machine de Turing n’est pas une mince affaire. On imagine difficilement fabriquer un jeu vidéo en 3D sur ce principe même si on sait que c’est
théoriquement possible.
On comprend donc qu’elle n’a jamais été réellement construite 2 . L’intérêt de la
machine de Turing est avant tout d’être un modèle théorique qui permet de raisonner sur la notion de calcul.
Partie D – Le castor affairé
Voici maintenant un petit défi pour vous. Il s’agit du concours du Castor affairé.
(a) Concevez une machine de Turing à deux états (1, 2) plus l’état FINAL qui
écrit le plus possible de 1 sur le ruban (initialement vierge).
U
Attention : La machine doit finir par entrer dans l’état FINAL et s’arrêter.
Le gagnant est celui dont la machine écrira le plus de 1 sur le ruban.
(b) Deuxième manche du concours : même problème pour une machine à trois
états.
(c) Une troisième manche est possible pour départager les éventuels ex-æquo :
il s’agit bien sûr du même problème pour une machine à quatre états.
Pour tout entier n, le nombre de machines de Turing à n états (plus l’état final)
est fini (en êtes-vous convaincus ?). Parmi toutes ces machines celles qui écrivent
le plus de 1 sur un ruban vierge et qui s’arrêtent sont appelées des castors affairés.
Notons C(n) ce nombre maximum de 1.
On a démontré que C(2) = 4, C(3) = 6 et C(4) = 13. Au fait, combien vaut
C(1) ?
Pour n > 4 personne ne sait combien vaut C(n).
En 1962 le mathématicien Tibor Rado a démontré qu’aucune machine de Turing
n’est capable de calculer C(n) à partir du nombre n écrit en binaire sur le ruban.
Cela signifie qu’il n’existe aucun algorithme général (aucun programme sur un
ordinateur moderne) qui permette de calculer C(n) à partir de n. On dit que la
fonction C est non calculable. Pour chaque n différent nous sommes condamnés
à devoir imaginer une méthode spécifique pour calculer C(n).
Sur Wikipédia vous pouvez trouver la table de transitions d’une machine à six
états qui écrit plus de 1018267 chiffres 1. Ceci prouve donc que C(6) > 1018267 .
Ce record a été établi en juin 2010 mais on ne sait pas s’il s’agit d’un castor bien
affairé. Saurez-vous faire mieux !
Partie E – La machine de Turing universelle
La machine de Turing n’est pas limitée à effectuer des calculs sur des nombres.
Toute information qui peut être codée par une suite fini de symboles peut être
l’objet d’un calcul sur une machine de Turing (image, son, labyrinthe, grille de
Sudoku, etc.). Il faut donc penser le calcul comme une notion beaucoup plus générale que le calcul numérique. Dans son article de 1936 Alan Turing a l’idée géniale de définir un codage binaire pour les tables de transitions de ses machines.
Il se pose alors la question suivante :
« Existe-t-il une machine capable de simuler le comportement d’une machine
quelconque lorsque l’on place le code binaire de cette machine sur le ruban ? »
2. En fait pas tout à fait : http://www.ens-lyon.eu/actualites/la-machine-de-turing-en-legos–158118.kjsp
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 5
Alan Turing a démontré que cette machine existe et l’a baptisée machine universelle.
Pour mieux comprendre, construisons un codage binaire possible pour les tables
de transitions.
• L’état 1 est codé 1, l’état 2 est codé 11, l’état 3 est codé 111, etc.
• Les symboles BLANC, 0 et 1 sont respectivement codés 1, 11 et 111.
• La direction gauche est codée 1 et la direction droite est codée 11.
• Une transition (état, symbole lu, symbole écrit, déplacement et nouvel état)
est codé en concaténant les codages des cinq éléments, chacun étant séparé
par un 0.
• La table des transitions est codée en concaténant les codages des transitions, chacun étant séparé par 00. Pourquoi deux 0 sont-ils nécessaires ?
Si on reprend l’exemple de la machine qui ajoute 1 à un nombre écrit en binaire,
le code binaire de la table de transitions est :
1010101011001101101101011001101110111010110011010101101110011101110
110110111001110110111011011110011101011101101111
En plaçant ce code sur le ruban de la machine de Turing universelle, suivi de 000
et du code binaire d’un nombre n, la machine ajoutera 1 à n.
Cette idée de Turing a une portée considérable. Il suffit de construire une seule
machine pour réaliser n’importe quel calcul possible. Du point de vue des ordinateurs modernes, le codage binaire ci-dessus est le programme présent dans
la mémoire RAM à côté des données. Un ordinateur moderne est équivalent à
une machine de Turing universelle. C’est une machine programmable qui peut
effectuer n’importe quel calcul possible.
Partie F – Les limites du calcul
Les machines de Turing sont suffisamment simples pour pouvoir se prêter à des
raisonnements mathématiques rigoureux et à la démonstration de théorèmes. Par
ailleurs, puisque les machines de Turing ont les mêmes potentialités de calcul que
les ordinateurs modernes, ces théorèmes ont une portée très générale.
Il est très fréquent que les informaticiens écrivent des programmes qui lisent le
source d’autres programmes, par exemple pour les analyser et détecter les éventuelles erreurs.
(a) Peut-on écrire un programme qui lit le source d’un programme Python et qui
indique si ce programme Python affiche « bonjour » ?
(b) Le programme Python ci-dessous affiche-t-il « bonjour » si on lui fournit comme
donnée un entier strictement positif ?
n = input("Entrez un nombre entier strictement positif : ")
while n != 1:
if n % 2 == 0:
n = n / 2
else:
n = 3*n + 1
print("bonjour")
Alan Turing a établi des résultats théoriques qui limitent certaines ambitions de
calcul. Il a par exemple établi qu’il n’est pas possible de concevoir un programme
qui puisse détecter si un programme passé en entrée s’arrête ou boucle indéfiniment. Sa démonstration est basée sur un raisonnement par l’absurde qui utilise
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 6
l’argument de la diagonale découvert par le mathématicien Georg Cantor 3 . Illustrons par un exemple le principe du raisonnement utilisé par Alan Turing.
Considérons les programmes Python P qui lisent une donnée D au clavier. Certains d’entre eux écrivent « bonjour ». Plus précisément, il écrivent au moins sept
caractères sur la sortie standard et les sept premiers caractères forment le mot
« bonjour ».
Peut-on écrire un programme Python R qui :
• lit un fichier P ainsi qu’une donnée D au clavier,
• affiche « oui » si P est le source d’un programme Python qui affiche « bonjour »
lorsqu’il lit la donnée D au clavier,
• affiche « non » sinon.
P
oui
non
R
D
Proposition : Ce programme R n’existe pas.
Démonstration : Supposons qu’un tel programme R existe. Effectuons alors quelques
modifications sur ce programme R :
• Renommons tous les appels à la fonction print avec un nom qui n’existe pas
dans le programme R. Par exemple « affiche ».
• Ajoutons au début du fichier les lignes cicontre : On peut penser que le programme R
affiche « oui » avec l’instruction print(”oui”)
et « non » avec l’instruction print(”non”). Il se
peut aussi que le programme se comporte
de façon plus complexe et affiche d’abord
par exemple la lettre « n » toute seule.
def affiche(texte):
if texte[0] == ’n’:
print("bonjour")
sys.exit()
else:
print(texte)
Quoiqu’il en soit, la modification proposée fait que le programme modifié R1 affiche « oui » chaque fois que le programme R affiche « oui » et affiche
« bonjour » chaque fois que le programme R affiche « non ».
• Le programme R1 comme le programme R lit un fichier source Python P
et une donnée D au clavier. On modifie le programme R1 de façon à ce
qu’il ne fasse que lire une donnée au clavier. Ce nouveau programme R2 lit
d’abord complètement la donnée et la copie en deux endroits différents de
la mémoire. La donnée est alors utilisée à la fois comme fichier P et comme
donnée D.
P
R1
oui
bonjour
D
R2
oui
bonjour
D
On obtient ainsi un programme R2 qui :
• lit une donnée D au clavier,
3. http://fr.wikipedia.org/wiki/Argument_diagonal
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 7
• affiche « oui » si la donnée D est un programme source Python qui affiche
« bonjour » lorsqu’il lit au clavier cette même donnée D.
• affiche « bonjour » sinon.
Une question essentielle se pose maintenant. Qu’affiche le programme R2 si on
lui fournit au clavier son propre source ?
Supposons que le programme affiche « oui ». Ce programme dit donc que la donnée R2 est un programme source Python qui affiche « bonjour » lorsqu’il lit au
clavier cette même donnée R2. Ceci est contradictoire avec la supposition que le
programme affiche « oui ».
Supposons alors que le programme affiche « bonjour ». Ce programme dit donc
que la donnée R2 n’est pas un programme source Python qui affiche « bonjour »
lorsqu’il lit au clavier cette même donnée R2. Ceci contredit encore notre supposition.
Ainsi, supposer l’existence du programme R nous amène nécessairement à des
contradictions logiques. Nous devons donc en conclure que ce programme n’existe
pas.
Cette démonstration semble bien tordue et on peut penser que le paradoxe provient d’un vice logique caché quelque part dans le raisonnement. Cette démonstration est pourtant bien tout à fait valide dans son principe. Les imprécisions
éventuelles qu’elle contient pourraient être complètement dissipées en raisonnant
sur une machine de Turing plutôt que sur un programme Python.
Partie G – Alan Turing
En guise de conclusion voici une courte biographie d’Alan Turing tirée du site
http://www.espace-turing.fr.
Alan Mathison Turing est un mathématicien britannique auteur de l’article fondateur de la science informatique.
Il est à l’origine de la formalisation des concepts d’algorithme et de calculabilité.
Durant la Seconde Guerre mondiale, il a dirigé les recherches de décryptage des
codes secrets générés par la machine Enigma utilisée par les allemands.
Il a travaillé sur un des tout premiers ordinateurs, puis a contribué au débat sur
sur la capacité que pourraient avoir les machines à penser et sur la fabrication
d’un cerveau artificiel auquel on donnera le nom d’« intelligence artificielle ».
Vers la fin de sa vie, il s’est intéressé à des modèles de morphogenèse du vivant
conduisant aux « structures de Turing ».
Persécuté pour son homosexualité, il évite la prison en choisissant la castration
chimique. Il se suicide le 7 juin 1954 par empoisonnement au cyanure.
http://dichotomies.fr/2013/infomath/cours/isn/calcul-et-machine-de-turing/
Denis Pinsard – Mis à jour le lundi 04 mars 2013 [MQB603]
Page 8

Documents pareils