Le plus petit ordinateur imaginable
Une machine de Turing est un modèle très simple d’ordinateur, qui sert à définir ce qu’un ordinateur peut calculer. Elle a un ruban sans fin, une tête qui lit et écrit une case à la fois, et une table de règles.
Tout ce que calcule votre téléphone, une machine de Turing sait le calculer aussi, plus lentement. Vous allez suivre une machine qui ajoute 1 à un nombre binaire, puis la programmer.
À la fin de cette leçon
Remarque
Je peux suivre une machine de Turing sur son ruban, pas après pas.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Ruban | une suite de cases, sans fin, où l’on lit et écrit | |
| Tête | l’élément qui lit et écrit une case à la fois | |
| Règle | ce qu’on écrit, où l’on va et le nouvel état | droite,1 -> 1 D droite |
| Symbole blanc | le contenu d’une case vide | _ |
| Pas | une règle appliquée une fois | |
| État d’arrêt | l’état où la machine s’arrête |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ruban, tête et règles : les trois pièces
Le ruban est une suite de cases, sans fin dans les deux sens. Chaque case contient un symbole, ou le symbole blanc _.
La tête est sur une case à la fois. À chaque pas, elle lit la case, puis applique la règle qui correspond à l’état et au symbole lu. Une règle dit trois choses : quoi écrire, de quel côté aller (G ou D), et quel est le nouvel état.
Exemple travaillé : la machine « ajouter 1 »
| État | Symbole lu | Écrire | Aller | Nouvel état |
|---|---|---|---|---|
| droite | 0 | 0 | D | droite |
| droite | 1 | 1 | D | droite |
| droite | _ | _ | G | retenue |
| retenue | 1 | 0 | G | retenue |
| retenue | 0 | 1 | G | arret |
| retenue | _ | 1 | G | arret |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La machine sur le nombre 1011
| Pas | État avant | Symbole lu | Ruban après le pas |
|---|---|---|---|
| 1 | droite | 1 | 1011 |
| 2 | droite | 0 | 1011 |
| 3 | droite | 1 | 1011 |
| 4 | droite | 1 | 1011 |
| 5 | droite | _ (blanc) | 1011 |
| 6 | retenue | 1 | 1010 |
| 7 | retenue | 1 | 1000 |
| 8 | retenue | 0 | 1100, arrêt |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Programmer un seul pas
# Un seul pas de la machine "ajouter 1".
regles = {
"droite,0": ["0", "D", "droite"],
"droite,1": ["1", "D", "droite"],
"droite,_": ["_", "G", "retenue"],
"retenue,1": ["0", "G", "retenue"],
"retenue,0": ["1", "G", "arret"],
"retenue,_": ["1", "G", "arret"],
}
ruban = {0: "1", 1: "0", 2: "1", 3: "1"}
tete = 4
etat = "droite"
# Lire la case, appliquer la règle, bouger, changer d'état.
symbole = "_"
if tete in ruban:
symbole = ruban[tete]
regle = regles[etat + "," + symbole]
ruban[tete] = regle[0]
if regle[1] == "D":
tete = tete + 1
else:
tete = tete - 1
etat = regle[2]
print("écrit", regle[0], "- tête en", tete, "- état", etat)
# Mettez tete = 3 et etat = "retenue", puis relancez.
Une machine peut ne jamais s’arrêter
La machine « ajouter 1 » s’arrête toujours : la retenue finit par trouver un 0 ou un blanc. Ce n’est pas vrai de toute machine.
Si une règle renvoie la tête vers la droite sans jamais changer d’état, elle avance pour toujours. Le tableau compare trois machines. Savoir à l’avance si une machine s’arrête est le sujet de la leçon suivante.
Trois machines et leur arrêt
| Machine | Règles | Ce qui se passe |
|---|---|---|
| Ajouter 1 | Six règles du tableau | S’arrête en 8 pas sur 1011 |
| Effacer les 1 | e,1 -> _ D e et e,_ -> _ D arret | S’arrête après le dernier 1 |
| Boucle | a,_ -> _ D a | Ne s’arrête jamais |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Python calcule autant qu’une machine de Turing
Tout ce qu’on sait calculer avec un langage comme Python, une machine de Turing le calcule aussi, et l’inverse est vrai. Aucun ordinateur connu n’a dépassé ce modèle.
On appelle cela la thèse de Church-Turing. C’est une idée acceptée, pas un théorème, car « calculable » est une notion de la vie courante.
Une table de règles est un fichier texte
Le labo ne contient pas de machine de Turing, mais ses outils lisent n’importe quelle table écrite en texte. Le premier Run écrit les six règles de « ajouter 1 » dans un fichier, une règle par ligne, les cinq champs séparés par une espace.
Les suivants comptent les lignes, cherchent un état et listent les états de départ. Le dernier montre qu’un nombre de Python n’a pas de limite fixe.
Écrire la table dans un fichier
printf '%s\n' 'droite 0 0 D droite' 'droite 1 1 D droite' 'droite _ _ G retenue' 'retenue 1 0 G retenue' 'retenue 0 1 G arret' 'retenue _ 1 G arret' > ~/regles.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les règles
wc -l < ~/regles.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les règles qui parlent de retenue
grep -c "retenue" ~/regles.txtAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les états de départ
cut -d' ' -f1 ~/regles.txt | sort -uAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un nombre sans limite fixe
python3 -c "print(2 ** 200)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent qu’une machine de Turing est trop simple pour calculer comme un vrai ordinateur, ou qu’elle finit toujours. Chaque règle est minuscule, mais leur suite suffit pour tout calcul possible. Rien n’oblige la machine à s’arrêter : une boucle sans fin reste possible.
Pour aller plus loin
Écrivez la table d’une machine qui efface tous les 1 du ruban, puis s’arrête sur le premier blanc. Combien de pas faut-il pour le mot 111 ?
Écrivez ensuite une machine qui ne s’arrête jamais avec une seule règle. Vérifiez-la avec votre fonction et un maximum de 50 pas.