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

164 lines
9.9 KiB
Markdown

---
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