ATLAS Ouvrir dans l'atlas →

Définition 3Calculabilité

Machines à registres

Énoncé

Une machine à registres dispose de registres R0,R1,R2,…R_0, R_1, R_2, \dots, contenant chacun un entier. Un programme est une suite finie I0,…,IL−1I_0, \dots, I_{L-1} d'instructions de deux sortes :

INC(i)\mathrm{INC}(i) ajoute 11 au contenu de RiR_i et passe à l'instruction suivante ;

DEC(i,j)\mathrm{DEC}(i, j), si RiR_i contient un entier non nul, lui retire 11 et passe à l'instruction suivante ; sinon, elle passe à l'instruction de numéro jj.

Une configuration est un couple (ℓ,r)(\ell, r) formé d'un numéro d'instruction ℓ∈ℕ\ell \in {\mathbb N} et d'une application r:ℕ→ℕr : \mathbb N \to \mathbb N nulle sauf en un nombre fini de points, r(i)r(i) étant le contenu de RiR_i. Elle est terminale si ℓ⩾L\ell \geqslant L ; sinon, l'instruction IℓI_\ell la transforme comme on vient de le dire en une configuration suivante.

Soit n⩾1n \geqslant 1. Le calcul de PP sur x∈ℕnx \in {\mathbb N^n} est la suite des configurations issue de (0,rx)(0, r_x), où rx(i)=xir_x(i) = x_i pour 1⩽i⩽n1 \leqslant i \leqslant n et rx(i)=0r_x(i) = 0 sinon. S'il atteint une configuration terminale (ℓ,r)(\ell, r), on pose fP(n)(x)=r(0)f_P^{(n)}(x) = r(0) ; sinon, fP(n)(x)f_P^{(n)}(x) n'est pas défini. Une fonction partielle est calculable par machine si elle est l'une des fP(n)f_P^{(n)}.

Remarque

Le programme suivant calcule l'addition. Le registre R3R_3 reste nul, si bien que DEC(3,j)\mathrm{DEC}(3, j) est un saut inconditionnel vers l'instruction jj : I0=DEC(1,3)I3=DEC(2,6)I1=INC(0)I4=INC(0)I2=DEC(3,0)I5=DEC(3,3)\begin{array}{ll} I_0 = \mathrm{DEC}(1, 3) & I_3 = \mathrm{DEC}(2, 6) \\ I_1 = \mathrm{INC}(0) & I_4 = \mathrm{INC}(0) \\ I_2 = \mathrm{DEC}(3, 0) & I_5 = \mathrm{DEC}(3, 3) \end{array} La première boucle vide R1R_1 dans R0R_0, la seconde vide R2R_2 dans R0R_0, et le calcul s'arrête au numéro 6=L6 = L.

I0 DEC(1, 3) I1 INC(0) I2 DEC(3, 0) I3 DEC(2, 6) I4 INC(0) I5 DEC(3, 3) arrêt R1 > 0 R2 > 0 R1 = 0 R2 = 0 R1 → R0 R2 → R0
Le programme de l'addition : les flèches grises mènent à l'instruction suivante, après un incrément ou quand le registre testé est non nul, et les flèches rouges sont les sauts pris quand il est nul. Les deux sauts inconditionnels, en pointillé, ramènent au début de chaque boucle, dont l'effet est indiqué en bleu.
t ℓ R0 R1 R2 0 0 0 2 1 1 1 0 1 1 2 2 1 1 1 3 0 1 1 1 4 1 1 0 1 5 2 2 0 1 6 0 2 0 1 7 3 2 0 1 8 4 2 0 0 9 5 3 0 0 10 3 3 0 0 11 arrêt 3 0 0
L'exécution sur x=(2,1)x = (2, 1) : chaque ligne donne le numéro de l'instruction à exécuter et le contenu des registres après tt étapes. Le registre R0R_0, en rouge, reçoit une unité à chaque passage par I1I_1 ou I4I_4, et la machine s'arrête au bout de 1111 étapes avec R0=3R_0 = 3.

Une vérification exhaustive pour x,y⩽5x, y \leqslant 5 montre que le calcul s'arrête toujours, en 3x+3y+23x + 3y + 2 étapes, avec R0=x+yR_0 = x + y.

Remarque

Ce modèle est volontairement pauvre : deux instructions, aucune mémoire autre que des entiers. Les machines de Turing, introduites par Alan Turing (« On computable numbers, with an application to the Entscheidungsproblem », Proceedings of the London Mathematical Society 42, 1936-1937), lisent et écrivent des symboles sur un ruban ; elles calculent exactement les mêmes fonctions, mais l'équivalence demande un codage plus long. L'erreur serait de croire que la pauvreté du modèle limite ce qu'il calcule : le nœud Kleene montre qu'il calcule toutes les fonctions récursives, et rien de plus.

Ouvrir dans l'atlas interactif →