ATLAS Ouvrir dans l'atlas →

Définition 1Fonctions primitives récursives

Fonctions primitives récursives

Dans toute la théorie, les entiers sont ceux de ℕ{\mathbb N}, construits dans 𝖹𝖥\mathsf{ZF} (Construction de ω), et une fonction d'arité n⩾1n \geqslant 1 est une application de ℕn{\mathbb N^n} dans ℕ\mathbb N. On note x=(x1,…,xn)x = (x_1, \dots, x_n) un élément de ℕn\mathbb N^n, et (x,y)(x, y) l'élément de ℕn+1\mathbb N^{n+1} obtenu en ajoutant yy à la fin.

Énoncé

Les fonctions de base sont la fonction nulle Z:x↦0Z : x \mapsto 0, définie sur ℕ\mathbb N, le successeur S:x↦x+1S : x \mapsto x + 1, et les projections Pin:(x1,…,xn)↦xiP^n_i : (x_1, \dots, x_n) \mapsto x_i, pour 1⩽i⩽n1 \leqslant i \leqslant n.

Composition. Si f:ℕm→ℕf : \mathbb N^m \to \mathbb N et g1,…,gm:ℕn→ℕg_1, \dots, g_m : \mathbb N^n \to \mathbb N, la composée est la fonction h:ℕn→ℕh : \mathbb N^n \to \mathbb N définie par h(x)=f(g1(x),…,gm(x)).h(x) = f(g_1(x), \dots, g_m(x)).

Récurrence primitive. Si f:ℕn→ℕf : \mathbb N^n \to \mathbb N et g:ℕn+2→ℕg : \mathbb N^{n+2} \to \mathbb N, il existe une unique fonction h:ℕn+1→ℕh : \mathbb N^{n+1} \to \mathbb N telle que, pour tous xx et yy, h(x,0)=f(x),h(x,y+1)=g(x,y,h(x,y)).\begin{aligned} h(x, 0) &= f(x), \\ h(x, y + 1) &= g(x, y, h(x, y)). \end{aligned} Sans paramètre, c'est-à-dire pour n=0n = 0, on se donne un entier aa et g:ℕ2→ℕg : \mathbb N^2 \to \mathbb N, et h:ℕ→ℕh : \mathbb N \to \mathbb N est définie par h(0)=ah(0) = a et h(y+1)=g(y,h(y))h(y + 1) = g(y, h(y)).

Les fonctions primitives récursives forment le plus petit ensemble de fonctions qui contient les fonctions de base et qui est stable par composition et par récurrence primitive.

Exemples. Sont primitives récursives : l'addition, la multiplication, (x,y)↦xy(x, y) \mapsto x^y, la factorielle, le prédécesseur pr\mathrm{pr}, nul en 00 et égal à x−1x - 1 si x⩾1x \geqslant 1, la soustraction tronquée x−˙yx \mathbin{\dot{-}} y, égale à x−yx - y si x⩾yx \geqslant y et à 00 sinon, et les fonctions sg\mathrm{sg} et sg‾\overline{\mathrm{sg}}, définies par sg(0)=0\mathrm{sg}(0) = 0, sg‾(0)=1\overline{\mathrm{sg}}(0) = 1, et sg(x)=1\mathrm{sg}(x) = 1, sg‾(x)=0\overline{\mathrm{sg}}(x) = 0 pour x⩾1x \geqslant 1.

Démonstration

Le plus petit ensemble existe. Les fonctions d'arité quelconque forment un ensemble, réunion des ensembles d'applications de ℕn\mathbb N^n dans ℕ\mathbb N pour n⩾1n \geqslant 1. L'intersection des parties de cet ensemble qui contiennent les fonctions de base et sont stables par les deux opérations a encore ces propriétés, et elle est contenue dans chacune d'elles.

Il en résulte un principe d'induction : une propriété vraie des fonctions de base, et conservée par composition et par récurrence primitive, est vraie de toute fonction primitive récursive, puisque l'ensemble des fonctions primitives récursives qui l'ont est stable et contient les fonctions de base.

Récurrence primitive. Fixons xx. Le théorème de définition par récurrence, appliqué à l'ensemble E=ℕ×ℕE = \mathbb N \times \mathbb N, à l'élément (0,f(x))(0, f(x)) et à l'application (m,v)↦(m+1,g(x,m,v))(m, v) \mapsto (m + 1, g(x, m, v)), fournit une suite uu telle que u(0)=(0,f(x))u(0) = (0, f(x)) et u(k+1)=(m+1,g(x,m,v))u(k + 1) = (m + 1, g(x, m, v)) si u(k)=(m,v)u(k) = (m, v). Par récurrence, la première composante de u(k)u(k) est kk ; notant h(x,k)h(x, k) la seconde, on obtient les deux égalités voulues. Toute fonction qui les vérifie coïncide avec hh, par récurrence sur yy. Le cas sans paramètre est identique.

Exemples. L'addition s'obtient par récurrence primitive à partir de f=P11f = P^1_1 et de g(x,y,z)=S(P33(x,y,z))g(x, y, z) = S(P^3_3(x, y, z)), puisque x+0=xx + 0 = x et x+(y+1)=S(x+y)x + (y + 1) = S(x + y) (Addition, multiplication).

De même, x⋅0=Z(x)x \cdot 0 = Z(x) et x(y+1)=xy+xx(y + 1) = xy + x ; puis x0=S(Z(x))x^0 = S(Z(x)) et xy+1=xy⋅xx^{y+1} = x^y \cdot x ; puis 0!=10! = 1 et (y+1)!=y!⋅S(y)(y + 1)! = y! \cdot S(y), ces deux dernières sans paramètre. Dans chaque cas, la fonction gg est une composée de projections et de fonctions déjà obtenues.

Le prédécesseur vérifie pr(0)=0\mathrm{pr}(0) = 0 et pr(y+1)=y=P12(y,pr(y))\mathrm{pr}(y + 1) = y = P^2_1(y, \mathrm{pr}(y)). La soustraction tronquée vérifie x−˙0=xx \mathbin{\dot{-}} 0 = x et x−˙(y+1)=pr(x−˙y)x \mathbin{\dot{-}} (y + 1) = \mathrm{pr}(x \mathbin{\dot{-}} y).

Enfin sg‾(x)=1−˙x\overline{\mathrm{sg}}(x) = 1 \mathbin{\dot{-}} x et sg(x)=1−˙(1−˙x)\mathrm{sg}(x) = 1 \mathbin{\dot{-}} (1 \mathbin{\dot{-}} x), où la constante 11 est la fonction S∘ZS \circ Z.

□
Remarque

Une fonction primitive récursive est totale, définie en tout point, et se calcule par des boucles dont le nombre de tours est connu avant d'y entrer : pour obtenir h(x,y)h(x, y), on applique gg exactement yy fois. C'est ce caractère borné qui fait leur force, puisque tout calcul y termine, et leur limite, que le nœud Ackermann met en évidence.

Remarque

L'erreur la plus répandue est de croire que la récurrence primitive autorise n'importe quelle définition récursive. Elle ne permet de définir h(x,y+1)h(x, y + 1) qu'à partir de h(x,y)h(x, y), avec les mêmes paramètres xx ; une récurrence qui fait varier le paramètre, comme celle de la fonction d'Ackermann, sort de la classe.

Ouvrir dans l'atlas interactif →