Examen de Autómatas, Lenguajes y Computabilidad ALC 1 de Septiembre de 2006 (I) CUESTIONES: (Justifique formalmente las respuestas) 1. Sea L = {ak bm cp : p = k + 2m m, k ≥ 0} ¿Es L regular ? (1.5 puntos) Solución El lenguaje L no es regular. Veamos que L no cumple el lema de bombeo. Tomemos n como la constante del lema y tomemos la cadena del lenguaje z = an bn c3n . Factorizando la cadena tenemos z = uvw con |uv| ≤ n. Evidentemente, uv estará formado por k sı́mbolos a con 1 ≤ k ≤ n. Si tomamos un valor de i = 2 y formamos la nueva cadena uvvw ésta toma la forma an+k bn c3n que, evidentemente, no pertenece al lenguaje. Por lo tanto, ya que L no cumple el lema de bombeo podemos concluir que L no es regular. 2. Sea L el lenguaje sobre {a, b} formado por aquellas palabras que no contienen simultáneamente el sı́mbolo a y el sı́mbolo b ¿Es L regular? (1 punto) Solución El lenguaje L sı́ es regular. Podemos observar que el complementario del lenguaje L, es decir las cadenas que contienen simultáneamente el sı́mbolo a y el sı́mbolo b, se puede expresar como (a + b)∗ a(a + b)∗ ∩ (a + b)∗ b(a + b)∗ . Dado que el anterior lenguaje es regular (ya que es el resultado de intersectar dos lenguajes regulares) podemos concluir que L también lo es. 3. Sea L = {ak bm cp : p = k + 2m m, k ≥ 0} ¿Es L incontextual ? (1.5 puntos) Solución El lenguaje L sı́ es incontextual. Puede comprobarse fácilmente que la siguiente gramática incontextual lo genera (S es el axioma de la gramática). S → aSc | A | λ A → bAcc | λ 4. Sea f una operación definida sobre cadenas de Σ de la siguiente forma: Si la longitud de la cadena x es impar y toma la forma x = x1 ax2 con |x1 | = |x2 | y a ∈ Σ entonces f (x) = x1 axr2 y si la longitud de la cadena x es par y toma la forma x = x1 x2 con |x1 | = |x2 | entonces f (x) = x1 xr2 . La operación f se extiende a lenguajes de la forma habitual, esto es f (L) = {f (x) : x ∈ L}. ¿Es la clase de los lenguajes recursivamente enumerables cerrada bajo f ? (1 punto) Solución La clase de los lenguajes recursivamente enumerables es cerrada bajo la operación f . Para demostrarlo, en primer lugar consideremos que la inversa de la operación f puede ser calculada por una rutina f −1 de una forma sencilla: establecer si la longitud de la cadena es par o impar, obtener la segunda mitad de la cadena (en el caso de que la longitud de la cadena sea par) o la última 1 parte de la cadena tras el sı́mbolo central (en el caso de que la longitud de la cadena sea impar), obtener el reverso de esta parte y concatenar esa parte con el comienzo de la cadena original. A partir de ese hecho y, considerando que para todo lenguaje recursivamente enumerable L, existe una máquina de Turing que acepta exactamente las cadenas de L, podemos proporcionar el siguiente esquema de aceptación para las cadenas de f (L) x acepta f −1 acepta L f −1(x) En el anterior esquema, dada una cadena de entrada x se calcula f −1 (x) de acuerdo con la rutina explicada anteriormente. La nueva cadena f −1 (x) se somete a su posible aceptación por parte de L. Si la cadena f −1 (x) es aceptada entonces x también lo es dado que pertenece a f (L), en caso contrario es rechazada o puede que la máquina no pare. Dado que el anterior esquema acepta sólo las cadenas de f (L) podemos concluir que f (L) es recursivamente enumerable si L lo es y, por lo tanto, f es una operación de cierre para la clase de los lenguajes recursivamente enumerables. (II) PROBLEMAS: 5. Sea A = (Q, Σ, δ, q0 , F ) un AFN. Diremos que un estado q ∈ Q representa su alfabeto de entrada si existen transiciones con cada uno de los sı́mbolos de Σ que llegan a q. Desarrolle un módulo Mathematica que, dado como entrada un AFN A, devuelva True si A contiene al menos un estado que represente su alfabeto de entrada y False en caso contrario. (2 puntos) Solución prob5[A List] := Module[{test, trans, k, j, alfaq }, test=False; k=1; While[(k ≤ Length[A[[1]]]) && (!test), trans = Cases[A[[3]], { , , A[[1,k]] }; alfaq = {}; For[j=1, j ≤ Length[trans], j++, alfaq = Union[alfaq, {trans[[j,2]]}]; ]; If[alfaq == Union[A[[2]]], test=True]; k++ ]; Return[test] ] 6. Dada la expresión regular r = a∗ b(ab)∗ y el homomorfismo h definido como h(0) = aba y h(1) = ab, se pide obtener un AFD para el lenguaje h−1 (L(r)). (1.5 puntos) Solución En primer lugar, procederemos a calcular el conjunto de derivadas relativas a r y obtendremos el correspondiente AFD 2 λ−1 r = r = q0 a−1 r = r = q0 b−1 r = (ab)∗ = q1 (ba)−1 r = b(ab)∗ = q2 (bb)−1 r = ∅ = q3 (baa)−1 r = ∅ = q3 (bab)−1 r = (ab)∗ = q1 De los anteriores estados, sólo q1 es final por contener su expresión regular a la cadena vacı́a. El diagrama de transiciones es el siguiente: a b q0 a q1 b q2 b a q3 a,b Dado que el anterior AFD es completo procedemos a calcular su complementario a b q0 a q1 b q2 b a q3 a,b Sobre el anterior AFD calculamos el homomorfismo inverso de h y obtenemos el siguiente AFD 0,1 0 q0 q2 1 1 0,1 q3 0 q1 Finalmente, procedemos a minimizar el anterior AFD, obsérvese que como resultado de la minimización los estados q2 y q3 se agrupan. El siguiente AFD constituye una solución para el enunciado 3 0,1 0 q0 q2 1 1 0 q1 7. Dada la gramática G definida por las siguientes reglas se pide obtener una gramática simplificada y en Forma Normal de Chomsky que genere L(G) − {λ}. S → 0AA | 1C | CA0 A → 1S | 0AA | λ B → 0AA | 0BB | 0 C → S0 | 1CC | AA D → 1E1 | E1 | 0 E → 0EE | 1D | D0 | B (1.5 puntos) Solución Procedemos, en primer lugar, a simplificar la gramática G eliminando para ello los sı́mbolos inútiles. El algoritmo de cálculo de sı́mbolos generativos nos devuelve el conjunto de no terminales generativos = ∅, por lo que la gramática original no se modifica. El cálculo de sı́mbolos alcanzables desde el axioma nos devuelve el conjunto alcanzables = {S, A, C, 0, 1}. Por lo que la gramática queda como sigue: S → 0AA | 1C | CA0 A → 1S | 0AA | λ C → S0 | 1CC | AA Calculamos ahora el conjunto de sı́mbolos anulables. Obtenemos anulables = {A, C}. Eliminamos las reglas vacı́as y obtenemos: S → 0AA | 0A | 0 | 1C | 1 | CA0 | A0 | C0 A → 1S | 0AA | 0A | 0 C → S0 | 1CC | 1C | 1 | AA | A Calculamos ahora para cada no terminal, el conjunto de sı́mbolos no terminales alcanzables a través de reglas simples: C(S) = {S}, C(A) = {A}, C(C) = {C, A} por lo que el conjunto de reglas queda como sigue tras eliminar las reglas simples: S → 0AA | 0A | 0 | 1C | 1 | CA0 | A0 | C0 A → 1S | 0AA | 0A | 0 C → S0 | 1CC | 1C | 1 | AA | 1S | 0AA | 0A | 0 La anterior gramática no contiene sı́mbolos inútiles (no generativos o no alcanzables) por lo que ya está totalmente simplificada. Vamos ahora a pasar la gramática obtenida a forma normal de Chomsky. El primer paso sustituye los terminales por no terminales adicionales en las partes derechas de longitud superior a 1. Obtenemos: S → C0 AA | C0 A | 0 | C1 C | 1 | CAC0 | AC0 | CC0 A → C1 S | C0 AA | C0 A | 0 C → SC0 | C1 CC | C1 C | 1 | AA | C1 S | C0 AA | C0 A | 0 C0 → 0 C1 → 1 4 Finalmente, aplicamos el segundo paso y obtenemos la gramática requerida en forma normal de Chomsky: S → C0 D1 | C0 A | 0 | C1 C | 1 | CD2 | AC0 | CC0 D1 → AA D2 → AC0 A → C1 S | C0 D1 | C0 A | 0 C → SC0 | C1 D3 | C1 C | 1 | AA | C1 S | C0 D1 | C0 A | 0 D3 → CC C0 → 0 C1 → 1 5