Clase práctica 10: Conjuntos computables y c.e.

Anuncio
Clase práctica 10: Conjuntos computables y
c.e.
Laski (inspirado en Florencia Savoretti)
Primer Cuatrimestre 2014
1.
1.1.
Repaso de la teórica
Conjuntos computables y c.e.
Dado un conjunto C ⊆ N, podemos definir una función f : N → {0, 1} (a
la cual llamamos función característica de C) tal que
1 si x ∈ C
f (x) =
0 si no
Es decir, una función que nos dice si ese elemento está en el conjunto o no.
Y análogamente, toda función N → {0, 1} define un conjunto ⊆ N.
Decimos que un conjunto de números es computable (o recursivo) cuando
su función característica lo es.
Decimos que un conjunto de números es computablemente enumerable (o
recursivamente enumerable) cuando existe una función parcial computable
tal que
1 si x ∈ C
f (x) =
↑ si no
y lo abreviamos c.e. o r.e. Dicho de otro modo, un conjunto es c.e. si coincide
con el dominio de una función parcial computable.
A su vez, un conjunto es co-computablemente enumerable (o
co-recursivamente enumerable) cuando existe una función parcial computable
tal que
↑ si x ∈ C
f (x) =
0 si no
y lo abreviamos co-c.e. o co-r.e. Un conjunto es co-c.e. si coincide con el
complemento del dominio de una función parcial computable.
Notar que si C es c.e. y co-c.e. entonces es computable (pueden demostrarlo como ejercicio).
1
1.2.
Teorema de Rice
El Teorema de Rice nos da una forma fácil y elegante de mostrar que un
conjunto no es computable, sin tener que “pelearnos” con su función característica.
Decimos que C ⊆ N es un conjunto de índices si siempre que P1 ∈ C
todo P2 que cumpla ΦnP1 = ΦnP2 ⇒ P2 ∈ C. Intuitivamente, C es un conjunto
de índices si tiene números de programas y está cerrado por “equivalencia de
programas”.
El teorema de Rice nos dice que todo conjunto de índices no trivial (es
decir, que no sea N ni ∅) no es computable.
Entonces, para mostrar que un conjunto no es computable alcanza con
mostrar que es un conjunto de índices y que no es trivial.
2.
2.1.
Ejercicios
Intersección de c.e.
Enunciado: Demostrar o refutar que: si B1 , . . . , Bk son c.e. entonces
\
Bi
i∈{1,...,k}
es c.e.
Resolución: Por hipótesis, como B1 , . . . , Bk son c.e. entonces existen
f1 , . . . , fk parcial computables tal que
Bi = dom(fi )
Como son parcial computables, entonces cada fi tiene un programa Pi
que la computa. Llamemos ei al número de cada Pi .
Si llamamos B a la intersección de todas las Bi , entonces queremos ver
que existe una f (x) parcial computable que cumpla
1 si x ∈ B
f (x) =
↑ si x 6∈ B
Escribamos un programa en S que haga lo que queremos. Como en
caso de que X no esté en algún Bi el programa se puede colgar, puedo
tranquilamente llamar a las funciones de cada uno de mis conjuntos.
2
Y ← Φ1e1 (X)
Y ← Φ1e2 (X)
.
.
.
Y ← Φ1ek (X)
Si x 6∈ Bi para algún i (es decir, si x 6∈ B), entonces la función fi
está indeterminada, es decir que el programa Pi se cuelga. Luego, la
instrucción Y ← Φ1ei (X) no termina.
Entonces tenemos que
f (x) ↑ si x 6∈ B
Si x ∈ Bi para todos los i (es decir, si x ∈ B), entonces el programa
termina (porque todas las funciones parcial computables terminan) y
devuelve 1.
Entonces tenemos que
f (x) = 1 si x ∈ B
¡Conseguimos la función que queríamos!
2.2.
Unión de c.e.
Enunciado: Demostrar o refutar que: si B1 , . . . , Bk son c.e. entonces
[
Bi
i∈{1,...,k}
es c.e.
Resolución: La primera parte es análoga a la anterior. Llamamos ei al número del programa que computa parcialmente a Bi y B a la unión de
todos los Bi .
El programa ahora debería analizar cada conjunto, pero teniendo cuidado de no colgarse buscando en uno (porque alcanza con que X esté
en uno solo para poder decir que sí). Para “mirar con cuidado“ una
función usamos el predicado ST EP , que nos dice si un programa con
número e y parámetros x1 , . . . , xn terminó o no en t pasos.
3
[A] Y ← ST EP (X, e1 , T )
IF Y = 1 GOTO E
Y ← ST EP (X, e2 , T )
IF Y = 1 GOTO E
.
.
.
Y ← ST EP (X, ek , T ) IF Y = 1 GOTO E
T ←T +1
GOTO A
Nuestro programa va mirando las funciones de cada conjunto cada vez
por más tiempo, para ver si alguna termina.
Si x ∈ Bi para algún i (es decir, si x ∈ B), entonces la función fi
debería dar 1, con lo cual su programa (de número ei ) debería terminar
en algún paso T0 . Nuestro programa tarde o temprano recorre todos los
T posibles, con lo cual para el paso T0 la instrucción ST EP (X, ei , T0 )
devolverá 1 y nuestro programa termina (y devuelve 1).
Entonces
f (x) = 1 si x ∈ B
Si x 6∈ Bi para ningún i (es decir, si x 6∈ B), entonces todos los programas correspondientes a cada conjunto se cuelgan, y nuestro programa
nunca encuentra un T0 para el cual alguno de ellos termine: se queda
eternamente incrementando T y buscando.
Entonces tenemos que
f (x) ↑ si x ∈ B
De nuevo, conseguimos la función que queríamos.
Moraleja de estos dos ejercicios: ¡los programas que escribimos pueden
colgarse y aún así estar bien! (si eso es lo que debían hacer).
2.3.
Conjunto de programas p.r.
Enunciado: Probar que el conjunto C = {x|Φx es primitiva recursiva} no es
computable.
Resolución: Por Teorema de Rice. Veamos que C es un conjunto de índices:
Sea P1 ∈ C y P2 tal que ΦP1 = ΦP2 . Queremos probar que P2 ∈ C.
P1 ∈ C ⇔ ΦP1 es p.r., y como ΦP1 = ΦP2 ⇒ ΦP2 es p.r. ⇒ ΦP2 ∈ C.
4
Ahora veamos que C no es trivial.
g(x) = 0 ∀x es una función p.r. (de hecho es inicial) ⇒ ∃e tal que
Φe (x) = g(x) ⇒ e ∈ C ⇒ C 6= ∅.
g(x) ↑ ∀x es una función computable pero no es p.r. ⇒ ∃e tal que
Φe (x) = g(x) ⇒ e 6∈ C ⇒ C 6= N.
2.4.
Función
El teorema de Rice también sirve para mostrar que ciertas funciones no
son computables, si podemos usarlas para definir un conjunto de índices.
Enunciado: Probar que la función
2x
si Φx (y) = y 2
f (x) =
2x + 1 si no
no es computable.
Resolución: Idea: podemos usar f para definir un conjunto, y si mostramos
que ese conjunto es de índices y no trivial entonces f no es computable.
Supongamos f computable ⇒ g también lo es:
1 si f (x, 1) = 2x
g(x) =
0 si no
Reemplazando por la definición de f :
1 si Φx (1) = 1
g(x) =
0 si no
Sea C el conjunto que tiene a g por función característica. O sea C =
{x|g(x) = 1}. Vamos a ver que C es un conjunto de índices no trivial.
Sea P1 ∈ C y P2 tal que ΦP1 = ΦP2 . Queremos probar que P2 ∈ C.
P1 ∈ C ⇔ ΦP1 (1) = 1, y como ΦP1 = ΦP2 ⇒ ΦP2 (1) = 1 ⇒ ΦP2 ∈ C.
Ver que C no es trivial queda como ejercicio (es fácil).
Como probamos que C es un conjunto de índices no trivial, entonces g
no es computable. Pero entonces f no puede serlo tampoco.
Como habrán visto, el Teorema de Rice hace bastante simple algo que
puede de otro modo suele requerir mucha práctica (como probar que una
función no es computable).
5
2.5.
No todo es tan sencillo
¡No todo lo que parece un conjunto de índices lo es! El siguiente conjunto no es computable, pero no tampoco es un conjunto de índices (aunque
parezca):
B = {x ∈ N : Φx (x) = 0}
Demostrar que no es computable requiere un teorema que no llegamos a
ver en la práctica (el de la Recursión) así que no hace falta que sepan hacerlo.
Sí pueden hacer el esfuerzo de ver por qué no es un conjunto de índices.
6
Descargar