Examen de Autómatas, Lenguajes y Computabilidad

Anuncio
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
Descargar