--- up: tags: - s/maths - s/informatique aliases: - fonctions récursives primitives source: --- > [!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 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}))$ > > Où $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 # Exemples