Ejercicios de Computabilidad (III). COMPUTACI ´ ON
Sea φ(f ) una propiedad en la clase F de funciones sobre N de cualquier aridad, definida de la siguiente manera:
φ(f ) ≡ ∃n, ∃g0, ..., gn( gn= f ∧
( ∀i ≤ n ( gi es b´asica ∨
∃i1≤ n, i2≤ n [gi= R(gi1, gi2)] ∨
∃k ≤ n, i1≤ n, ..., ik ≤ n [gi= C(gi1; gi2, ..., gik] ) ) Y sea C la clase de funciones definida por φ
Proposici´on: f es p.r. si y s´olo si φ(f ). Es decir, C = PR
⇐=|
Es decir, veamos que C ⊆ PR
Si f ∈ C, existen n ∈ N y g0, ...., gn con gn = f
Vamos a probar, por inducci´on fuerte, que para todo j ≤ n, gj es p.r.
Caso base: Si j = 0, g0 ha de ser b´asica y, por tanto, p.r.
Paso inductivo: j < n −→ j + 1|
Por h. i. todas las anteriores a gj+1 son p.r.; como ´esta o es b´asica o se obtiene por recursi´on o composici´on de anteriores, concluimos que gj+1 es p.r.
Por tanto para toda j ∈ {0, 1, ..., n}, gj es p.r. En particular, f = gn es p.r.
Hemos probado: C ⊆ PR
=⇒|
Probaremos que C es una clase tal que contiene a las funciones b´asicas y es cerrada por composici´on y recursi´on (se dice que es de tipo PRC). Como PR es la menor clase de tal tipo, concluiremos que PR ⊆ C.
• Obviamente las b´asicas son de C
• C es cerrada bajo recursi´on.
Sean g, h ∈ C de aridades respectivas n y n + 2 . Veamos que f = R(g, h) ∈ C En efecto, existen n y g0, ..., gn tales que gn= g
An´alogamente, existen m y h0, ..., hmtales que hm= h
Por tanto, tomando hm+1= f existe una sucesi´on de n+m+3 funciones, g0, ..., gn, h0, ..., hm, hm+1, tales que f = hm+1 se obtiene por recursi´on de dos funciones anteriores. Por tanto, f ∈ C
• C es cerrada bajo composici´on.
Sean las siguiente funciones de C: g, de aridad n y h1, ..., hn todas de aridad m.
Veamos que f = C(g; h1, ..., hn) es tambi´en de C
Podemos considerar para cada una de las funciones que intervienen en la composici´on:
g0, ..., gk= g h1,0, ..., h1,l1 = h1
...
hn,0, ..., hn,ln = hn
sea, pues, la sucesi´on: g0, ..., gk, h1,0, ..., h1,l1, ...., hn,0, ..., hn,ln, f Y, obviamente, se verifica φ(f ). Por tanto f ∈ C
Lema de Euclides.
Ejercicio.-
a) Probar que el predicado φ(x) ≡ x es un m´ultiplo de 3 es primitivo recursivo.
b) Dise˜nar un programa GOTO que al recibir un dato de entrada n devuelva el elemento n − ´esimo de la sucesi´on:
0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, ...
c) La sucesi´on anterior puede definirse mediante la funci´on: f : N −→ N f (0) = 0
f (x + 1) =
½ f (x) si x+1 es m´ultiplo de 3 f (x) + 1 e.c.o.c.
Probar que:
c1) f es sobreyectiva.
c2) f es primitiva recursiva.
a).-
φ(x) = ∃z ≤ x(x = 3z) b).-
[A] Z3←− Z3+ 3 [B] IF Z = X GOT O E
Z ←− Z + 1
IF Z = Z3 GOT O A Y ←− Y + 1
GOT O B
c1).- Inducci´on d´ebil en la variable y de la f´ormula ∀y(∃xf (x) = y):
Caso base: Para y = 0 tomamos x = 0: f (0) = 0
Paso inductivo: y → y + 1|: Suponemos que dado y existe x tal que f (x) = y.
• Si x + 1 es m´ultiplo de 3:
f (x + 1) = f (x) = y y como x + 2 no ser´a m´ultiplo de 3 resulta que
f (x + 2) = f (x + 1) + 1 = f (x) + 1 = y + 1. En este caso, x + 2 ser´a antiimagen de y + 1
• Si x + 1 no es m´ultiplo de 3
f (x + 1) = f (x) + 1 = y + 1 y, en consecuencia, x + 1 ser´a antiimagen de y + 1.
c2).- f es total [es f´acil probar por inducci´on que ∀x(f (x) ↓)].
Aplicamos directamente la definici´on de recursi´on:
½ f (0) = 0
f (x + 1)) = h(x, f (x)) donde h : N −→ N, definida por casos:
h(x, t) =
½ t si φ(x + 1) t + 1 e.c.o.c.
es primitiva recursiva.
Es decir, f est´a definida por recursi´on a partir de una constante y de la funci´on primitiva recursiva h. Luego es primitiva recursiva.
Ejercicio.- Probar que la siguiente funci´on es primitiva recursiva:
½ f (0) = 1, f (1) = 4, f (2) = 6
f (x + 3) = f (x) + f (x + 1)2+ f (x + 2)3
f es total (obvio).
• Primera forma: Utilizando la funci´on historia.
Para ello, reescribimos f as´ı:
f (0) = 1 f (x + 1) =
4 si x = 0
6 si x = 1
f (x − 2) + f (x − 1)2+ f (x)3 si x ≥ 2 Consideremos ahora la funci´on historia de f :
f (0) = 2ˆ f (x + 1) =ˆ
2·34 si x = 0
2·34·56 si x = 1 f (x)·pˆ f (x+1)x+2 si x ≥ 2
o sea
f (0) = 2ˆ f (x + 1) =ˆ
2·34 si x = 0
2·34,56 si x = 1
f (x)·pˆ f (x−2)+f (x−1)2+f (x)3
x+2 si x ≥ 2
es decir,
f (0) = 2ˆ f (x + 1) =ˆ
2·34 si x = 0
2·34·56 si x = 1
f (x)·pˆ ( ˆx+2f (x))x−1+(( ˆf (x))x)2+(( ˆf (x))x+1)3 si x ≥ 2
o sea, ˆf est´a definida a partir de la constante 2 y de la funci´on primitiva recursiva:
h(x, z) =
2·34 si x = 0
2·34·56 si x = 1
z·p(z)x+2x−1+((z)x)2+((z)x+1)3 si x ≥ 2
por tanto, ˆf es p.r. y, en consecuencia, la funci´on dada, f , es p.r.
• Segunda forma: La funci´on historia, f (x), ”almacena” todos los valores anteriores a x. Re- solv´amoslo ahora ”guardando” s´olo los valores estrictamente necesarios.
Definimos para ello la funci´on ”almacenadora”: G(x) = [f (x), f (x + 1), f (x + 2)]
Veamos por recursi´on que G es p.r.:
G(0) = [f (0), f (1), f (2)] = 21·34·56 G(x + 1) = [f (x + 1), f (x + 2), f (x + 3)]
= [f (x + 1), f (x + 2), f (x) + (f (x + 1))2+ (f (x + 2))3]
= [(G(x))2, (G(x))3, (G(x))1+ ((G(x))2)2+ ((G(x))3)3]
G est´a definida por recursi´on a partir de una constante, 21·34·56, y de la funci´on p.r.:
h(x, t) = [(t)2, (t)3, (t)1+ ((t)2)2+ ((t)3)3]
Por tanto, G es p.r. Finalmente, como f (x) = (G(x))1, concluimos que f es tambi´en p.r.
Ejercicio.- Probar que la siguiente funci´on es primitiva recursiva:
f (0) = 3 f (x + 1) =
Xx t=0
f (x)
Obviamente f es total.
Utilizamos la funci´on historia:
( f (0) = 2ˆ 3
f (x + 1) = ˆˆ f (x).pf (x+1)x+2 o sea,
( f (0) = 2ˆ 3
f (x + 1) = ˆˆ f (x).p
P
t≤x( ˆf (x))t+1
x+2 = h(x, ˆf (x))
es decir, ˆf est´a definida por recursi´on a partir de la constante 23 y la funci´on h definida como sigue:
h(x, z) = z.p
P
t≤x(z)t+1
x+2
que es p.r.; por tanto, ˆf es p.r. y, en consecuencia, f tambi´en lo es.
Nota: Obs´ervese que el exponente es la suma acotada, P
(,)g de la funci´on g(z, t) = (z)t+1y, por tanto, es p.r.
Otra forma:
Obs´ervese (pru´ebese como ejercicio) que la funci´on f puede escribirse:
f (0) = 3 f (x + 1) =
½ 3 si x = 0
2f (x) si x 6= 0
o tambi´en, ½
f (0) = 3 f (x + 1) = 2x·3
y, en ambos casos, probar que es p.r. es inmediato.
Ejercicio(01/12/01).- Sea f : N2−→ N definida por:
f (x, y) =
½ x si y = 0
f (bx2c, y − 1) si y ≥ 1 Probar que:
1.- Para cada z existen infinitos (x, y) tales que f (x, y) = z 2.- f es primitiva recursiva.
1).- Veamos que dado z ∈ N, se verifica que para todo k, f (2kz, k) = z Demostraci´on por inducci´on d´ebil en la variable k:
• Caso base: Si k = 0 entonces, para cualquier z, f (z, 0) = z -por definici´on-; luego se verifica la propiedad en el caso base (y, adem´as, podemos concluir que f es sobreyectiva).
• Paso inductivo: Para todo z, f (2k+1z, k + 1)def.= f (2kz, k)h.i.= z
2).- La funci´on ˆf (x, y) = [f (0, y), ..., f (x, y)] es primitiva recursiva.
En efecto, teniendo en cuenta que ˆf es total - por serlo f (*)-, veamos que puede definirse por recursi´on en la variable y, a partir de funciones primitivas recursivas:
f (x, 0) = [f (0, 0), ..., f (x, 0)] = [0, 1...x]ˆ f (x, y + 1) = [f (0, y + 1), ..., f (x, y + 1)] =ˆ Y
i≤x
pf (i,y+1)i+1 =Y
i≤x
pf (bi+12ic,y)=Y
i≤x
p( ˆi+1f (x,y))b i2c+1
Obs´ervese que:
a) ˆf (x, 0) = cId(x) donde cId es la funci´on historia de la funci´on identidad.
b) ˆf (x, y + 1) = h(x, y, ˆf (x, y), donde h(x, y, z) =Y
i≤x
exp(pi+1, (z)bi 2c+1).
As´ı pues, ˆf = R(cId; h); siendo cId y h funciones primitivas recursivas. Por tanto, ˆf es primitiva recursiva.
Finalmente, como f (x, y) = ( ˆf (x, y))x+1 concluimos que f es primitiva recursiva.
(*)Nota: Probar por inducci´on en y: ∀y(∀xf (x, y) ↓)
Ejercicio (11/01/03). Consideremos la siguiente funci´on f : N2→ N
f (x, 0) = x2, f (x, 1) = x3
f (x, y) = 3 · f (x, y − 1) + 2 · f (x, y − 2) (y ≥ 2) (a) Pru´ebese, utilizando un programa GOTO, que f es GOTO–computable.
(b) Pru´ebese que f es primitiva recursiva.
a) El siguiente programa calcula la funci´on f : Z1← X12
Z2← X13
IF X26= 0 GOTO A Y ← Z1
GOTO E [A] X2← X2− 1
IF X26= 0 GOTO B Y ← Z2
GOTO E [B] X2← X2− 1
Y ← 3Z2+ 2Z1
Z1← Z2
Z2← Y
IF X26= 0 GOTO B
b) Como f es total (puede demostrarse por inducci´on), definamos la siguiente funci´on G : N → N G(x, y) = hf (x, y), f (x, y + 1)i
Entonces:
G(x, 0) = hx2, x3i
G(x, y + 1) = hr(G(x, y)), 3r(G(x, y)) + 2l(G(x, y))i
Por tanto G = R(g, h) es primitiva recursiva pues g(x) = hx2, x3i y h(x, z) = hr(z), 3r(z) + 2l(z)i pues g y h lo son.
Por tanto, f (x, y) = l(G(x, y)). Luego f es primitiva recursiva ya que es composici´on de funciones primitivas recursivas.
Lema de Euclides.
Para todo primo p existe otro primo q tal que p < q ≤ p ! + 1.
En efecto; para cualquier primo p, consideremos el n´umero p ! + 1.
Cualquier q primo tal que q ≤ p, divide a p ! y, por tanto, no divide a p ! + 1. Pero entonces, o bien p ! + 1 es primo o bien es divisible por un primo q tal que q > p.
En cualquier caso existe un q primo tal que p < q ≤ p ! + 1. Es decir, se verifica el lema. 2
Minimizaci´on acotada (predicados):
Sea θ : Nn+1−→ N un predicado. Definimos:
θµ∗(~x, y) =
min{z ≤ y : θ(~x, z)} si existe tal m´ınimo
0 e.c.o.c.
que tambi´en escribiremos: µz≤ y (θ(~x, z))
PROPOSICI ´ON: Si θ ∈ PR(n+1) entonces θ∗µ∈ PR(n+1) DEMOSTRACI ´ON:
Consideremos el predicado complementario: θ(~x, z) = ¬θ(~x, z) Caso 1.- Existe el m´ınimo (llam´emosle y0)
θ(~x, 0) =Y
z≤0
θ(~x, z) = 1
θ(~x, 0)·θ(~x, 1) =Y
z≤1
θ(~x, z) = 1 θ(~x, 0)·θ(~x, 1)·θ(~x, 2) =Y
z≤2
θ(~x, z) = 1
... ... ... ...
θ(~x, 0)·θ(~x, 1) ... θ(~x, y0− 1) = Y
z≤y0−1
θ(~x, z) = 1
suman y0
θ(~x, 0)·θ(~x, 1) ... θ(~x, y0) = Y
z≤y0
θ(~x, z) = 0 θ(~x, 0)·θ(~x, 1) ... θ(~x, y0+ 1) = Y
z≤y0+1
θ(~x, z) = 0
... ... ...
θ(~x, 0)·θ(~x, 1) ... θ(~x, y) =Y
z≤y
θ(~x, z) = 0
suman 0
X
t≤y
Y
z≤t
θ(~x, z) = y0
Caso 2.- No existe el m´ınimo:
En ese caso, todos los productos anteriores valdr´ıan 1 y, en consecuencia,X
t≤y
Y
z≤t
θ(~x, z) = y + 1
Por tanto, nuestro predicado se caracteriza as´ı:
θµ∗(~x, y) =
X
t≤y
Y
z≤t
θ(~x, z) si ∃z ≤ x(θ(~x, z))
0 e.c.o.c.
y, por tanto, es primitivo recursivo.
2
Ejercicio.- Sea f : N −→ N la funci´on cuyos valores sucesivos son:
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, ....
1. Dise˜nar un programa GOT O que calcule la funci´on f .
2. Explici tar una definici´on de f para probar que es primitiva recursiva.
La sucesi´on:
0, 0, 1, 0, 1, 2, 0, 1, 2, 3, 0, 1, ...
definida por una funci´on g, verifica: f (x) = g(x) + 1.
Bastar´a demostrar que g es computable (resp. primitiva recursiva) para realizar nuestro ejercicio.
1) El siguiente programa calcula g:
[A] IF X = 0 GOT O E X ←− X − 1 Y ←− Y + 1 IF Y ≤ Z GOT O A Y ←− 0
Z ←− Z + 1 GOT O A
(Nota: para obtener la sucesi´on determinada por f , bastar´a con incrementar en 1 el valor de salida; es decir, a˜nadiremos como ´ultima instrucci´on: [E] Y ←− Y + 1).
Analicemos el programa:
x 0 1 2 3 4 5 6 7 8 9 10 11 ...
Y 0 0 1 0 1 2 0 1 2 3 0 1 ...
Z 0 1 2 3 4 ...
Z e Y comienzan con el valor 0. Cada vez que Y supera el valor de Z, se pone a cero y ´esta ´ultima aumenta en 1.
Un ejemplo: cuando z = 3 e y = 2, la variable Y ha realizado los siguientes incrementos:
1 al superar el valor z = 0 (en ese momento, Y se pone a cero, y = 0, y Z actualiza Z con z = 1) 2 m´as cuando supera el valor z = 1 (en ese momento, Y se pone a cero, y = 0, y Z se actualiza con z = 2)
3 m´as al superar el valor z = 2 (en ese momento, Y se pone a cero, y = 0 y Z se actualiza con z = 3) Finalmente, realiza 2 incrementos m´as (y el valor de Z, en ese momento, es z = 3).
Es decir, cuando y = 2 y z = 3, tendremos: Incrementos(Y ) = 2 + (1 + 2 + 3) = y +X
j≤3
j
Cuando el n´umero de incrementos de Y alcanza el valor de entrada, x, se tiene:
x = y +X
j≤z
j
Por otro lado, Incrementos(Y ) = Decrementos(X) y el programa para cuando x = Incrementos(Y ).
Por tanto, la sucesi´on g puede definirse as´ı:
g(x) = µy ≤ x (∃z ≤ x ( x = y +X
j≤z
j ))
En consecuencia, es primitiva recursiva.
Minimizaci´on acotada (funciones):
Sea f : Nn+1−→ N. Definimos:
fµ∗(~x, y) =
min{z ≤ y : f (~x, z) = 0} si existe tal m´ınimo
y + 1 e.c.o.c.
que tambi´en escribiremos: µz≤ y (f (~x, z) = 0)
PROPOSICI ´ON: Si f ∈ PR(n+1) entonces fµ∗∈ PR(n+1) DEMOSTRACI ´ON:
Caso 1.- Existe el m´ınimo (llam´emosle y0)
f (~x, 0) = sg(Y
z≤0
f (~x, z)) = 1
f (~x, 0)·f (~x, 1) = sg(Y
z≤1
f (~x, z)) = 1 f (~x, 0)·f (~x, 1)·f (~x, 2) = sg(Y
z≤2
f (~x, z)) = 1
... ... ... ...
f (~x, 0)·f (~x, 1) ... f (~x, y0− 1) = sg( Y
z≤y0−1
f (~x, z)) = 1
suman y0
f (~x, 0)·f (~x, 1) ... f (~x, y0) = sg(Y
z≤y0
f (~x, z)) = 0 f (~x, 0)·f (~x, 1) ... f (~x, y0+ 1) = sg( Y
z≤y0+1
f (~x, z)) = 0
... ... ...
f (~x, 0)·f (~x, 1) ... f (~x, y) = sg(Y
z≤y
f (~x, z) = 0
suman 0
X
t≤y
sg(Y
z≤t
f (~x, z)) = y0
Caso 2.- No existe el m´ınimo:
f (~x, 0) = sgY
z≤0
f (~x, z) = 1
f (~x, 0)·f (~x, 1) = sgY
z≤1
f (~x, z) = 1 f (~x, 0)·f (~x, 1)·f (~x, 2) = sgY
z≤2
f (~x, z) = 1
... ... ... ...
f (~x, 0)·f (~x, 1) ... f (~x, y) = sgY
z≤y
f (~x, z) = 1
suman y + 1: X
t≤y
sg(Y
z≤t
f (~x, z)) = y+1
Luego nuestra funci´on se expresa:
fµ∗(~x, y) =X
t≤y
sg(Y
z≤t
f (~x, z))
y, por tanto, es una funci´on primitiva recursiva. 2
Ejercicio.- Sea f : Nn+1−→ N una funci´on PR. Entonces la siguiente funci´on es tambi´en PR : fµ0(~x, y) =
min{z ≤ y : f (~x, z) = 0} si existe tal m´ınimo
0 e.c.o.c.
Basta observar que:
fµ0(~x, y) =
fµ∗(~x, y) si ∃z ≤ y(f (x, z) = 0)
0 e.c.o.c.
Nota: En muchas ocasiones esta es la expresi´on que se toma como definici´on de minimizaci´on acotada de
Ejercicio (12/02/03).- Dos n´umeros x, y son coprimos si no tienen divisores primos comunes.
1) Probar que el predicado COP (x, y) ≡ ”x e y son coprimos.esprimitivo recursivo.
2) Probar que la siguiente funci´on es primitiva recursiva:
f (x, k) =
0 si x = 0 o k = 0
k–´esimo n´umero coprimo con x e.o.c.
(Indicaci´on: N´otese que si y es un primo mayor que x, entonces COP (x, y)).
———————————————
1) COP (x, y) ≡ m.c.d(x, y) = 1. Por tanto, COP es un predicado primitivo recursivo.
2) p(x + k) es el x + k–´esimo n´umero primo; y, seg´un la indicaci´on, el k–´esimo n´umero coprimo con x es inferior o igual a p(x + k). Por tanto, la funci´on dada puede expresarse como sigue:
f (x, k) =
0 si x = 0 o k = 0
µy ≤ p(x + k)(P
j≤yCOP (x, j) = k) e.o.c.
que est´a definida por casos a partir de funciones primitivas recursivas y predicados p. r. exhaustivos y excluyentes. Por tanto f es primitiva recursiva.
Ejercicio.- Dar una definici´on recursiva de la funci´on f (x) =n´umero de d´ıgitos de x -en base 10- y probar que es primitiva recursiva.
Sea d(x) = qt(x, 10) la funci´on que trunca el n´umero x devolviendo las n-1 primeras cifras del mismo.
Entonces, la funci´on f puede definirse as´ı:
f (x) =
1 si x ≤ 9
f (g(x)) + 1 e.o.c.
Para probar que es primitiva recursiva, la reescribimos as´ı:
f (0) = 1 f (x + 1) =
1 si x ≤ 8
f (g(x)) + 1 e.o.c.
Formamos la funci´on historia de f :
f (0) = 2ˆ f (x + 1) =ˆ
( Cˆ1(x) si x ≤ 8 f (x)·pˆ f (x+1)x+2 e.o.c.
que, teniendo en cuenta la definici´on de f , podemos reescribir:
f (0) = 2ˆ f (x + 1) =ˆ
( Cˆ1(x) si x ≤ 8 f (x)·pˆ f (g(x))+1x+2 e.o.c.
Y como g(x) < x para x > 1, podemos escribir:
f (0) = 2ˆ f (x + 1) =ˆ
( Cˆ1(x) si x ≤ 8 f (x)·pˆ ( ˆx+2f (x))g(x)+1+1 e.o.c.
Es decir, ˆf est´a definida por recursi´on a partir de una constante y de la h:
h(x, z) =
( Cˆ1(x) si x ≤ 8 z·p(z)x+2g(x)+1+1 e.o.c.
que es p. r.
En consecuencia, ˆf es p.r. y, por tanto, f tambi´en lo es. 2