Files
cours/fonction récursive primitive.md
2026-02-12 17:35:34 +01:00

10 KiB

up, tags, aliases, source
up tags aliases source
s/maths
s/informatique
fonctions récursives primitives
récursive primitive

[!definition] fonction récursive primitive On définit par induction l'ensemble des fonctions récursives primitives comme suit :

[!definition] ensembles \mathscr{F}_{p} et \mathscr{F} Soit p \in \mathbb{N} on note \mathscr{F}_{p} l'ensemble des applications de \mathbb{N}^{p} \to \mathbb{N} (par convention, \mathscr{F}_{0} ne contient que la suite vide) On note \displaystyle\mathscr{F} = \bigcup _{p \in \mathbb{N}} \mathscr{F}_{p}

[!definition] Fonctions projection On note P_{p}^{i} (pour 1 \leq i \leq p) la fonction de \mathscr{F}_{p} telle que pour tout x_1, \dots, x_{p} \in \mathbb{N} on a : P_{p}^{i}(x_1, x_2, \dots, x_{p}) = x_{i}

[!definition] fonction successeur On note S la fonction de \mathscr{F}_{1} qui à chaque entier n fait correspondre n+1 : S = \lambda x. x+1

[!definition] Définition par récurrence Soient f \in \mathscr{F}_{p} et g \in \mathscr{F}_{p+2}, il existe une unique fonction de \mathscr{F}_{p+1} qui, pour tout x_1, \dots, x_{p}, y \in \mathbb{N} respecte :

  • f(x_1, x_2, \dots, x_{p}, 0) = g(x_1, x_2, \dots, x_{p})
  • f(x_1, x_2, \dots, x_{p}, y+1) = h(x_1, x_2, \dots, x_{p}, y, f(x_1, x_2, \dots, x_{p}, y))

L'ensemble des fonctions récursives primitives est alors le plus petit des sous ensembles E de \mathscr{F} tel que :

  • E contient toutes les fonctions constantes de \mathscr{F}
    • i On notera C_{p}^{x} la fonction constante d'arité p valant x partout
  • E contient toutes les projections P_{p}^{i} pour tous les entiers p et i avec 1 \leq i \leq p
  • E contient la fonction successeur S
  • E est clos par composition, c'est-à-dire que si n,p \in \mathbb{N} , si f_1, f_2, \dots, f_{n} sont des fonctions de \mathscr{F}_{p} qui sont aussi dans E, et si g \in \mathscr{F}_{n} est aussi dans E, alors la fonction composée g(f_1, f_2, \dots, f_{n}) appartient à E
    • i on accepte l'abus de notation g(f_1, f_2, \dots, f_{n}) pour la composition
  • E est clos par récurrence, cc'est-à-dire que si p \in \mathbb{N}, si g \in \mathscr{F}_{p} et h \in \mathscr{F}_{p+2} sont dans E, alors la fonction f \in \mathscr{F}_{p+1} définie par récurrence à partir de g et h est aussi dans E : f : \begin{cases} f(x_1,x_2, \dots, x_{p}, 0) = g(x_1, x_2, \dots, x_{p})\\ f(x_1, x_2, \dots, x_{p}, y+1) = h(x_1, x_2, \dots, x_{p}, y, f(x_1, x_2, \dots, x_{p}, y)) \end{cases}
    • i on pourra noter f = \rho(g, h)

^definition

[!definition] Définition courte Soit \mathscr{F} l'ensemble des fonctions à valeurs entières et à paramètres entiers. L'ensemble des fonctions récursives primitives est alors le plus petit des sous ensembles E de \mathscr{F} tel que :

  • E contient toutes les fonctions constantes de \mathscr{F}
  • E contient toutes les fonctions de projection
  • E contient la fonction successeur
  • E est clos par composition : f_1, f_2, \dots, f_{p}, g \in E \implies g(f_1, \dots, f_{p}) \in E
  • E est clos par récurrence : si g\in \mathscr{F}_{p} et h \in \mathscr{F}_{p+2} sont dans E alors f: \begin{cases} f(\overline{x}, 0) = g(\overline{x})\\ f(\overline{x}, y+1) = h(\overline{x}, y, f(\overline{x}, y)) \end{cases} est dans E
    • i on pourra noter f = \rho(g, h)

Remarques

[!info] Définition par le bas On peut également produire une définition "par le bas", en construisant d'abord l'ensemble R_0 contenant les fonctions constantes, projections et successeur, puis en posant pour tout n \in \mathbb{N} : R_0 = \{ \gamma \mid p \in \mathbb{N} \text{ et } \gamma \text{ est une fonction constante de } \mathbb{N}^{p} \to \mathbb{N} \} \cup \{ P_{p}^{i} \mid 1 \leq i \leq p \} \cup \{ S \} \begin{align} R_{n+1} = R_{n} &\cup \{ h \mid h \text{ est obtenue par récurrence à partir de deux fonctions de } R_{n} \}\\ &\cup \{ h \mid h \text{ est obtenue par composition de deux fonctions de } R_{n} \} \end{align}

[!info] Montrer une propriété des fonctions récursives primitives

  • on peut montrer que cette propriété \mathscr{P} est vraie sur les fonctions constantes, projections et successeur, puis montrer que \mathscr{P} est stable par composition et récursion
  • on peut montrer que \mathscr{P} est vraie sur R_0 puis que si \mathscr{P} est vraie partout sur R_{n} pour un n \in \mathbb{N}, alors elle est aussi vraie partout sur R_{n+1}

Propriétés

[!proposition]+ les fonctions récursives primitives possèdent des algorithmes les calculant Il existe un algorithme pour calculer chacune des fonctions récursives primitives.

[!démonstration]- Démonstration Cela est évident :

  • les fonctions constantes, projections et la fonction suivant possèdent toutes des algorithmes pour les calculer
  • si f_1, f_2, \dots, f_{n} et g \in \mathscr{F}_{n} sont des fonctions récursives primitives pour lesquelles il existe un algorithme de calcul, alors il existe un algorithme pour calculer g(f_1, f_2, \dots, f_{n}), qui consiste à donner en entrée de l'algorithme de calcul de g les résultats des algorithmes de calcul de f_1, f_2, \dots, f_{n}
  • si g \in \mathscr{F}_{p} et h \in \mathscr{F}_{p+2} sont deux fonctions récursives primitives pour lesquelles il existe un algorithme de calcul, alors la fonction f \in \mathscr{F}_{p+1} définie par récurrence à partir de g et h admet également un algorithme de calcul, qui consiste en l'application du schéma de réccurence dans un algorithme :
    PROCEDURE f(x1, x2, ..., xn, y)
      rec <- g(x1, x2, ..., xn)
      FOR i <- 0 .. y:
        rec <- h(x1, x2, ..., xn, i, rec)
      END_FOR
      RETURN rec
    END_PROCEDURE
    

Cela montre bien que la propriété de posséder un algorithme est vraie partout sur l'ensemble des fonctions récursives primitives

Fonctions élémentaires

Dans cette section, on démontre que quelques fonctions élémentaires sont récursives primitives.

[!proposition]+ L'addition est récursive primitive La fonction d'addition \lambda x y. x + y est récursive primitive

  • dem \operatorname{add} = \rho(P_1^{1}, S(P_3^{3}))

[!démonstration]- Démonstration On peut la définir par : \begin{cases} x+0 = x\\ x+ (y+1) = (x+y) +1 \end{cases}

Plus formellement, l'addition peut être définie par \rho(P_1^{1}, S(P_{3}^{3})) \rho(\underbracket{P_1^{1}}_{\text{cas } x+0 = 0}, \underbracket{S(P_{3}^{3})}_{\text{cas }x+(y+1) = S(x+y)})

^addition

[!proposition]+ La multiplication est récursive primitives \operatorname{mult} =\lambda xy. x \times y est récursive primitive

  • dem \operatorname{mult} = \rho(C_1^{0}, \operatorname{add}(P_3^{3}, P_{3}^{1}))

[!démonstration]- Démonstration \operatorname{mult} = \rho(C_1^{0}, \operatorname{add}(P_3^{3}, P_{3}^{1}))C_1^{0} = \lambda x. 0 et \operatorname{add} est la fonction d'addition définie plus haut Comme on sait déjà que \operatorname{add} est récursive primitive, il suit que \operatorname{mult} l'est également ^multiplication

[!proposition]+ La fonction puissance est récursive primitive \operatorname{pow} = \lambda xy. x^{y} est récursive primitive

  • dem \operatorname{pow} = \rho(C_{1}^{1}, \operatorname{mult}(P_{3}^{3}, P_3^{1})) ^puissance

[!proposition]+ La soustraction positive est récursive primitve On note x \dot{-} y la soustraction avec un plancher à 0 : x \dot{-} y = \begin{cases} x-y \text{ si } x \geq y\\ 0 \text{ sinon} \end{cases} La fonction \lambda xy. x \dot{-} y est récursive primitive.

[!corollaire] Lemme : le précédent positif est récursif primitif La fonction \lambda x. x \dot{-} 1 est récursive primitive

[!démonstration]- Démonstration On peut définir \lambda x. x \dot{-} 1 comme \rho(C_1^{0}, P_2^{1}) Cela montre que cette fonction est bien récursive primitive

[!démonstration]- Démonstration Notons \operatorname{prec} = \lambda x.x \dot{-}1. On a démontré dans le lemme précédent que cette fontion est récursive primitive. Maintenant, on peut définir \operatorname{sub} = \lambda xy.x \dot{-} y comme : \operatorname{sub} = \rho(P_1^{1}, \operatorname{prec}(P_3^{3}))

[!proposition]+ La fonction signe est récursive primitive On définit la fonction signe par : \operatorname{sg}: \begin{cases} \operatorname{sg}(0) = 0\\ \operatorname{sg(x) = 1 \text{ si } x \neq 0} \end{cases} (car on est sur \mathbb{N}) Cette fonction est récursive primitive

[!démonstration]- Démonstration On peut écrire \operatorname{sg} de plusieurs manières :

  • \operatorname{sg} = 1 \dot{-} (1 \dot{-}x)
  • \operatorname{sg} = \rho(C_0^{0}, C_2^{1}) Ce qui montre, dans tous les cas, que \operatorname{sg} est récursive primitive

[!proposition]+ Le prédicat x>y est récursif primitif Le prédiat x>y est récursif primitif.

  • dem ce prédicat est équivalent à \operatorname{sg}(x \dot{-}y)

Propriétés de clôture

[!proposition]+ clôture par substitution de variables L'ensemble des fonctions récursives primitives est clos par substitution de variables : Soit f \in \mathscr{F}_{p} récursive primitive Soit \sigma : [\![1; p]\!] \to [\![1;p]\!] Alors la fonction \lambda x_1 x_2\dots x_{p}. f(x_{\sigma(1)}, x_{\sigma(2)}, \dots, x_{\sigma(p)}) est aussi récursive primitive

  • dem cette fonction est égale à f(P_{p}^{\sigma(1)}, P_{p}^{\sigma(2)}, \dots, P_{p}^{\sigma(p)})

[!proposition]+ Si A \subseteq \mathbb{N}^{n} est ensemble récursif primitif et si f_1, f_2, \dots, f_{n} \in \mathscr{F}_{p} sont récursives primitives Alors l'ensemble : \{ (x_1, x_2, \dots, x_{p}) \mid (f_1(x_1, x_2, \dots, x_{p}), f_2(x_1, x_2, \dots, x_{p}), \dots, f_{n}(x_1, x_2, \dots, x_{p})) \in A \} est aussi récursif primitif (sa fonction caractéristique est \chi _{A}(f_1, f_2, \dots, f_{n}))

Exemples