PREGUNTA: Sea el lenguaje L definido por la gramática
S -- > AB
A -- > aAc
A -- > λ
B -- > bBc
B -- > λ
¿Cuál es la máquina más simple que puede reconocer este lenguaje?
a) Un autómata finito.
b) Un autómata a pila determinista.
c) Un autómata a pila no determinista.
d) Una máquina de Turing.
RESPUESTA: la opción correcta es la b).
Analicemos qué cadenas genera la gramática.
El símbolo inicial, dado que no nos indican otra cosa, es S. Con la producción S -- > AB podemos alcanzar la cadena vacía, ya que A deriva a la cadena vacía y B deriva a la cadena vacía. Por tanto, la cadena vacía forma parte del lenguaje generado por la gramática.
Las producciones A nos permiten generar cadenas con el mismo número de a´s que de c´s, por ejemplo ac, aacc, aaaccc, etc.
Las producciones B nos permiten generar cadenas con el mismo número de b´s que de c´s, por ejemplo bc, bbcc, bbbccc, etc.
La producción AB permite que se puedan concatenar cero o muchos pares de (ac) con cero o muchos pares de (bc).
Vamos a tratar de escribir una expresión regular que represente el lenguaje:
(ac)*(bc)*
¿Esta expresión regular representa el lenguaje? (incluido la cadena vacía). La respuesta es que no, esta expresión regular permite cadenas como ac, acac, acacac … ó bc, bcbc, bcbcbc… o la concatenación de ambas, pero esto no es el lenguaje que queremos representar.
Si nos fijamos necesitamos contar el número de a´s y verificar que el número de c´s que vengan a continuación sea igual, ó contar el número de b´s y verificar que el número de c´s que venga a continuación sea igual. Si necesitamos contar vamos a necesitar al menos un autómata a pila. Vamos a tratar de construir un autómata a pila que reconozca el lenguaje.
Podríamos pensar en este autómata, pero la transición λ desde q1 introduce no-determinismo.
Para hacerlo determinista eliminamos la transición con cadena vacía desde q1 y a cambio hacemos q0 estado de aceptación.
Con este autómata tenemos el problema de que obliga a recibir al menos ac una vez, mientras que el lenguaje permite que ac aparezca cero o muchas veces.
Vamos a corregir esto y redibujar el autómata:
Ahora parece que sí está correcto. Es un autómata a pila determinista. Le pasamos cadenas:
λ : acepta
ac: acepta
aacc: acepta
aaa…ccc… : acepta
Nota: el autómata ha resultado relativamente complejo debido a la cantidad de variantes que admite. ¿Podíamos haber respondido sin dibujar el autómata? Posiblemente sí, teniendo en cuenta que el autómata “simplemente” tiene que apilar y desapilar en dos etapas puede “intuirse” que es un autómata a pila determinista, pero esto depende de “la capacidad de visión” que tenga cada uno. Esta pregunta es menos sencilla de lo que parece...