fonctions récursives primitives — corrigé partiel Pa

publicité
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 hdé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
Téléchargement