ATLAS Ouvrir dans l'atlas →

Théorème 2Calculabilité

Forme normale de Kleene et fonction universelle

On code l'instruction INC(i)\mathrm{INC}(i) par 2i2i, l'instruction DEC(i,j)\mathrm{DEC}(i, j) par 2i+13j+12^{i+1}3^j + 1, et un programme I0,…,IL−1I_0, \dots, I_{L-1} par le code ⟨c0,…,cL−1⟩\langle c_0, \dots, c_{L-1} \rangle de la suite des codes de ses instructions (Codages).

Réciproquement, tout entier ee est le code d'une unique suite (c0,…,cL−1)(c_0, \dots, c_{L-1}), et l'on note PeP_e le programme dont l'instruction IlI_l est INC(cl/2)\mathrm{INC}(c_l / 2) si clc_l est pair, et DEC((cl−1)0−˙1, (cl−1)1)\mathrm{DEC}\big((c_l - 1)_0 \mathbin{\dot{-}} 1,\ (c_l - 1)_1\big) sinon. Si ee est le code d'un programme PP, alors Pe=PP_e = P. On note φe(n)=fPe(n),\varphi_e^{(n)} = f_{P_e}^{(n)}, et l'on dit que ee est un indice de cette fonction ; on écrit φe\varphi_e pour φe(1)\varphi_e^{(1)}.

Énoncé

Pour tout n⩾1n \geqslant 1, il existe une relation primitive récursive Tn⊂ℕn+2T_n \subset \mathbb N^{n+2} et une fonction primitive récursive Un:ℕn+2→ℕU_n : \mathbb N^{n+2} \to \mathbb N telles que, pour tous ee et x∈ℕnx \in {\mathbb N^n}, φe(n)(x)≃Un(e,x,μt Tn(e,x,t)).\varphi_e^{(n)}(x) \simeq U_n\big(e, x, \mu t\, T_n(e, x, t)\big).

(i) Toute fonction calculable par machine est récursive. Avec Récursive ⇒ machine, les fonctions récursives d'arité nn sont exactement les φe(n)\varphi_e^{(n)}, pour e∈ℕe \in {\mathbb N}.

(ii) Fonction universelle. La fonction partielle (e,x)↦φe(n)(x)(e, x) \mapsto \varphi_e^{(n)}(x) est récursive.

(iii) Toute fonction récursive s'écrit avec une seule minimisation.

Démonstration

Configurations. On code une configuration (ℓ,r)(\ell, r) par l'entier 2ℓ3ρ(r)2^\ell 3^{\rho(r)}, où ρ(r)=∏ipir(i)\rho(r) = \prod_i p_i^{r(i)}, produit fini sur les ii tels que r(i)≠0r(i) \neq 0. Par l'unicité de la décomposition en facteurs premiers (Nombres premiers, (ii)), (ρ(r))i=r(i)(\rho(r))_i = r(i) pour tout ii : le code détermine la configuration.

Dans ce codage, INC(i)\mathrm{INC}(i) multiplie ρ(r)\rho(r) par pip_i ; DEC(i,j)\mathrm{DEC}(i, j) teste si pip_i divise ρ(r)\rho(r), et, si oui, divise par pip_i.

Une étape. Soit Et(e,c)\mathrm{Et}(e, c) défini ainsi, avec ℓ=(c)0\ell = (c)_0, ρ=(c)1\rho = (c)_1 et L=lg(e)L = \mathrm{lg}(e) : si ℓ⩾L\ell \geqslant L, Et(e,c)=c\mathrm{Et}(e, c) = c. Sinon, soit k=(e)ℓk = (e)^\ell le code de l'instruction IℓI_\ell de PeP_e.

Si kk est pair et i=k/2i = k/2, on pose Et(e,c)=2ℓ+13ρpi\mathrm{Et}(e, c) = 2^{\ell+1} 3^{\rho p_i}. Si kk est impair, avec i=(k−1)0−˙1i = (k - 1)_0 \mathbin{\dot{-}} 1 et j=(k−1)1j = (k - 1)_1, on pose Et(e,c)=2ℓ+13q(ρ,pi)\mathrm{Et}(e, c) = 2^{\ell+1} 3^{q(\rho, p_i)} si pi∣ρp_i \mid \rho, et Et(e,c)=2j3ρ\mathrm{Et}(e, c) = 2^j 3^{\rho} sinon.

C'est une définition par cas, à partir des fonctions primitives récursives de Clôture et de Codages ; Et\mathrm{Et} est primitive récursive. Si cc code une configuration non terminale de PeP_e, Et(e,c)\mathrm{Et}(e, c) code la configuration suivante ; si elle est terminale, elle ne change plus.

Le calcul. Posons Ini(x)=3p1x1⋯pnxn\mathrm{Ini}(x) = 3^{p_1^{x_1} \cdots p_n^{x_n}}, code de la configuration initiale, puis, par récurrence primitive sur tt, Cf(e,x,0)=Ini(x),Cf(e,x,t+1)=Et(e,Cf(e,x,t)).\begin{aligned} \mathrm{Cf}(e, x, 0) &= \mathrm{Ini}(x), \\ \mathrm{Cf}(e, x, t + 1) &= \mathrm{Et}\big(e, \mathrm{Cf}(e, x, t)\big). \end{aligned} Par récurrence sur tt, Cf(e,x,t)\mathrm{Cf}(e, x, t) code la configuration atteinte après tt étapes du calcul de PeP_e sur xx, ou la configuration terminale si le calcul s'est arrêté avant.

On pose Tn(e,x,t)  ⟺  (Cf(e,x,t))0⩾lg(e)T_n(e, x, t) \iff (\mathrm{Cf}(e, x, t))_0 \geqslant \mathrm{lg}(e), « le calcul est arrêté au temps tt », et Un(e,x,t)=((Cf(e,x,t))1)0U_n(e, x, t) = \big((\mathrm{Cf}(e, x, t))_1\big)_0, contenu de R0R_0. Si le calcul s'arrête, μt Tn(e,x,t)\mu t\, T_n(e, x, t) est le nombre de ses étapes, et UnU_n lit le contenu final de R0R_0 ; sinon, aucun tt ne vérifie TnT_n, et les deux membres sont indéfinis.

(i), (ii) et (iii) en découlent : le second membre est une fonction récursive de (e,x)(e, x), obtenue par une seule minimisation, et toute fonction récursive est l'une des φe(n)\varphi_e^{(n)} par Récursive ⇒ machine.

□
Remarque

Le théorème de forme normale est dû à Stephen Kleene (« General recursive functions of natural numbers », Mathematische Annalen 112, 1936), dans le cadre des fonctions récursives générales que Gödel avait définies dans ses leçons de Princeton de 1934, à partir d'une suggestion de Herbrand. La même année, Alonzo Church (American Journal of Mathematics 58, 1936) et Alan Turing proposaient, chacun par un modèle différent, de définir ainsi les fonctions calculables.

Remarque

Thèse de Church-Turing. Toute fonction de ℕn\mathbb N^n dans ℕ\mathbb N calculable par un procédé mécanique, au sens intuitif, est récursive. C'est une thèse, et non un théorème : la notion intuitive de procédé mécanique n'a pas de définition mathématique, et rien ne peut donc être démontré à son sujet.

Elle s'appuie sur l'expérience : tous les modèles de calcul proposés, fonctions récursives, machines de Turing, machines à registres, λ-calcul de Church, calculent exactement les mêmes fonctions. Elle ne sert jamais dans les démonstrations de cette théorie, où chaque fonction est montrée récursive par construction.

Remarque

Une même fonction a une infinité d'indices : ajouter à la fin d'un programme l'instruction INC(1)\mathrm{INC}(1) ne change pas la fonction calculée, puisqu'elle s'exécute au plus une fois, au moment où le calcul atteindrait l'arrêt, et ne touche pas R0R_0. Il faut s'en garder : le calcul atteint toujours l'instruction de numéro LL quand il s'arrête, si bien qu'ajouter INC(0)\mathrm{INC}(0) au programme de l'addition donnerait x+y+1x + y + 1. L'erreur la plus répandue est de confondre la fonction φe\varphi_e et le programme PeP_e ; le théorème de Rice montre qu'aucune propriété non triviale de la fonction ne se lit de façon décidable sur le programme.

Ouvrir dans l'atlas interactif →