CONTENIDO [1_1.5]. Lenguajes Formales: características, descripciones, operaciones, usos [1_8.4]. Conjuntos contables [2_2.4]. Diagonalización [2_2.4]. Límites de la computabilidad [2_2.4.3]. 1. GERSTING, JUDITH L. “Mathematical Structures for Computer Science: A Modern Approach to Discrete Mathematics”. W H Freeman & Co, 2006. 2. HEIN, JAMES. “Discrete Structures, Logic and Computability”. Jones and Bartlett Publishers 1995 Lenguajes formales Definiciones básicas
Un alfabeto (o vocabulario) Σ es un conjunto finito
no vacío de símbolos. Una cadena sobre Σ es una secuencia finita de símbolos de Σ. Σ* es el conjunto de todas las cadenas sobre Σ. Un lenguajes sobre Σ es un subconjunto de Σ*. Una gramática para un lenguaje puede ser descripta definiendo su proceso generativo. Gramática para lenguajes formales Una gramática estructura de frase (tipo 0) es una 4-tupla G= (VN, V T, S, P), donde VN = conjunto de símbolos no terminales. V T = conjunto de símbolos terminales. S = símbolo inicial de la gramática. P = conjunto finito de producciones de la forma α → β , donde α es una cadena sobre VN UV T , (con al menos un símbolo de VN), y β es una cadena sobre VN UV T. (usamos α → λ cuando β es la cadena nula) Derivaciones Sea G=(VN,VT, S, P) y sean w1 y w2 cadenas sobre VN U V T. Decimos que w1 deriva directamente w2, y lo notamos w1 ⇒ w2 si α → β es una producción en P, w1 contiene una instancia de α, w2 es obtenida a partir de w1 reemplazando esa instancia de α con β. Derivaciones Si w1,w2,...,wn son cadenas sobre VN UV T y w1 ⇒ w2, w2 ⇒ w3,... wn−1 ⇒ wn, entonces w1 genera (deriva) wn, Se escribe w1 ⇒+ wn (por convención, w1 ⇒* w1) Lenguaje formal Dada una gramática G, el lenguaje L generado por G, denotado L(G), es el conjunto L = {w ∈ VT *| S ⇒+ w}. En otras palabras, L es el conjunto de todas las cadenas de símbolos terminales generadas a partir de S.
Observación: Una vez que una cadena w de símbolos
terminales ha sido obtenida, ninguna producción puede ser aplicada a w, y w no puede generar otras palabras. Ejemplo de derivación Sea L = {0n1n | n ≥ 1}. Una gramática para L es G=(VN,VT, S, P) donde VN = {S}, VT = {0, 1}, y P consiste de las siguientes producciones: 1. S → 0S1 2. S → 01 Podemos generar 0313 como sigue: S ⇒ 0S1 (P1) 0S1 ⇒ 00S11 (P1) 00S11 ⇒ 000111 (P2) Ejemplo de derivación Sea L = {anbncn | n ≥ 1}. Una gramática para L es G=(VN,VT, S, P) donde VN = {S, B, C}, VT = {a, b, c}, y P consiste de las siguientes producciones: 1. S → aSBC 2. S → aBC 3. CB → BC 4. aB → ab 5. bB → bb 6. bC → bc 7. cC → cc Ejemplo de derivación Podemos generar la cadena a2b2c2 como sigue S ⇒ aSBC (P1) aSBC ⇒ aaBCBC (P2) aaBCBC ⇒ aaBBCC (P3) aaBBCC ⇒ aabBCC (P4) aabBCC ⇒ aabbCC (P5) aabbCC ⇒ aabbcC (P6) aabbcC ⇒ aabbcc (P7) Clases de gramática Estructura de frase (tipo 0): sin restricciones. Sensible al contexto (tipo 1): para cada producción α→β (excepto S→ λ), |α| ≤ |β |. Libre de contexto (tipo 2): para cada producción α→β (excepto S→λ), α∈VN. Regular (tipo 3) para cada producción α→β (excepto S→λ), α ∈ VN y β es de la forma t o tW, donde t ∈ V T y W ∈ VN. Gramáticas y lenguajes Un lenguaje se dice de tipo N si puede ser generado por una gramática de tipo N Dispositivos computacionales El dispositivo computacional más general se llama máquina de Turing y se corresponde con los lenguajes de tipo 0. Los lenguajes reconocidos por máquinas de Turing son los lenguajes de tipo 0. El dispositivo computacional más básico se llama autómata finito y se corresponde con los lenguajes de tipo 3. Dispositivos computacionales Existen dispositivos computacionales con capacidad intermedia entre aquellos reconocidos por autómatas finitos y máquinas de Turing: ➢ Autómatas a Pila para lenguajes de tipo 2 ➢ Máquinas de Turing acotadas linealmente para lenguajes de tipo 1. Operaciones sobre lenguajes Los lenguajes son conjuntos (finitos o infinitos) de cadenas y por tal motivo podemos operar sobre ellos: Operaciones: unión intersección complemento concatenación estrella de Kleene operaciones Sean L1 y L2 dos lenguajes sobre un alfabeto Σ : L1 ∪ L2 = {w | w ∈ L1 ó w ∈ L2} L1 ∩ L2 = {w | w ∈ L1 y w ∈ L2} L1’ = {w | w ∈ Σ* y w ∉ L1} L1 ° L2 = {w1w2 | w1 ∈ L1 y w2 ∈ L2} L1* = {w1w2…wn | wi ∈ L1, n ≥ 0} Gramáticas regulares Las gramáticas regulares sirven para generar: Cualquier lenguaje finito (aunque puede volverse una tarea tediosa). Lenguajes infinitos que presentan ciertas regularidades que pueden ser expresada de manera sencilla utilizando las llamadas expresiones regulares (como veremos más adelante) Gramáticas regulares Ejemplos de lenguajes que pueden ser generados por gramáticas regulares: L=∅. El lenguaje vacío. L=Σ*. para cualquier Σ. El lenguaje universal. L={w| w ∈ {a,b}* donde w tiene m a’s seguidas de n b’s para m,n ≥0}. L={w| w ∈ {0,1}* donde w tiene exactamente tres 0’s y tres 1’s}. Gramática libre de contexto Las gramáticas libres de contexto tienen ciertas características destacadas: Son sencillas, reemplazan un símbolo por vez. Pueden ser utilizadas para describir la sintaxis de los lenguajes de programación. La derivación de una gramática libre de contexto puede ser vista como un árbol de derivación. Gramáticas libres de contexto
Ejemplo de lenguajes que pueden ser generados por
gramáticas libres de contexto: Todos los que pueden ser generados por gramáticas regulares L ={anbn| n > 0} L={w|w∈{(,)}* donde los paréntesis están balanceados} L={w| w ∈{a,b}* y w=wr }. Observación: Si w = w1w2…wn, wi ∈{a,b}, entonces wr = wnwn-1…w1 Conjuntos contables Sean A y B conjuntos. Si existe una biyección entre A y B denotaremos este hecho escribiendo |A| = |B|. En este caso diremos que A y B tienen el mismo tamaño o la misma cardinalidad o que son equipotentes. Conjuntos contables Cardinalidad de un conjunto finito ¿Cuál es la cardinalidad del conjunto A definido como sigue? A = {(x + 1)3 | 1 ≤ (x + 1)3 ≤ 3000, x ∈ N} Existe una biyección f:{0, 1, . . . , 13} →A donde f(x) = (x + 1)3. Por lo tanto |A| = |{0, 1, . . ., 13}|= 14. Conjunto contable Cardinalidad de un conjunto infinito Sea Impar el conjunto de números naturales impares. Sea la función f : N → Impar definida como f(x) = 2x + 1. Dado que f es una biyección, podemos concluir que el conjunto Impar y N tienen el mismo tamaño. Es decir, |Impar| = |N|. Conjuntos contables Un conjunto se dice contable si es finito o si existe una biyección entre el mismo y N. En el último caso se dice que el conjunto es infinitamente contable.
En términos de tamaño decimos que un conjunto S es
contable si |S| = |{0, 1, . . . , n – 1}| para algún número natural n o |S| = |N|.
Si un conjunto no es contable, decimos que es
incontable. Conjuntos contables Propiedades de conjuntos contables a. Todo subconjunto de N es contable. b. S es contable si y sólo si |S| ≤ |N|. c. Cualquier subconjunto de un conjunto contable es contable. d. Cualquier imagen de un conjunto contable es contable.