1. CONCEPTOS BÁSICOS Lenguajes (L): Alfabeto () = conjunto finito de símbolos. Palabra (w) = secuencia de símbolos de un alfabeto. Longitud de palabra (|w|) = tamaño de la palabra. Número de apariciones del símbolo en la palabra w ( | w | ) Todas las palabras formadas con símbolos del alfabeto se representa como * Lenguaje A = L(A). Se cumple que L( A) * Lenguaje de las partes (conjunto de los subconjuntos del conjunto A): P( A) B | B A Definición de lenguajes: 1) Enumeración: válido solamente para conjuntos finitos. 2) Inducción. 3) Conjuntos. 4) Reconocedores de lenguajes: a. Autómatas finitos: reconocen lenguajes regulares. b. Autómatas con pila: reconocen lenguajes incontextuales. c. MT: reconocen lenguajes recursivos (calculables mediante algún programa). 5) Generadores de lenguajes: a. Expresiones regulares: generan lenguajes regulares. b. Gramáticas incontextuales: generan lenguajes incontextuales. c. MT: generan lenguajes recursivos (calculables mediante algún programa). 6) Analizadores sintácticos o parses: híbrido entre generador y reconocedor. Relaciones (R): Entre dos conjuntos A y B una relación R es cualquier subconjunto de A x B. R A x B Dom(R) x A | y B,( x, y) R; Im(R) y B | x A,( x, y) R Función (f): Todo elemento de A tiene 1 única imagen. Un elemento de B está relacionado con ninguno, uno o muchos elementos de A. ( x, y) R ( x, z) R y z Si f A x B es una función se representa como f : A B;( x, y) f f ( x) y; Dom( f ) A Im( f ) B Función parcial es aquella en la que existe algún elemento de A que no tiene imagen. Función total es aquella en la que todos los elementos de A tienen imagen, es decir, Dom( f ) A Si x Dom( f ) f SI está definida en x, f ( x) ; Si x Dom( f ) f NO está definida en x, f ( x) Función característica A : nos dice si un elemento pertenece(1) o no(0) al conjunto A. Funciones de codificación x, y : permite codificar y descodificar palabras de un lenguaje en otro. Deben ser funciones biyectivas. Función Inversa 1 1 x, y Función Inversa 2 2 x : Permite obtener el valor de x teniendo la palabra codificada. x, y y : Permite obtener el valor de y teniendo la palabra codificada. Problemas: De decisión: la respuesta es “sí” o “no”. De cálculo..: la respuesta consiste en calcular un valor. La pregunta a responder es: ¿este problema tiene solución algorítmica?, ¿es calculable?. Codificación de problemas en forma de lenguaje: Problema de decisión P3 =”¿es un número primo?”. Es una función entre las entradas y las respuestas posibles (SI,NO). Sí , es primo f : E P Si, No , donde E P N y f (n) 3 3 No , no es primo El lenguaje sería LP3 n N | f (n) Sí que contiene todas las palabras que representan un elemento que supone la respuesta Si al problema P. Algoritmos = Programas: Es un conjunto finito y explícito para resolver un problema. Este conjunto es susceptible de ser automatizado. Algoritmo (da instrucciones) función matemática (realiza la operación). El programa Pi calcula la función i UN ALGORITMO SIEMPRE CALCULA UNA FUNCIÓN, NO TODA FUNCIÓN ES CALCULABLE. Cálculos: Lo que un ordenador puede hacer. MT = modelo abstracto de cálculo. Resultado fundamental de la calculabilidad: Todos los modelos abstractos de cálculo son equivalentes. Cálculo es, por tanto, lo que una MT puede hacer. Las funciones calculables son aquellas que se pueden calcular con una MT. Demostraciones: Una teoría no es simplemente una colección de hechos. Programas: Un lenguaje de programación de alto nivel para poder usarse como modelo abstracto de cálculo debe tener: 1) variables enteras y booleanas 2) expresiones aritméticas sencillas 3) expresiones booleanas. 4) Lista de instrucciones: a. Skip b. asignación x : E c. concatenación S1; S2 d. si B entonces S1 si no S2 fsi e. mientras B hacer S fmientras Programas que resuelven problemas de cálculo: tienen como entrada y salida una cadena de caracteres. Programas que resuelven problemas de decisión: tienen como entrada un valor y devuelven un booleano. Notación sobre programas: p( x) = el programa p con entrada x se detiene (converge). p( x) = el programa p con entrada x NO se detiene (diverge). p( x) = el valor devuelto por el programa p con entrada x. Si un programa se detiene entonces da un valor de salida, p ( x ) y | p ( x ) y L( p) = es el lenguaje aceptado por p. L ( p ) x * | p ( x ) Si Compiladores e intérpretes: Cada programa puede codificarse como una cadena finita de caracteres sobre un alfabeto dado. Cada programa se puede codificar de muchas formas y cada una de ella se le puede asignar un número que lo identifica de forma unívoca. Este número se denomina de Gödel. Existe un programa compilador que nos dice si una cadena es un programa sintacticamente correcto. pi ( x) intérp(i, x) pi ( x) Existe un programa intérprete que simula cualquier otro: pi ( x) intérp(i, x) 2. ENUMERABILIDAD Las funciones no calculables algorítmicamente no pueden resolverse con un ordenador (problemas indecidibles). Conjuntos enumerables: Un conjunto S es enumerable si es FINITO o existe una función TOTAL y BIYECTIVA f : N S Diagonalización: Si un conjunto es ENUMERABLE entonces CUALQUIER SUBCONJUNTO también. Si un conjunto es NO ENUMERABLE entonces CUALQUIER SUBCONJUNTO tampoco. El conjunto de las FUNCIONES CALCULABLES es enumerable. 3. FUNCIONES Y CONJUNTOS RECURSIVOS(=CALCULABLES) Funciones recursivas totales y parciales: Función recursiva parcial es aquella que es calculada por algún programa con un lenguaje de programación. Claves: CUANDO SE PARA, K Y APARECE EN SU DEFINICIÓN. “División entera” entrada x; si x 2 entonces r : 57 sino repetir hasta que 1 2 fsi; salida r Función recursiva total es aquella que es recursiva parcial y está definida para TODAS las entradas. Claves: CUANDO SE PARA Y NO APARECE EN SU DEFINICIÓN. “Producto de 2 naturales”. entrada x; salida x La función calculada por un programa SIEMPRE es RECURSIVA. Conjuntos recursivos(=calculables): L es un conjunto recursivo si su función característica La clase de los conjuntos recursivos se denomina REC. L es recursiva total. Problemas decidibles Son aquellos que representadas sus soluciones en forma de conjunto, este es recursivo. Ejemplos: Los números impares, Los números primos, N y , Los finitos, Los Cofinitos ( finitosc ). La funciones NO recursivas existen: Dada f : f es total pero no es recursiva (no puede ser calculada por ningún programa) definida como: n (n) 1 si n ( n) f ( n) si n ( n) 1 Por reducción al absurdo: Suponemos que sí es recursiva (existe una máquina m que la calcula). f m f ( m) m ( m) Pero, por la definición de f (n) tenemos que f (m) m (m) 1. El error nos indica que esta máquina m no existe, y por lo tanto, no es recursiva. Procedimiento efectivo 1) Se lleva a cabo en finitos pasos de tiempo finito 2) Siempre debe dar una salida (no se puede colgar). K, el conjunto de las codificaciones de programas que se paran cuando leen su propio código como entrada : K x | x ( x) ¿Es el conjunto K recursivo? Supongamos que lo es. Su función característica será, por tanto: 1 0 K ( x) si x K si x K ,que es recursiva total, es decir la calcula algún programa pi Sea, ahora, f la función premeditadamente elegida y definida como 1 si K ( x) 0 (x K ) f ( x) si K ( x) 1 (x K ) Esta función es recursiva parcial. Es decir, existirá una máquina j que la calcula f j Entonces: j K j ( j ) K ( j ) 1 f ( j ) j ( j ) j K j K j ( j ) f ( j ) K ( j ) 1 j ( j ) j K Tenemos un error por lo que podemos concluir que: No existe un programa pi que calcule K , por tanto; K REC (K NO es recursivo) Nota: Al ser este problema un subconjunto del problema general de saber si cualquier programa se para al recibir como entrada su propio código podemos concluir que el problema general es igualmente indecidible o no recursivo. Propiedades de los conjuntos recursivos: El complementario de un conjunto recursivo es recursivo A REC A REC A ( x) 1 A ( x) La unión de dos conjuntos recursivos es recursiva La intersección de dos conjuntos recursivos es recursiva A B REC A, B REC AB ( x) A ( x) B ( x) A B REC Hola compañeros... Voy a intentar dar mi versión a ver que os parece. Para empezar reducire el ejemplo a cadenas de 5 digitos que serán 0 o 1. Esto lo hago sólo para ver el ejemplo luego deberemos abstraerlo para infinitos caracteres. Esto es importante ya que, sólo con cinco caracteres, obtenemos un conjunto finito y por tanto si sería enumerable pero como digo esto es sólo un ejemplo. Imaginemos que tenemos estas 5 MT escogidas al "tun-tun". 0 01001 1 11111 2 00110 3 11000 4 00001 Ahora de lo que se trata es de adivinar si existe alguna MT que se nos pudiese ocurrir con 5 caracteres y que no este en la lista. Como ya he dicho esto es un ejemplo y se ve a simple vista que está "chupao". Una solución sería, por ejemplo, "00000" que ciertamente no está en la lista. La solución no sería tan sencilla si trabajásemos con 10 millones de caracteres y 20 billones de MT's (o infinitas que es lo que nos preocupa a nosotros). Por tanto tenemos que encontrar un método que nos permita estar seguros de encontar la MT que no está. ¿Cómo lo hacemos?, con la diagonalización. Veamos el ejemplo: Crearemos una máquina que tenga el digito contrario en la posición i que la máquina que se encuentre en la misma fila i. Esto es un poco enrevesado pero muy sencillo: *La máquina 1 es "01001" y su dígito 1 es "0" *La máquina 2 es "11111" y su dígito 2 es "1" *La máquina 3 es "00110" y su dígito 3 es "1" *La máquina 4 es "11000" y su dígito 4 es "0" *La máquina 5 es "00001" y su dígito 5 es "1" Cambiamos la diagonal principal 01101 y obtenemos la nueva MT: "10010". Que, como queríamos, no se encuentra en la lista. ¿Por qué sabemos que con este sistema el resultado nunca estará en la lista?. ¿Cómo sabemos que el resultado no se encuentra, por ejemplo, en la fila 3?. Pues porque, tal y como hemos construido el resultado, sabemos que en la fila tres al menos el elemento 3 de la MT resultado es distinto (recordad que hemos puesto el dígito contrario). Bueno espero que después de todo este rollo lo que cuento sea todo cierto ;) Luis Somolinos Conjuntos recursivos en términos de programas enumeradores: Los conjuntos recursivos son los que tienen una función característica recursiva y total. Programa enumerador : programa que, sin entrada, genera una lista (infinita o no) de palabras. Un lenguaje es recursivo es generado en orden y sin repeticiones por un programa generador. Teorema de parametrización s-m-n: Si f ( x1 ,..., xm , y1... yn ) es recursiva (no es necesario que sea total), existe una función recursiva total s que cumple que:x1 ,..., xm : f ( x1 ,..., xm , y1... yn ) s ( x1 ,..., xm ) ( y1... yn ) ¿Es la función f ( x) con Im( f ) múltiplos de x recursiva? Sabiendo que g ( x, y ) x y es recursiva (parcial), existe s que cumple que s ( x ) ( y ) g ( x, y ) x, y : s ( x ) ( y ) x y 4. CONJUNTOS ENUMERABLES RECURSIVAMENTE (ER) Definiciones: x L p( x) cierto p acepta L * cuando x x L p( x) falso p( x) L es un CONJUNTO ENUMERABLE RECURSIVAMENTE si hay un PROGRAMA P que acepta L. UN PROGRAMA RECURSIVO ES SIEMPRE ENUMERABLE RECURSIVAMENTE REC ER Problemas semidecidibles: expresadas sus soluciones en forma de conjunto, ER. Relación con los problemas recursivos: Teorema del complementario: A REC A ER A ER Posibilidades para situar un lenguaje y su complementario: REC ER ER LyL ; L y L ER ; L y L ER ER REC REC Propiedades de la clausura: A,B REC A B ER A B ER Caracterización en términos de programas enumeradores: El orden no es necesario A es generado por un programa generador Y pueden haber repeticiones A ER A es la imagen de una función recursiva. A es el dominio de una función recursiva. A A es la imagen de un función recursiva total. En este caso las simulaciones para generar el conjunto A se deben hacer en tiempo finito para evitar que la máquina parezca que se ha colgado al no pararse. Para ello añadimos una nueva variable i que contará el número de pasos k que ponemos como “medidor del tiempo”. K ER por que es el dominio de la función calculada por px ( x) La función calculada por un programa es, por definición, siempre recursiva. ¿ A, B ER A B ER ? Si A, B ER i, j A Dom(i ) B Dom( j ) Sea f ( x) i ( x) j ( x) que es recursiva f ( x) i ( x) j ( x) Por tanto Dom( f ) Dom(i ) Dom( j ) A B ER A B REC C A B AND(C A , CB ) C A * CB A B REC C A B OR(C A , CB ) C A CB Predicados recursivos. Teorema de proyección: Predicado = sentencia, con variables, que podemos clasificar como cierta o falsa. Soluciones al Predicado = son los valores de las variables que hacen cierto el predicado. Las soluciones a un predicado se pueden expresar en forma de conjunto. x 2 4 es un predicado. Las soluciones del predicado se puede expresar como el conjunto S x x 2 4 UN PREDICADO ES RECURSIVO SI SU CONJUNTO DE SOLUCIONES ES RECURSIVO. Teorema de proyección: la parte que no podemos decidir, en este caso la y, la sacamos de la expresión con un símbolo . Se habla de semidecibilidad por este motivo. A ER R REC x : x A y R( x, y) Función reloj: es una función que, pasados un determinado número de pasos, se detiene dando, siempre una respuesta cierta o falsa. se para en t o menos pasos cierto si px ( y ) r ( x, y , t ) falso si px ( y ) NO se para en t o menos pasos Es recursiva total, y por tanto, el predicado T x, y, t el programa número x con entrada y se para en t pasos es un predicado recursivo. Ejemplo aplicación del teorema de proyección: Demostrar que el conjunto K ER: Recordemos que K x x ( x) entonces podemos añadir t pasos como parámetro de semidecibilidad y decir que K x x ( x) x t T ( x, x, t ) 5. REDUCCIONES Definición de m-reducción: Se trata de reducir un conjunto A a otro conjunto B que sea un caso especial de A. Para ello tenemos que codificar los enunciados del conjunto A como enunciados del conjunto B. Lo que tenemos que conseguir es una función que codifique el enunciado de A en otro equivalente pero con el conjunto B. Sean A y B dos conjuntos distintos. A se podrá m reducir a B, A m B, si encontramos una función recursiva y total f x * : x A f ( x) B No puede ocurrir que un enunciado de A dé un enunciado que NO sea de B. No puede ocurrir que un enunciado que NO sea de A dé un enunciado que sea de B. Propiedades de la m-reducibilidad: 1. Dado A REC B y B * A m B Ejemplo: Dado A n n es par REC K y K * A m K A m B A REC ; B REC B REC A REC A m B A m B 3. A ER ; B REC B ER A REC 2. 4. 5. 6. A m B A m A A m B B m C A m C A m B B m A Clases de m-equivalencia: A m B B m A A m B m-grado: cada una de las clases de m-equivalencia (conjunto de conjuntos m-equivalentes entre si). Dado A REC B y B * A m B todos los conjuntos REC menos el y el conjunto son m-equivalentes * implicaciones: A * m A A NO m * A * m A A NO m Completitud:Un conjunto es completo si es el más difícil de su clase. Sea L una clase (conjunto de conjuntos). A es m-completo para L si A L B L B m A propiedades: 1) A es m-completo para L BL B es m-completo para L A m B 2) K es m-completo para la clase ER 3) Los conjuntos m-completos forman un m-grado conclusiones: Para comprobar si A es NO recursivo intentamos reducir K a A. Para comprobar si A es NO enumerable recursivamente intentamos reducir K a A. demostración: Sabemos que K ER, pero ¿K ER ? Por el teorema del complementario sabemos que: A REC A ER A ER Por lo que si K ER K REC lo que no es cierto. 6. PROBLEMAS INDECIDIBLES. EJEMPLOS El problema de la parada y K: PARO x, y x ( y) Sabemos que K x x ( x) REC Reducimos K a PARO : x * x K x ( x) x, x PARO La función f ( x) x, x es recursiva y total, y puesto que x K f ( x) PARO, f reduce K a PARO. Recordando una de las propiedades de la m-reducibilidad A m B B REC A REC podemos concluir que PARO REC Problemas indecidibles similares: A x, y, z x ( y ) z. Es un problema indecidible. Observamos que la pertenencia al conjunto A depende de z que es una constante. En este caso hacemos una reducción algorítmica de K a A Suponemos un hipotético pa que decide la pertenencia al conjunto A según el algoritmo: entrada x; Codificación de h( x) si pa h( x), x, x cierto entrada w; entonces r : cierto h( x), x, x A r : px ( x); sino r : falso h( x), x, x A salida x fsi salida r El algoritmo decide la pertenencia a K : h( x), x, x A h ( x ) ( x) x px ( x) x K Por tanto pa no puede existir A no es recursivo Teorema de Rice: Conjuntos de índices: Es un conjunto S de programas equivalentes, dos a dos, tales que, para la misma entrada, devuelven la misma salida o no contestan. La pertenencia de un programa a S no depende de la sintáxis del programa sino de la función que calcula. El par de programas equivalentes pueden pertenecer a S o no pertenecer a S. Es decir, nunca tienen decisiones contradictorias. px py x y S ( x) S ( y) Ejemplo : A x 7 Im( x ) Suponemos que x A x y . Entonces tenemos un y A ya que, por x y , 7 Im( x ) 7 Im( y ). Si x A y A A es un conjunto de índices Si y A x A Teorema de Rice: Solamente podemos saber la decibilidad de lo que no cumple ninguna función recursiva o de lo que cumplen todas. Sea P el conjunto de todas las funciones recursivas (totales y no totales). Sea S un conjunto de índices de las funciones de programas equivalentes. Si S P S REC S S P Siempre que podamos encontrar una función que pertenezca al conjunto problema y otra que no ya sabemos que no es recursivo.