Universidad Simón Bolívar Dpto. de Computación y Tecnología de la Información CI3721 - Traductores e Interpretadores Abril-Julio 2008 Profesor Luis astorga Apuntes sobre problemas de decisión y reducción de problemas 1 De…niciones básicas Es necesario tener presentes estas de…niciones básicas para entender el contexto: Procedimiento: conjunto …nito de instrucciones que son ejecutadas en una cierta cantidad de tiempo (número de pasos). Un procedimiento termina con una entrada especí…ca de datos (input) si se detiene después de un número …nito de instrucciones elementales. Algoritmo: procedimiento que termina en todos los inputs de su espacio de estados, es decir, en todos aquellos que se corresponden con la de…nición del dominio del procedimiento. Funciones recursivas: un procedimiento se de…ne matemáticamente como una función entre el espacio de estados posibles (su dominio), y el conjunto (codominio) de soluciones o salidas (output). Las funciones que de…nen un procedimiento son funciones recursivas parciales . Las funciones que de…nen un algoritmo son funciones recursivas totales (están de…nidas en todo su dominio). Lenguajes recursivamente numerables: son los lenguajes formales determinados por un procedimiento cuando se codi…can sus posibles inputs. Lenguajes recursivos: son los lenguajes formales determinados por un algoritmo cuando se codi…can sus posibles inputs. Tesis de Church-Turing: existen distintos formalismos, equivalentes entre sí, que describen los procedimientos: - Máquinas de Turing - Gramáticas sin restricciones (tipo 0 en la jerarquía de Chomsky) - Cálculo Lambda - Sistemas de Post Cualquier proceso de computo que pueda llamarse procedimiento se puede simular con una máquina de Turing. Por lo tanto, la mayor clase de lenguajes que se pueden manipular de manera práctica está incluida en la clase de los lenguajes recursivamente numerables. Problema: desde la perspectiva lógica, se entiende un problema como un predicado que puede ser cierto o falso dependiendo de sus argumentos, siempre y cuando estos correspondan con el tipo designado en el predicado. Una instancia del problema es una elección especí…ca de valores para los argumentos del problema. 1 Solución: es una función lógica del espacio de instancias posibles de un problema en el conjunto fsi; nog (o también, según el gusto, ftrue; f alseg; fblanco; negrog; f1; 0g,etc.). Problemas decidibles: si una función solución de…ne un algoritmo (es decir, si es una función recursiva total en el dominio de instancias), el problema en cuestion se dice decidible (porque es posible decidir sobre cualquier instancia) o soluble (porque poder decidir, decir si o no en cualquier instancia, supone dar una respuesta de solución al problema). Cuando se tiene un problema de…nido matemáticamente por una función recursiva total, es decir, cuando se tiene un algoritmo, el lenguaje que se construye con la codi…cación de sus valores posible (sus inputs) es un lenguaje recursivo. Problemas indecidibles: si se puede probar lógicamente que no existe una solución al problema planteado (es decir, que no existe un algoritmo de…nible), el problema se dice indecidible o insoluble. Para probar que un problema es indecidible, es necesario demostrar que el lenguaje que se obtiene de la codi…cación de sus instancias posibles es recursivamente numerable y no recursivo. Nota: curiosamente en español el término soluble tiene dos acepciones: aquello que se puede disolver o desleír y aquello que se puede resolver. 2 Ejemplo de la técnica de diagonalización En general, los problemas típicos de indecibilidad provienen de predicados lógicos que reclaman la técnica de diagonalización. A continuación mostramos un ejemplo de como se emplea esta técnica de demostración. Dado el albabeto = f0; 1g, sabemos que el universo lingüístico que el de…ne, es decir, el conjunto de todas las palabras que se pueden construir en orden lexicográ…co a partir de , es numerable: esto quiere decir que se puede establecer una correspondencia biyectiva entre el conjunto = f ; 0; 1; 00; 01; 10; 11; 000; 001; 010; 011; 100; 101; 110; 111; :::g y el conjunto de los numeros natutales N = f0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; :::g Ahora bien, queremos saber si el conjunto de todos los subconjuntos posibles de : el conjunto P( ) de las partes de , que no es otro que el conjunto de todos los lenguajes que se pueden dar con el alfabeto , es numerable. Del álgebra sabemos que el conjunto de subconjuntos de un conjunto numerable no es numerable. Si podemos comparar con N, tendríamos que comparar P( ) con R, es decir, con los numeros reales. Esto se demuestra así: Supóngase, por el absurdo, que P( ) es numerable, entonces todos los lenguajes pueden ser enumerado de la forma L0 ; L1 ; L2 ; : : : Y dado que es numerable, sus elementos (las palabras) puede numerarse de la forma w0 ; w1 ; w2 ; : : : Construimos la siguiente tabla in…nita hipotética (esto es sólo un ejemplo de 2 como se vería dicha tabla) P( )n L0 L1 L2 .. . w0 0 1 0 w1 1 1 1 w2 0 0 0 ::: que expresa en sus entradas con 0 si la palabra wi no forma parte o con 1 si la palabra wi si forma parte del lenguaje Li para todo i. La sucesión de 0’s y 1’de cada …la codi…ca su respectivo lenguaje en una serie única in…nita (si el lenguaje es …nito la serie termina con una cola in…nita de ceros). Se quiere construir un lenguaje posible dentro de P( ) que no esté en la lista L0 ; L1 ; L2 ; : : : con lo cual la supocisión de que P( ) es numerable es falsa. Si tomamos la diagonal del cuadro hipotético y hacemos de cada 0 un 1 y de cada 1 un 0 estaremos construyendo un lenguaje en P( ) que se de…ne formado por aquellas palabras que no pertenecen al lenguaje que tiene el mismo índice en la tabla. La expresión formal de ese lenguaje es L = fwi j wi 2 = Li g que pertenece a P( ) porque es un lenguaje posible desde el punto de vista de su construcción lógica. Luego, porque L está en P( ), le debe corresponder algún número k de la numeración, es decir L debe ser algún Lk . Pero esto presenta un problema serio porque, por la manera en que se construyó, L es distinto a todos los lenguajes que están numerados: la razón es que di…ere siempre del número binario de la diagonal para cualquier Li . El razonamiento absurdo es el siguiente: Tal y como hemos asumido, L = Lk para algún k 2 N, entonces, en particular, si la palabra wk 2 L se tiene que, por de…nición de L wk 2 = Lk con lo cual, contradicción, wk 2 = L. Si, por el contrario, wk 2 = L, entonces, por la de…nición de L, wk 2 Lk pero L = Lk , lo cual es también una contradicción. En conclusión, P( ) no es numerable. Dado que wk 2 debe estar o no estar en L; la suposición original es falsa. Para cada alfabeto hay un universo innumerable de lenguajes a especi…car, pero el resultado anterior demuestra que no existe ningún método de especi…cación de lenguajes que sea capaz de de…nir todos los lenguajes sobre ese alfabeto. Es decir, dado un método de representación de lenguajes existen siempre lenguajes que no son representables. 3 3 Ejemplo de problema insoluble Se plantea el siguiente problema: ¿Es un procedimiento dado P , un algoritmo? Es decir, ¿podemos demostrar que existe una función recursiva total que tome como argumento todo procedimiento P codi…cado de alguna manera y responda en cada caso si o no ?. Si la respuesta fuese a…rmativa, la teoría de la computación se enseñaría en bachillerato. Veamos. Partimos de la premisa que todo procedimiento es codi…cable en alguna forma (recordar como se codi…can las máquinas de Turing): los inputs de un procedimiento se codi…can y forman un lenguaje, y los procedimientos también se pueden codi…car. Supongamos que existe un procedimiento P que es un algoritmo y toma como argumento una codi…cación de cualquier otro procedimiento Q devolviendo la respuesta si cuando Q sea un algoritmo. Construimos entonces el siguiente algoritmo R : Entrada: cualquier procedimiento Q Salida: no : si Q no es un algoritmo, o si Q es un algoritmo y Q evaluado en Q responde si. si : si Q es un algoritmo y Q evaluado en Q responde no. Nótese que se está aplicando la codi…cación de Q como argumento del algoritmo Q. Algoritmo: if (P (Q) si) !skip [] (P (Q) no) ! no ; abort. …; if (Q(Q) si) ! no [] (Q(Q) no) ! si … Ahora bien, en la suposición de que P sea un algoritmo, R es también un algoritmo porque en cualquier caso dirá si o no: La pregunta es, ¿qué sucede si codi…camos R y lo introducimos como entrada del mismo R ?, es decir, ¿qué sucede cuándo Q = R ?, Como R es un algoritmo, entonces P (R) si. Luego, se evaulará R(R): si la respuesta global de R como algoritmo es si con la entrada R codi…cado quiere decir que durante la ejecución de R se determino que R(R) no. Y viceversa. En conclusión, no existe algoritmo que diga cuando un procedimiento es un algoritmo. 4 Ejemplo de reducción de problemas de decisión Considérese el siguiente problema P : Dada la máquina de Turing T , ¿el lenguaje que acepta T es vacío? 4 El lenguaje de la codi…cación de las instancias a…rmativas de P es SP = w 2 f0; 1g j : (9M T T : w = cod (T )) _ (9M T T : w = cod (T ) ^ L (T ) = ?) y el lenguaje de la codi…cación de las instancias negativas de P es NP = w 2 f0; 1g j 9M T T : w = cod (T ) ^ L (T ) 6= ? de tal manera que SP [ NP = f0; 1g puesto que en SP están tanto los números binarios que no representan máquinas de Turing como los números binarios que representan máquinas de Turing que no aceptan cadena alguna. Veamos primero que NP es un lenguaje recursivamente numerable y no es recursivo. Para ello basta construir una máquina de turing TN que acepte a NP . TN consta de cuatro cintas: 1. La primera cinta recibe un número binario w y la máquina chequea que sea la codi…cación binaria de una máquina de Turing. Si no lo es, TN se detiene. Si lo es, entonces existe una máquina de Turing T tal que w = cod(T ) y TN continúa su trabajo. 2. Las cintas dos, tres y cuatro simulan la máquina de enumeración para T . Cuando aparezca la primera cadena que pertenece al lenguaje L (T ) en la cinta dos TN entra en el estado …nal y se detiene, es decir, acepta. Si L (T ) = ? entonces la simulación de la máquina de enumeración para T nunca producirá resultado alguno y TN no se detendrá jamás. Por ello NP es recursivamente numerable y no es recursivo. Veamos ahora que SP no es recursivo. Para ello suponemos que si lo es y buscamos una contradicción construyendo un algoritmo para el lenguaje universal LU que sabemos no es recursivo, es decir, reducimos LU a SP . Recuérdese que, dados dos lenguajes L y M , si M es recursivo y si L M , es decir, si L se reduce a M , entonces L también es recursivo. Sea TS tal que L(TS ) = SP la hipotética máquina de Turing representada en el esquema si ! w ! TS no ! TS responde si cuando w no es el código de una máquina de Turing, o cuando w es el código de una máquina de Turing T y L(T ) = ?. TS responde no cuando w es el código de una máquina de Turing T y L(T ) 6= ?. Sea también la función f: f (w) = f0; 1g ! f0; 1g cod(T 0 ) si w = cod (T ) 111cod(x) para alguna M T T y algún x 2 f0; 1g de otro modo 5 donde para w = cod (T ) 111cod(x) se tiene que T 0 es la máquina de Turing si y ! x ! T ! si ! por lo tanto, si x 2 L (T ) entonces y 2 L (T 0 ) para toda y 2 f0; 1g , es decir, L (T 0 ) = f0; 1g . Por el contrario, si x 2 = L (T ) entonces T no acepta a x y T 0 no aceptará ninguna cadena y con lo cual L (T 0 ) = ?. Se tiene la siguiente situación L (T ) , L (T 0 ) = f0; 1g 6= ? L (T ) , L (T 0 ) = ? x 2 x 2 = De esta manera f transforma una entrada w = cod (T ) 111cod(x) para la máquina universal Tu en una entrada cod (T 0 ) para la máquina TS . Pero f es una función de…nida sobre todo el conjunto f0; 1g , esto es, es una función total y por ello de…ne un algoritmo formalizado en una máquina de Turing de computo lingüístico Tf representada en el esquema w ! Tf f (w) ! Ahora bien, se puede construir la máquina de Turing w ! w ! Tf f (w) ! TS si no no si ! ! ! ! tal que: Primer caso: si w = cod (T ) 111cod(x) para alguna máquina de Turing T y una cadena x, entonces f (w) = cod(T 0 ) de modo que, si x 2 L (T ) la máquina TS responde no puesto que f (w) es el código de una máquina T 0 cuyo lenguaje es distinto de vacío (L (T 0 ) = f0; 1g ). En este caso la máquina que hemos construido responde si. Segundo caso: si w = cod (T ) 111cod(x) para alguna máquina de Turing T y una cadena x, y si x 2 = L (T ) la máquina TS responde si puesto que f (w) es el código de una máquina T 0 cuyo lenguaje es vacío (L (T 0 ) = ?). En este caso la máquina que hemos construido responde no. Tercer caso: cuando w no es el código de ninguna máquina de Turing seguida de una cadena entonces f (w) = y TS responde si, con lo cual la nueva máquina responde no. 6 La máquina así construida es precisamente la máquina universal de Turing Tu que se detiene en todas las cadenas de entrada. Pero sabemos que esta máquina no existe porque el lenguaje universal Lu = L(Tu ) es recursivamente numerable pero no es recursivo. La contradicción viene de suponer que el lenguaje SP era recursivo, por lo tanto, SP no es recursivo. Para probar que SP tampoco es recursivamente numerable basta aplicar el siguiente resultado: Si un lenguaje L y su complemento L son ambos recursivamente numerables entonces L (y por lo tanto también L) es recursivo. Como NP es recursivamente numerable, SP no puede serlo porque, si lo fuera, ambos serían recursivos y acabamos de probar que SP no lo es. 7