--- up: tags: - s/maths - s/informatique aliases: - fonctions récursives primitives - récursive primitive 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 \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}))$ > > 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 > > 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)})$ ## Schémas de définition supplémentaires On peut trouver de nouveaux schémas de définitions de fonctions qui sont stables sur les fonctions récursives primitives. # Exemples