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