UNIVERSITE JOSEPH FOURIER M1-info Calculabilité Année 2013-14 TD1 — fonctions récursives primitives — corrigé partiel Partie I : définition des RP avec base réduite et exemples de RP 1. Une base plus réduite pour RP. La définition standard des fonctions récursives primitives est (p) RP = < {m(n) , Ai , S}, {σ, ρ} > avec m, n, i, p ∈ N, 1 ≤ i ≤ p où (n) – la base est formée des constantes m(n) (constante m d’arité n), Ai le choix du ième argument parmi n, S (ou Succ) le successeur, – les règles ou constructeurs sont la substitution régulière σ (ou CompReg), et le schéma de récursion primitive ρ (ou RecP rim). Montrer qu’on peut aussi bien définir RP avec la seule constante 0(0) d’arité 0 : (n) RP = < {0(0) , Ai , S}, {σ, ρ} > avec n ∈ N, 1 ≤ i ≤ n I Appelons provisoirement RP 0 l’ensemble défini ci-dessus (avec la base réduite). Il est évident que RP 0 ⊆ RP , puisque Base(RP 0 ) ⊂ Base(RP ) et que les opérations de clôture sont les mêmes. Montrons que par IN que RP ⊆ RP 0 , i.e. que (∀(m, n) ∈ N 2 )[m(n) ∈ RP 0(n) ]. – On utilisera l’ordre lexicographique sur N 2 . – Soit (m0 , n0 ) un couple arbitraire d’entiers. Supposons par HI que (∀(m, n) ∈ N 2 )[(m, n) < (m0 , n0 ) =⇒ m(n) ∈ RP 0(n) ]. 0 0 – Montrons alors que m0(n ) ∈ RP 0(n ) . Trois cas se présentent. 0 0 (a) m0 = n0 = 0 : on a bien m0(n ) = 0(0) ∈ RP 0(n ) . 0 (b) m0 = 0, n0 = n + 1. Donc m0(n ) = 0(n+1) . Or 0(n+1) (y, ~x) = 0 = 0(n) (~x). Donc 0(n+1) (n+1) (n+1) s’obtient par substitution à partir de 0(n) : 0(n+1) = σ[0(n) , A2 , . . . , An+1 ]. Comme (0, n) < (0, n + 1), l’HI s’applique, et 0(n) ∈ RP 0 . Donc on a aussi 0(n+1) ∈ RP 0 . 0 0 0 (c) m0 = m + 1, n0 quelconque. Alors m0(n ) (~x) = (m + 1)(n ) (~x) = m(n ) (~x) + 1. Donc 0 m0(n ) = σ[S, m(n0 )]. Comme (m, n0 ) < (m0 , n0 ), l’HI s’applique, et m(n0 ) ∈ RP 0 . 0 Donc m0(n ) ∈ RP 0 . On peut bien sûr aussi faire une double récursion, sur m puis sur n, ou l’inverse. J 2. Quelques fonctions RP. Montrer que les fonctions suivantes sont récursives primitives (RP) en les construisant à partir de fonctions de base avec les constructeurs CompReg (σ) et RecP rim (ρ) : (a) la multiplication M ult = λxy[x × y] (on a déjà vu que Add = λxy[x + y] ∈ RP ) ; (b) la puissance ou exponentielle P uiss = Ack2 = λxy[x ↑ y] (donc P uiss(x, y) = x ↑ y = xy ) ; (c) la double puissance P P uiss = Ack3 = lambdaxy[x ↑↑ y] (P P uiss(x, y) = x ↑ (x ↑↑ x)) ; {z } | y fois (d) le signe sg = λx[x > 0] (sg(x) = 0 si x = 0 et 1 si x > 0) ; (e) le prédécesseur P d défini par P d(x) = 0 si x = 0 et x − 1 si x > 0 ; (f) la différence entière (ou“propre”, ou “tronquée”) Dif f = λxy[x−̇y] (Dif f (x, y) = x−̇y = x − y si x ≥ y et 0 sinon) ; (g) la différence absolue Abs = λxy[|x − y|]. 3. P Somme finie. Montrer que si f (n+1) est RP, alors h(n+1) = Σ[f ] définie par h(y, ~x) = y x) est aussi RP. i=0 f (i, ~ 4. Prédicats RP simples. Montrer que les prédicats suivants sont RP : x = 0 ; x > y ; x < y ; x = y. (On a simplifié l’écriture en omettant les lambda ici . . . ) 5. Nombres parfaits. Le nombre x est parfait s’il est égal à la somme de tous ses diviseurs propres (différents de lui-même). Par exemple : 6 = 1 + 2 + 3, 28 = 1 + 2 + 4 + 7 + 14. Montrer que le prédicat EstParfait est récursif primitif. 1 1. On pourra aussi montrer que, pour tout nombre de Mersenne, i.e. tout nombre premier de forme 2p+1 − 1, le nombre E(p) = 2p (2p+1 − 1) est parfait, et que la propriété d’être un nombre de Mersenne est aussi récursive primitive. Partie II : utilisation des propriétés de fermeture des RP 1. Montrer que les fonctions suivantes sont récursives primitives en utilisant les propriétés de fermeture : (a) Reste(2) = λxy[x mod y] ; [Rappel : on convient que x mod 0 = x et que x div 0 = x.] (b) Quotient(2) = λxy[x div y] ; (c) ex2(1) : ex2(x) = l’exposant de 2 dans la décomposition de x en facteurs premiers ; (d) P r(1) : P r(x) = px = le x-ième nombre premier (avec P r(0) = pr0 = 2) ; (e) exp(2) : exp(x, y) = l’exposant de px dans la décomposition de y en facteurs premiers. (f) C (2) : Cxy = le nombre de combinaisons de x éléments pris y à y ; j k(1) √ √ √ (g) : b xc = la partie entière de x ; (h) blogc(2) , où blogx yc = la partie entière de logx y ; I Ces démonstrations ont été faites en cours et sont dans le poly, sauf pour Cnp . Pour celle-là, il suffit de remarquer que Cnp = bn!/(p! × (n − p)!)c, car “la division tombe juste”, et que la factorielle est une fonction RP. J 2. Montrer que les prédicats RP sont fermés par les opérations suivantes : ∧ ; ∨ ; ¬, ∃≤ ; ∀≤ . I Fait en cours. J 3. Substitution. Soit P un prédicat RP (d’arité n) et f1 , . . . fn des fonctions RP (d’arité k). Montrer que le prédicat Q (d’arité k) défini par Q(z) ≡ P (f1 (z), . . . , fn (z)) est aussi RP. I Immédiat en considérant les fonctions caractéristiques. J 4. Montrer que les prédicats x | y (autre notation : Divise(x, y)), EstP remier(x) et x mod y = z sont RP. (On a simplifié l’écriture en omettant encore ici les lambda. . . ) I Immédiat. J Partie III : RP relative et autres exercices Rappel On définit formellement la classe RP A des fonctions récursives primitives “relativement à A ⊆ N” par : D E (n) RP A = {m(n) , Ai , S, 1A }, {σ, ρ} avec m, n ∈ N, 1 ≤ i ≤ n, où (n) – la base est formée des constantes m(n) (constante m d’arité n), Ai le choix du i-ème argument parmi n, S (ou Succ) le successeur, et 1A la fonction caractéristique de A ⊆ N 2 , – les règles ou constructeurs sont la substitution régulière σ (ou CompReg), et le schéma de récursion primitive ρ (ou RecPrim). h i Qz f1 (z,x,y) 1. Soient les fonctions f1 et f2 définies par f1 = λzxy [ t=0 (x + y + t)] et f2 = λzxy (z+1) . 2. 1A (n) = 1 si n ∈ A et 0 si n ∈ / A. On a donc f1 (z, x, y) = (x + y)(x + y + 1) · · · (x + y + z). (a) Montrer que f1 est récursive primitive (f1 ∈ RP (3) ). (b) Montrer que f2 est aussi dans RP (3) . (On suppose qu’on a déjà montré que + et div sont RP, mais attention, ici “/” dénote bien la division exacte). f1 (0, x, y) = x + y = P lus(x, y) f1 (z + 1, x, y) = f1 (z, x, y) × (x + y + z + 1) qui doit être de forme h(z, f1 (z, x, y), x, y) Donc h(u, v, w, t) = v × (w + t + u + 1) = M ult(v, P lus(P lus(w, t), S(u)). (4) (4) (4) (4) Par suite, f1 = ρ[P lus, σ[M ult, A2 , σ[P lus, σ[P lus, A3 , A4 ], σ[S, A1 ]]]]. J x + y si x + y + 1 6∈ A 2. Soit f définie par f (x, y) = . ↑ sinon I On a donc : (a) Construire une machine de Turing très simple calculant f . I On doit partir dans la configuration q0 |x+1 B|y+1 . Pour faire le test, on effacera le premier |. Si le test est positif, on bouclera, sinon on ôtera le premier | du second bloc. D’où : q0 | B q 0 ` q0 B|x B|y+1 q0 B q1 q2 ` q1 B|x B|y+1 si x + y + 1 ∈ A, ` q2 B|x B|y+1 sinon q1 B B q 1 Bouclage si x+y+1∈ A q2 B R q3 Sinon, recherche du bloc |y+1 q 3 | R q3 q3 B R q4 `x+1 B|x Bq4 |y+1 q4 | B q 4 Effacement du | et arrêt en B |x Bq4 B|y J (b) Montrer que f 6∈ RP A sauf si A ⊆ {0}, mais qu’on a toujours f ∈ P A . I Clairement, f ∈ RP A ssi f est totale. En effet, si elle l’est, c’est qu’on est toujours dans le premier cas, et donc c’est l’addition (f = P lus), qui est RP. D’autre part, f est totale ssi (∀x, y ∈ N)[x + y + 1 6∈ A], i.e. ssi A ⊆ {0}. Il y a donc deux cas, A = ∅ et A = {0}. J 3. Soit g et hdéfinies par bx/2c + y si x ∈ A by/2c + x si x 6∈ A et y ∈ A g(x, y) = ↑ sinon bx/2c + y si x + y ∈ A by/2c + x si y + z 6∈ A h(x, y, z) = ↑ sinon et (a) Montrer que g ∈ P A , et qu’il y a une seule valeur de A (⊆ N) telle que g soit totale (f ∈ RA ). I Le cas indéfini est “x ∈ / A et y ∈ / A”, et les trois cas sont exclusifs l’un de l’autre. Pour rendre compte des cas où g est définie, on cherche h telle que h(x, y) ↓ ssi x ∈ A ou y ∈ A. Il faut faire appel à la minimisation pour le cas h(x, y) ↑. Une possibilité est de définir h par h(x, y) = µz[(1A (x) + 1A (y))−̇z ≥ 1]. Alors ( 0 si x ∈ A ou y ∈ A h(x, y) = ↑ sinon Donc g(x, y) = (1 + h(x, y)) × [1A (x) × (bx/2c + y) + sg(1A (x)) × 1A (y) × (by/2c + x)]. h ∈ P A , car h est obtenue par minimisation sur une fonction de RP , donc totale et dans P . On peut en effet écrire encore plus précisément : h(x, y) = µz[sg((1A (x) + 1A (y))−̇z) = 0]. Par suite, g ∈ P A , car g est obtenue par substitution générale à partir de fonctions de P A (et même de RP A pour toutes celles différentes de h). On peut aussi écrire directement : g(x, y) = 1A (x) ∗ ([x/2] + y) + sg(1 ¯ A (x)) ∗ (1A (y) ∗ ([y/2] + x) + µz[z + 1A (x) + 1A (y) = 0]. Enfin, g n’est totale que si A = N. J (b) Montrer que, sauf pour trois valeurs particulières de A ⊆ N, h 6∈ P A . Donner ces trois valeurs A1 , A2 et A3 , et les fonctions h1 , h2 et h3 correspondantes. I i) h est une fonction si A est vide (a = ∅) ou plein (A=N), car on est alors toujours dans le 1er ou le 2ème cas. ii) Si A n’est ni vide ni plein, on est dans ces deux cas à la fois si par exemple x = a ∈ A, y = 0, et z = c ∈ / A. Ces deux cas sont incompatibles si (x div 2) 6= x, soit si x 6= 0 : le système produit alors une relation non fonctionnelle. Donc h est aussi une fonction si A = {0}, et alors on n’est jamais dans le 2ème cas. iii) Y a-t-il d’autres possibilités ? Non. En effet, si A contient a > 0 et n’est pas plein, on peut prendre (x, y, z) = (a, 0, c) avec c ∈ / A, et on a 2 valeurs différentes puisque (a div 2) 6= a. On peut en conclure que h est une fonction ssi A est vide, ou plein, ou réduit à {0}. Que vaut alors h ? – Dans les deux premiers cas, h est une fonction de RP A . Pour A1 = ∅, h1 (x, y, z) = by/2c + x. Pour A2 = N, h2 (x, y, z) = bx/2c + y. – Dans le troisième cas, pour A3 = {0}, si x = y = 0 0 h3 (x, y, z) = by/2c + x si y + z > 0 ↑ sinon : y = z = 0 et x > 0 On peut alors écrire : h3 (x, y, z) = sg(y +z)×(by/2c+x)+µi[i+sg(y +z)×sg(x) = 0], et donc h3 ∈ P A . J 4. Soit ψ définie par ψ(x, y) = µt[(x + y)−̇t2 = 0]. (−̇ désigne la différence propre.) (a) Montrer que ψ est intuitivement calculable en donnant un (semi-)algorithme qui la calcule. L’appliquer au calcul de ψ(2, 3). I Programme ψ(x, y) ; t ← 0; while do- ( return (t). Pour ψ(2, 3), x + y = 5. (x + y)−̇t2 vaut 5 pour t = 0, 4 pour t = 1, 1 pour t = 2, et 0 pour t = 3. Donc ψ(2, 3) = 3. J (b) Montrer qu’on peut transformer la définition de ψ de façon à remplacer µ par un minimum borné. (Pour cela, étudier ce que vaut ψ(x, y) par rapport aux deux carrés parfaits qui entourent x + y.) √ Exprimer alors ψ à l’aide du minimum borné et des opérateurs et d e. Cela suffitil pour montrer que ψ ∈ RP ? I ψ(x, y) est la racine carrée t du plus petit carré parfait t2 supérieur ou égal à √ (x + y). Donc ψ(x, y) = M in z ≤ (x + y)[z 2 ≥ (x + y)] = d x + ye. Le minimum borné conserve le caractère récursif primitif. Or il s’applique ici à des prédicats et fonctions récursifs primitifs. Donc ψ ∈ RP . √ √ Remarque : il ne faudrait pas dire qu’on substitue dans d e, car 6∈ RP ! Ce qui l m hl m h ii (2) (2) √ √ est RP, c’est . On peut d’ailleurs écrire : ψ = σ , σ P lus, A1 , A2 . J