PREGUNTA: Sea el lenguaje L = {xnym : n + m es un numero par}. ¿Cuál de las siguientes afirmaciones es verdadera?a) El lenguaje L es un Lenguaje Regular.
b) El lenguaje L es un Lenguaje Independiente del Contexto no Regular.
RESPUESTA: La opción correcta es la a)
Si el lenguaje es regular podremos representarlo con una expresión regular, una gramática regular ó un autómata finito (determinista o no determinista).
En primer lugar tenemos que reflexionar sobre la definición del lenguaje. Nos dice m+n es un número par. Número par es todo número múltiplo de 2. ¿Es el cero un número par? Esto nos puede generar algo de duda, pero efectivamente el cero es un número par porque son pares todos los enteros multiplicados por 2, así son pares -8, -6, -4, -2, 0, 2, 4, 6, 8 … En este caso los números negativos no tienen sentido y el cero todavía no lo sabemos, pero sí sabemos que es par.
Veamos cadenas que genera el lenguaje:
a) Fijamos las x y vemos las posibles y´s teniendo en cuenta que son pares 0+0, 1+1, 1+3, 1+5… , 2+0, 2+2, 2+4, 2+6 …, 3+1, 3+3, 3+5, … , 4+0, 4+2, 4+4, 4+6…, : cadenas ε, xx, xyyy, xyyyyy, xx, xxyy, xxyyyy, xxyyyyyy, xxxy, xxxyyy, xxxyyyyy, etc.
b) Fijamos las y´s y vemos las posibles x`s: 0+0, 1+1, 2+2, 4+2, 6+2, 8+2 …, 1+3, 3+3, 5+3, 7+3, …, 2+4, 4+4, 6+4, 8+4, … , : cadenas ε, xx, xxyy, xxxxyy, xxxxxxyy, xyyy, xxxyyy, xxxxxyyy, xxxxxxxyyy, etc.
No descartamos que sea regular porque no vemos la necesidad de contar, sino de un autómata capaz de generar bucles de cierta manera.
El patrón observable es:
Si la x es impar, entonces el número de y´s admisible es 1, 3, 5, 7, 9 … , es decir, si x es impar y ha de ser impar
Si la x es par entonces el número de y´s admisible es 2, 4, 6, 8…, es decir, si x es par y ha de ser par
Si la y es impar, entonces el número de x´s admisible es 1, 3, 5, 7, 9 …
Si la y es par, entonces el número de x´s admisible es 2, 4, 6, 8
En resumen, si número de x´s es par número de y´s también ha de serlo, y si número de x´s es impar número de y´s también ha de serlo.
Vamos a tratar de generar una gramática regular que reconozca el lenguaje:
S -- > ε | xAyB
A -- > ε | xxA
B -- > ε | yyB
Genera: ε y cadenas con x´s impares e e impares, lo que da lugar a que la suma de x´s e y´s sea par.
Pero ojo: la gramática anterior no es regular desde el punto de vista formal.
Ahora tratemos de ampliar a la posibilidad de x´s pares e y´s pares.
S -- > ε | xAyB | AB
A -- > ε | xxA
B -- > ε | yyB
Esta gramática parece generar el lenguaje. Ahora nos preguntamos ¿es regular el lenguaje?
Sabemos transformar gramáticas regulares en autómatas finitos, pero como esta gramática no es regular no podemos aplicar el “método conocido” y vamos a tratar de hacerlo intuitivamente.
Nota: formalmente deberíamos tener estados intermedios en cadenas como xx ó yy, pero como lo único que nos interesaba era ver si era un lenguaje regular hemos abreviado no representando las transiciones carácter a carácter.
Este autómata finito determinista representa el lenguaje, que por tanto consideramos que es regular.
Ahora vamos a intentar expresar el lenguaje como expresión regular:
L = (ε | x(xx)*y(yy*) | (xx)*(yy)* )
Esta expresión parece generar el lenguaje, por tanto todo indica que es regular.
¿Es necesario todo este desarrollo para responder esta pregunta? No, basta con de alguna manera llegar a la conclusión correcta de que el lenguaje es regular. Si a ti se te ha ocurrido directamente la expresión regular que representa el lenguaje, por ejemplo, y has tardado un minuto, genial. Nosotros hemos tardado bastante más tiempo…