TCO. 2
oParcial -Grupos 1, 2 y 4-
(2o de Ingenier´ıa Inform´atica) (23–enero–2009)Apellidos... Nombre... GRUPO...
UTIL´ICESE S ´ OLO ESTE FOLIO PARA LAS CUESTIONES
Hoja -1- Cuestiones. [3 puntos.]- Decidir la veracidad o falsedad de los siguientes enunciados justificando, en cada caso, la respuesta.(a) El dominio de una funci´on f GOT O–computable es GOT O−computable.
(b) Dos funciones GOT O–computables con distinta aridad pueden tener un ´ındice com´un.
(c) Si A ⊆ B y B es un conjunto recursivamente enumerable, entonces A es tambi´en un conjunto recur- sivamente enumerable.
(d) Sea e el c´odigo de un cierto programa P ∈ GOT O. Si di(x, e, 126) = di(x, e, 385) entonces [[P ]](1)(x) ↑.
(e) Si ∃t(θ(~x, t)) es un predicado parcialmente decidible, entonces θ(~x, t) es, por el teorema de la proyec- ci´on, un predicado GOT O–computable.
(f) Si m + 1 y n + 1 son dos n´umeros naturales con el mismo n´umero de factores primos, entonces los programas de c´odigo m y n tienen la misma longitud.
(g) Si el rango de una funci´on f es un conjunto recursivamente enumerable, entonces la funci´on f es, por el teorema del rango, una funci´on GOT O–computable
(h) Si el grafo, G(f ), de una funci´on f es GOT O−computable entonces dicha funci´on es GOT O−computable y total.
(i) Si ϕ(1)e = ϕ(1)e0 para los n´umeros e 6= e0, entonces ϕ(2)e = ϕ(2)e0 .
(j) Si el c´odigo de una instrucci´on es y, entonces el c´odigo de la variable de dicha instrucci´on es r(r(y))).
Soluci´on
(a) Falso. Por ejemplo, el conjunto de la parada K = {x : ϕx(x) ↓} no es un conjunto GOT O−computable pero s´ı es el dominio de una funci´on GOT O−computable, precisamente de su funci´on caracter´ıstica parcial CK∗.
CK∗(x) =
1 si x ∈ K
↑ e.o.c.
Como K es recursivamente enumerable, CK∗ es GOT O−computable y adem´as K = dom(CK∗)
(b) Verdadero. Un programa GOT O P , de c´odigo e = #(P ), calcula una funci´on para cada aridad, todas ellas con el mismo ´ındice. Es decir, dados n, k, n 6= k resulta queJP K
(n)= ϕ(n)e yJP K
(k)= ϕ(k)e
(c) Falso. Sea B = N y A = TOT = {e ∈ N : ∀x(ϕe(x) ↓)}. Obviamente, A ⊆ B, B es un con- junto GOT O−computable y por tanto, recursivamente enumerable pero sin embargo, A no es ni GOT O−computable ni recursivamente enumerable.
(d) Falso. El programa P con entrada x podr´ıa parar en un n´umero de pasos menor o igual a 126.
Recordemos la definici´on de la funci´on di(1)
di(1)(x, e, k) =
#(sj+1) si el programa de c´odigo e para en j ≤ k
pasos de la computaci´on del mismo sobre el dato x
#(sk+1) e.o.c.
Si P con entrada x para en exactamente j pasos y j ≤ 126, tendr´ıamos di(1)(x, e, 126) = #(sj+1) y di(1)(x, e, 385) = #(sj+1)
(e) Falso. θ(~x, t) podr´ıa ser un predicado parcialmente decidible pero no GOT O−computable y el pred- icado ∃t(θ(~x, t)) seguir´ıa siendo parcialmente decidible por el lema de la contracci´on. Como contrae- jemplo, podemos tomar el predicado ∃t(θ(x, t)) = ∃t(HALT(t, x)) = ∃t(ϕx(t) ↓). Dicho predicado es parcialmente decidible, puesto que la funci´on GOT O−computable f (x) = µz(ST EP (l(z), x, r(z))) tiene como dominio el conjunto recursivamente enumerable
dom(f ) = {x ∈ N : ∃z(l(z) = t ∧ r(z) = k ∧ ST EP (t, x, k))} =
= {x ∈ N : ∃t∃k(ST EP (t, x, k))} = {x ∈ N : ∃t(ϕx(t) ↓)}
Sin embargo, θ(x, t) = HALT(t, x) no es GOT O−computable.
(f) Falso. Si los factores primos de n + 1 y m + 1 son distintos, la longitud de los programas P y Q ser´a distinta. Por ejemplo, m = #(P ) = [#(I1), #(I2)] − 1 y n = #(Q) = [#(I1), 0, #(I2)] − 1. m + 1 y n + 1 tienen el mismo n´umero de factores primos (dos) pero |P | = 2 y |Q| = 3.
(g) Falso. El teorema del rango afirma que si una funci´on es GOT O−computable, su rango es re- cursivamente enumerable, pero el rec´ıproco no tiene por qu´e ser cierto. Si lo fuese, el predicado HALT(x, e) ⇐⇒ ϕe(x) ↓ ser´ıa GOT O−computable, puesto que su rango es finito y por tanto recur- sivamente enumerable.
(h) Falso. Tomemos una funci´on GOT O−computable y no total cuyo grafo sea GOT O−computable, por ejemplo,
f (x) =
1 si x = 0
↑ si x 6= 0
G(f ) = {(x, y) ∈ N2: f (x) ↓ ∧ y = f (x)} = {(0, 1)} es un conjunto finito y por tanto GOT O−computable.
(i) Falso. Como contraejemplo, consideremos los dos programas GOT O con macros siguientes:
P {Y ←− X1+ X2 Q {Y ←− X1−X˙ 2 Sean e = #(P ) y e0 = #(Q). Obviamente, e 6= e0 y ϕ(1)e (x) =JP K
(1)(x) = ϕ(1)e0 (x) =JQK
(1)(x) = x, pero ϕ(2)e (x, y) =JP K
(2)(x, y) = x + y 6= ϕ(2)e0 (x, y) =JQK
(2)(x, y) = x ˙−y
(j) Falso. El c´odigo de una instrucci´on I es #(I) = ha, hb, cii, donde c = #(V )−1. Por tanto, si y = #(I), el c´odigo de la variable de I es r(r(y)) + 1.
TCO. 2
oParcial -Grupos 1, 2 y 4-
(2o de Ingenier´ıa Inform´atica) (23–enero–2009)Apellidos... Nombre... GRUPO...
Hoja -2- Ejercicio 1.– [2 puntos] Consideremos el programa universal U2(x, y, e) y la funci´on descripci´on ins- tant´anea, di(x, y, e, t), siendo e + 1 = 2105· 32· 5110.
1. Calcular [[U2]](4, 5, e).
2. Calcular (r(di(4, 5, e, 3)))4.
Soluci´on
1. CalcularJU2K(4, 5, e).
Sea P el programa GOT O de c´odigo e. EntoncesJU2K(4, 5, e) = JP K
(2)(4, 5). En primer lugar tenemos que decodificar las instrucciones de P .
#(P ) = e = [#(I1), . . . , #(In)] − 1 ⇒ [#(I1), . . . , #(In)] = e + 1 = 2105· 32· 5110 ⇒
#(I1) = 105
#(I2) = 2
#(I3) = 110
#(I1) = ha, hb, cii = 2a(2hb, ci+1) ˙−1 = 105 ⇒ 2a(2hb, ci+1) = 106 = 2·53 ⇒
a = 1 ⇒ [A1] hb, ci = 26 hb, ci = 2b(2c + 1) ˙−1 = 26 ⇒
b = 0 ⇒ SKIP
c = 13 ⇒ #(V ) = 14 ⇒ V = X7
Por tanto, I1: [A1] X7 ←− X7
#(I2) = ha, hb, cii = 2a(2hb, ci + 1) ˙−1 = 2 ⇒ 2a(2hb, ci + 1) = 3 ⇒
a = 0 ⇒ sin etiqueta hb, ci = 1
hb, ci = 2b(2c + 1) ˙−1 = 1 ⇒
b = 1 ⇒ IN C
c = 0 ⇒ #(V ) = 1 ⇒ V = Y Por tanto, I2: Y ←− Y + 1
#(I3) = ha, hb, cii = 2a(2hb, ci+1) ˙−1 = 110 ⇒ 2a(2hb, ci+1) = 111 ⇒
a = 0 ⇒ sin etiqueta hb, ci = 55
hb, ci = 2b(2c + 1) ˙−1 = 55 ⇒
b = 3 ⇒ #(L) = 1 ⇒ IF V 6= 0 GOT O A1
c = 3 ⇒ #(V ) = 4 ⇒ V = X2
El programa P queda as´ı:
P :
[A1] X7 ←− X7
Y ←− Y + 1 IF X26= 0 GOT O A1
Vemos que la funci´on de aridad 2 que calcula P es JP K
2(x1, x2) =
1 si x2= 0
↑ e.o.c.
Concluimos entonces queJU2K(4, 5, e) = JP K
(2)(4, 5) no est´a definido, es decir,JU2K(4, 5, e) ↑.
2. Calcular (r(di(4, 5, e, 3)))4
Seg´un la definici´on de la funci´on di, sabemos que di(4, 5, e, 3) = #(s4) en la computaci´on del programa P sobre los datos de entrada (4, 5). Hemos de calcular entonces (r(#(s4)))4 = (r(hi, #(σ4)i))4 = ([σ4(Y ), σ4(X1), σ4(Z1), σ4(X2), σ4(Z2), . . . ])4= σ4(X2), es decir, el valor de la variable X2 tras dar 3 pasos en la computaci´on de P con entrada (4, 5). Como la variable X2 no se modifica durante la ejecuci´on de P , tras dar 3 pasos el valor que tendr´a ser´a el mismo que ten´ıa en la configuraci´on inicial, es decir, 5. Por tanto, (r(di(4, 5, e, 3)))4= 5.
Ejercicio 2.– [3 puntos] Sean P, Q programas GOT O que calculan funciones totales para aridad 1. Con- sideremos el predicado:
θ(x) ≡ “sobre el mismo dato x, la computaci´on de P para antes que la de Q”
1. Probar que θ es un predicado parcialmente decidible, utilizando el teorema de la proyecci´on.
2. Probar que θ es GOT O–computable,
a) Dando un programa (con menos de diez l´ıneas de c´odigo) que lo calcule.
b) Utilizando el teorema del complemento.
Soluci´on
1. Probar que θ es un predicado parcialmente decidible, utilizando el teorema de la proyecci´on.
Seg´un el teorema de la proyecci´on para predicados, θ es un predicado parcialmente decidible de aridad 1 si, y s´olo si, existe un predicado GOT O−computable de aridad 2 θ0 tal que θ(x) = ∃t(θ0(x, t)). Sea θ0 el siguiente predicado GOT O−computable de aridad 2:
θ0(x, t) = ST EP(1)(x, #(P ), t)∧¬ST EP(1)(x, #(Q), t) =
1 si la computaci´on de P sobre x para en, a lo sumo, t pasos y la de Q, sobre el mismo dato de entrada, no para en a lo sumo t pasos 0 e.o.c.
Sea (x, t) ∈ N2 tal que se verifica θ0(x, t). Como P y Q calculan funciones totales para aridad 1, si la computaci´on de Q con entrada x no para en a lo sumo t pasos, parar´a en un n´umero de pasos mayor a t, es decir, la computaci´on de P para antes que la de Q. Seg´un esto, podemos escribir θ como sigue:
θ(x) = ∃t(θ0(x, t)) = ∃t(ST EP(1)(x, #(P ), t) ∧ ¬ST EP(1)(x, #(Q), t)) Y por el teorema de la proyecci´on, concluimos que θ es parcialmente decidible.
2. Probar que θ es GOT O−computable,
a) Dando un programa (con menos de diez l´ıneas de c´odigo) que lo calcule.
El siguiente programa GOT O tiene menos de diez l´ıneas de c´odigo y calcula θ:
[B] IF ST EP(1)(X, #(Q), Z) GOT O E IF ST EP(1)(X, #(P ), Z) GOT O A Z ←− Z + 1
GOT O B [A] Y ←− Y + 1 b) Utilizando el teorema del complemento.
El teorema del complemento para aridad 1 es el siguiente:
B ⊆ N es GOT O − computable ⇐⇒ B y B son recursivamente enumerables
Trasladando esta propiedad a los predicados parcialmente decidibles, si B = {x ∈ N : θ(x)} y B = {x ∈ N : θ(x) = ¬θ(x)}, tenemos que
θ(x) es GOT O − computable ⇐⇒ θ(x) y θ(x) son parcialmente decidibles
En el apartado 1 de este ejercicio hemos probado que θ(x) es parcialmente decidible. Por tanto, para probar que θ(x) es GOT O−computable, bastar´a demostrar que su complementario θ(x) tambi´en es parcialmente decidible.
θ(x) ≡ “sobre el mismo dato x, la computaci´on de P no para antes que la de Q”
θ(x) =
GOT O−computable
z }| {
(ST EP(1)(x, #(Q), 0) ∧ ST EP(1)(x, #(P ), 0)) ∨
parcialmente decidible, por el teorema de la proyecci´on
z }| {
∃t
GOT O−computable
z }| {
(ST EP(1)(x, #(Q), t) ∧ ¬ST EP(1)(x, #(P ), t ˙−1))
Por tanto, θ y θ son ambos parcialmente decidibles, luego θ es GOT O−computable.
Ejercicio 3.– [2 puntos] Determinar si los siguientes conjuntos son o no GOT O–computables:
1. A = {x : x es el c´odigo de los programas que no contienen la variable Y } 2. B = {e : ϕe(0) = 5 ∧ ∀x > 0(ϕe(x) = ϕe(x − 1) + 2x)}
Soluci´on
1. Probaremos que A es GOT O−computable demostrando que su funci´on caracter´ıstica es efectivamente GOT O−computable.
CA(x) =
1 si x es el c´odigo de un programa que no contiene la variable Y 0 e.o.c.
Podemos escribir CA como cuantificaci´on universal acotada de un predicado GOT O−computable como sigue:
CA(x) = ∀z ≤ Long(x + 1)(z ≥ 1 −→ r(r((x + 1)z)) 6= 0) Alternativamente, tambi´en podemos escribir un programa GOT O que calcule CA:
P
[A] Z ←− Z + 1
IF Z > Long(X + 1) GOT O B IF r(r((X + 1)Z)) 6= 0 GOT O A GOT O E
[B ] Y ←− Y + 1 Notas:
x es el c´odigo de un programa, por tanto, x + 1 = [#(I1), . . . , #(In)].
El n´umero de instrucciones del programa codificado por x es Long(x + 1).
z nos indica la siguiente instrucci´on para la que vamos a comprobar que no contiene a la variable Y . Entonces, el c´odigo de dicha instrucci´on es #(Iz) = (x + 1)z.
Si #(I) = ha, hb, cii, la instrucci´on I contiene a la variable Y si c = 0, esto es, si r(r(#(I))) = 0 2. Demostraremos que el conjunto B no es GOT O−computable usando el teorema de Rice. Consideramos
la familia de funciones GOT O−computables:
F = {g ∈ GCOM P : g(0) = 5 ∧ ∀x > 0(g(x) = g(x − 1) + 2x)}
Claramente, IF = {e ∈ N : ϕe∈ F } = B. Entonces:
a) Veamos que F 6= ∅
La funci´on f definida como sigue
f (0) = 5
f (x + 1) = f (x) + 2(x + 1)
pertenece a F y es GOT O−computable, puesto que est´a definida por recursi´on primitiva a partir de una constante y una funci´on GOT O−computable, es decir, f = R(5, h), donde h(x, z) = 2(x + 1) + z.
b) Veamos que F 6= GCOM P(1)
La funci´on vac´ıa f∅ es GOT O−computable pero no pertenece a F .
Del teorema de Rice se deduce que IF no es GOT O−computable ⇒ B no es GOT O−computable.