158 CHAPITRE 7. FONCTIONS RÉCURSIVES 7.2 Fonctions récursives totales Un ensemble de fonctions F est fermé par minimisation si, pour toute application ξ ∈ F telle que ∀"n∃m.ξ("n, m) = 0, la fonction φ définie par φ("n) = min(ξ("n, m) = 0) m est dans F . Definition 7.2.1 L’ensemble des fonctions récursives (totales) est le plus petit ensemble de fonctions qui contient les fonctions initiales et qui est fermé par composition, récursion primitive, et minimisation. Théorème 7.2.1 La fonction d’Ackermann est récursive totale. C’est une conséquence de l’exercice 169. Exercice 167 Montrer que la fonction J : J(x, y) = x + (x + y)(x + y + 1) 2 est une bijection de N2 dans N. On note (K(z), L(z)) = J −1 (z). Montrer que J, K, L ∈ C. Exercice 168 Soit p0 , p1 , . . . , pn , ... la suite strictement croissante des nombres premiers. Montrer que les fonctions suivantes sont primitives récursives : 1. La fonction PrimeS(n) = pn 2. La fonction Log qui, à i, n associe l’exposant de pi dans la décomposition de n en facteurs premiers. Exercice 169 (6) Soit p0 , p1 , . . . , pn , . . . la suite des nombres premiers et C l’application qui à une suite finie d’entiers k0 , . . . , kn associe pk00 +1 × · · · × pnkn +1 . C est une injection de l’ensemble des suites finies d’entiers dans N. 1. Montrer que la fonction D définie par : ! ri + 1 Si ∃n ≥ i, ∃r1 , . . . , rn . k = C(J(0, r0 ), . . . , J(n, rn )) D(i, k) = 0 sinon est récursive primitive. 2. Soit A" la fonction définie par : m+1 A" (n, m, k) = D(J(n − 1, 1), k) D(J(n − 1, D(J(n, m − 1), k)), k) Montrer que A" est récursive primitive. Si n = 0 Si n > 0, m = 0 sinon 7.2. FONCTIONS RÉCURSIVES TOTALES 159 3. k est une approximation de la fonction d’Ackermann si (a) pour tous n, m, D(J(n, m), k) '= 0 entraine D(J(n, m), k) = A" (n, m, k) (b) pour tout n, pour tout m, si D(J(n, m), k) '= 0, alors pour tout j < m, D(J(n, j), k) '= 0. Soit P le prédicat qui est vrai sur les entiers qui sont des approximations de la fonction d’Ackermann. Montrer que P est récursif primitif. 4. Montrer que, pour tous n, m ∈ N (a) si P (k) = 1 et D(J(n, m), k) '= 0, alors A(n, m) = A" (n, m, k) (b) il existe un entier k tel que D(J(n, m), k) '= 0 et P (k) = 1. 5. En déduire qu’il existe deux fonctions récursives primitives φ, ψ telles que, pour tous n, m ∈ N, A(n, m) = ψ(n, m, min{x ∈ N | φ(n, m, x) = 0}) Exercice 170 (5) Si h est une fonction de N dans N on appelle itération de h la fonction f (n, x) définie par : ! x si n = 0 f (n, x) = h(f (n − 1, x)) sinon Montrer que la plus petite classe de fonctions sur les entiers qui contient les fonctions de base, les fonctions J, K, L et qui est close par itération et composition, coı̈ncide avec l’ensemble des fonctions récursives primitives. Exercice 171 Montrer qu’il existe une fonction non récursive primitive dont le graphe est récursif primitif. (Le graphe de f est l’ensemble des paires (n, f (n)). 160 7.3 CHAPITRE 7. FONCTIONS RÉCURSIVES Fonctions semi-récursives et ensembles récursivement énumérables La minimisation est étendue au cas où on n’a pas nécessairement ∀"n∃m.ξ("n, m) = 0. Dans ce cas, la fonction φ définie est une fonction partielle : φ("n) = min{m | (ξ("n, m) = 0) ∧ ∀k < m, ξ("n, k) '=⊥} La composisition de fonctions récursives totales est étendue aux fonctions partielles : la composée n’est définie que lorsque les fonctions composantes le sont. De même, la récursion primitive appliquée à des fonctions partielles : φ = Prim(ξ, ψ) est définie en (m, "n) si m = 0 et ξ("n) '=⊥ ou bien m > 0, φ(m − 1, "n) est définie et ψ est définie en (φ(m − 1, "n), m − 1, "n). Definition 7.3.1 L’ensemble des fonctions récursives partielles (aussi appelées fonctions semi-récursives) est le plus petit ensemble de fonctions sur les entiers contenant les fonctions initiales et clos par récursion primitive, composition et minimisation. Un ensemble est récursif si sa fonction caractéristique est une fonction récursive totale. Un ensemble S est récursivement énumérable si la fonction qui vaut 1 quand n ∈ S et est indéfinie ou vaut 0 quand n ∈ / S est récursive partielle. 7.3.1 Turing-calculabilité et fonctions récursives A l’appui de la thèse de Church, les notions de calculabilité définies sur les entiers par les machines de Turing et les fonctions récursives partielles coı̈ncident : Théorème 7.3.1 Soit f : Nk → N une fonction partielle. f est semi récursive (resp. récursive) ssi il existe une machine de Turing Mf telle que Mf s’arrête exactement sur les données du domaine de définition de f et, lorsqu’elle s’arrête sur n1 , . . . , nk , le ruban contient f (n1 , . . . , nk ). Preuve: On suppose que les entiers sont représentés (dans une base b) par des mots. Tout d’abord, si f est récursive partielle (resp. récursive totale), f est calculable par une machine de Turing. On montre que l’ensemble des fonctions partielles calculables par une M.T., contient les fonctions initiales et est clos par récursion primitive, par composition et par minimisation. – soit M0 une machine à k rubans et M1 , . . . , Mk k machines à n rubans calculant respectivement f0 , f1 , . . . , fk . La machine à n × k rubans dont les données sont sur les rubans de numéro divisible par k et qui simule Mi sur les rubans i × k − i + 1, . . . , i × k, puis M0 sur les rubans de numéros divisibles par k calcule f0 (f1 ("n), . . . , fk ("n)) (et ne s’arrête pas lorsque l’une des fonctions fi n’est pas définie en n ou bien f0 n’est pas définie sur f1 ("n), . . . , fk ("n)) 7.3. FONCTIONS SEMI-RÉCURSIVES ET ENSEMBLES RÉCURSIVEMENT ÉNUMÉRABLES161 – Pour la minimisation : on garde sur un ruban les essais successifs de la valeur n. Initialement, n = 0. Si le calcul de f (n, "x) se termine et donne 0, on rend n. Si le calcul se termine avec une valeur distincte de 0, on incrémente n et on recommence. **a detailler ** – Pour la récursion primitive **a détailler ** Réciproquement, étant donné une machine de Turing, on construit une fonction récursive primitive qui simule un mouvement de la machine, puis avec un coup de minimisation on termine. Plus précisément : les mots sont considérés comme des entiers en base |Σ|+1. Les configurations sont des triplets (q, w1 , w2 ) et sont donc codés de manière bijective par des entiers supérieurs ou égaux à 2. La fonction f qui à C(q, w1 , w2 ) associe C(q " , w1" , w2" ), codage de la configuration suivante si elle existe et 0 si q = accept, 1 si q = reject, est une fonction primitive récursive puisque les fonctions reste, produit, somme sont primitives récursives. On définit alors g(n, γ) par g(0, γ) = γ et g(n + 1, γ) = g(n, f (γ)). Enfin, h(γ) = g(min g(n, γ) = 0, γ) n calcule, à partir du codage d’une configuration γ, le codage de la configuration finale de la machine (si elle existe) correspondant à un calcul commençant par la configuration dont le code est γ. On déduit alors que la fonction calculée est récursive, car le codage et le décodage d’une configuration sont récursives. Enfin, remarquons que dans ces constructions, le calcul de la machine sur la donnée D se termine si et seulement si la fonction récursive correspondante est définie sur la donnée D. Corollaire 7.3.1 (Kleene) Toute fonction récursive partielle s’obtient à l’aide d’une seule minimisation d’une fonction primitive récursive. Exercice 172 (5) Montrer que le problème suivant est indécidable : Donnée : une fonction récursive primitive f Question : f calcule-t-elle la fonction nulle ? Exercice 173 (5) Montrer que, si f est une fonction récursive partielle, alors son graphe est récursif primitif. 7.3.2 Élimination de la récursion primitive On veut montrer que la récursion primitive peut être simulée par les autres constructions. On note C le plus petit ensemble de fonctions sur les entiers qui contient les fonctions initiales, l’addition, la multiplication, l’égalité, et qui est clos par composition et minimisation. (Donc pas de récursion primitive ici). Exercice 174 Montrer que les fonctions ou prédicats suivants sont dans C :