Ir al contenido

Lenguajes Regulares

Las Expresiones Regulares (ER) son una forma declarativa de describir lenguajes. Si el Autómata es la máquina que valida, la ER es la “fórmula” que genera las cadenas.

3.1 Operadores de las ER (Sintaxis y Jerarquía)

Sección titulada «3.1 Operadores de las ER (Sintaxis y Jerarquía)»

Para “leer” una Expresión Regular (ER) sin equivocarte, debes respetar la jerarquía. Los 3 Operadores Fundamentales:

  1. Cierre de Kleene / Estrella (*): Repetición de 0 a \infty veces.

    • Definición formal: L=i=0Li=L0L1L2L^* = \bigcup_{i=0}^{\infty} L^i = L^0 \cup L^1 \cup L^2 \dots
    • En cristiano: {ε,L,LL,LLL,}\{\varepsilon, L, LL, LLL, \dots\}
  2. Concatenación (\cdot o implícito): Secuenciación.

    • LMLM: Una cadena de LL pegada a una de MM.
  3. Unión (++ ó |): Selección (O lógica).

    • L+ML+M: Cadenas que pertenecen a LL o pertenecen a MM.

3.2 Construcción de ER (Definición Inductiva)

Sección titulada «3.2 Construcción de ER (Definición Inductiva)»

En teoría te pueden preguntar: “Defina formalmente una ER”. No te inventes nada, usa esta estructura recursiva:

  1. Base (Los ladrillos):

    • ε\varepsilon es una ER (representa el lenguaje {ε}\{\varepsilon\}).
    • \emptyset es una ER (representa el lenguaje vacío {}\{\}).
    • Cualquier símbolo aa del alfabeto es una ER (representa {a}\{a\}).
  2. Paso Inductivo (El cemento):

    • Si EE y FF son ER, entonces también lo son:
      • E+FE + F (Unión)
      • EFEF (Concatenación)
      • EE^* (Cierre)
      • (E)(E) (Paréntesis para agrupar)

Usa estas identidades para simplificar expresiones monstruosas en los ejercicios.

  • Identidad de la Unión (\emptyset): L+=LL + \emptyset = L (Sumar nada, se queda igual).

  • Identidad de la Concatenación (ε\varepsilon):
    Lε=εL=LL\varepsilon = \varepsilon L = L (Pegar “vacío” no alarga la cadena).

  • Elemento Nulo de la Concatenación (\emptyset):
    L=L=L\emptyset = \emptyset L = \emptyset (Si un tramo del puente se cae, no cruzas el río).

  • Conmutativa (SOLO Unión): L+M=M+LL + M = M + L.

    • ¡OJO!: La concatenación NO es conmutativa (LMMLLM \neq ML). “Casa” \neq “Saca”.
  • Asociativa:

    • (L+M)+N=L+(M+N)(L+M)+N = L+(M+N)
    • (LM)N=L(MN)(LM)N = L(MN)
  • Distributiva (Factorización): Vital para sacar factor común.

    • Por izquierda: L(M+N)=LM+LNL(M+N) = LM + LN
    • Por derecha: (M+N)L=ML+NL(M+N)L = ML + NL
  • Idempotencia:

    • L+L=LL + L = L (No sumas cantidades, unes conjuntos. Decir “rojo o rojo” es “rojo”).

C. Propiedades de los Cierres (Estrella y Más)

Sección titulada «C. Propiedades de los Cierres (Estrella y Más)»

Aquí es donde suelen pillar en los test.

  1. Doble Estrella: (L)=L(L^*)^* = L^* (Repetir repeticiones sigue siendo repetir).

  2. Cierre Positivo (+^+): L+=LLL^+ = LL^*.

    • Significa “1 o más veces” (excluye ε\varepsilon si LL no lo contenía).
  3. Opcionalidad (??): L?=L+εL? = L + \varepsilon.

    • Significa “0 o 1 vez” (aparece o no aparece).
  4. Descomposición: L=L++εL^* = L^+ + \varepsilon.

  5. Casos Límite:

    • =ε\emptyset^* = \varepsilon (El conjunto de 0 repeticiones de nada es la cadena vacía).
    • ε=ε\varepsilon^* = \varepsilon
  1. Confundir \emptyset con ε\varepsilon:

    • ε\varepsilon es una cadena (longitud 0). Es como una caja vacía.
    • \emptyset es un lenguaje (tamaño 0). Es no tener ni caja.
    • Recuerda: =ε\emptyset^* = \varepsilon.
  2. El error de la distribución del asterisco:

    • (a+b)a+b(a+b)^* \neq a^* + b^*.
    • (a+b)(a+b)^* mezcla as y bs libremente (ej: abaabbabaabb).
    • a+ba^* + b^* te obliga a elegir: o todo as, o todo bs.
  3. Olvidar el orden en la concatenación:

    • Si tienes ab+acab + ac, puedes sacar factor común a(b+c)a(b+c).
    • Pero si tienes ba+caba + ca, el factor común va a la derecha: (b+c)a(b+c)a.

Método: Eliminación de Estados.

La idea es desmantelar el autómata estado por estado hasta que solo quede una “super-flecha” del inicio al final con la Expresión Regular completa.

Algoritmo:

  1. Limpieza: Elimina los estados sumideros (o “de muerte”) que no llegan a ningún lado. Al quitarlo, debes “recablear” las conexiones para no perder información (ver la “Regla del Puente” abajo). Si son finales no los borres.
  2. Resultado Final:
    • Si el estado inicial es también final: Te quedará 1 solo estado.
    • Si son distintos: Te quedarán 2 estados.
    • Nota: Si hay múltiples estados finales, calcula la ER para cada uno por separado (ignorando que los otros son finales) y únelas con un ++ al final.

Cuando eliminas un estado intermedio (qq), cualquier camino que pasaba por él debe convertirse en una flecha directa.

Si tienes: AqBA \to q \to B

  • Y qq tiene un bucle sobre sí mismo (KK).

  • La nueva flecha directa ABA \to B será: Etiquetanueva=(Entrada)(Bucle)(Salida)Etiqueta_{nueva} = (Entrada) \cdot (Bucle)^* \cdot (Salida)

  • Si ya existía una flecha directa de AA a BB con valor DirectoDirecto, se suma: Total=Directo+(EntradaBucleSalida)Total = Directo + (Entrada \cdot Bucle^* \cdot Salida)

Si el autómata se reduce a un solo estado con uno o varios bucles. L=RL=R*

R: La unión de todas las expresiones de los bucles en el estado (r1+r2+r_1 + r_2 + \dots).

Te queda el estado Inicial (q0q_0) y el Final (qfq_f), con flechas de ida, vuelta y bucles propios. L=(R+SUT)SUL=(R*+SU*T)*SU*

  • (R+SUT)(R*+SU*T)* : Es todo lo que puedes hacer empezando y acabando en el inicio.

    • O giras en el inicio (RR).
    • O vas al final, giras allí y vuelves (SUTS \cdot U^* \cdot T).
    • Todo esto repetido las veces que quieras (^*).
  • SUS U^*: Una vez te cansas de dar vueltas en el inicio, viajas al final (SS) y puedes quedarte girando allí (UU^*) para terminar.

Esto es equivalente a escribir: L=(R+SUT)SUL=(R+SU*T)*SU* Porque podemos aplicar esta propiedad para simplificar: (L)=L(L^*)^* = L^*

[!Nota] Cuando hice el ejercicio de arriba se me fue la pinza. En ER1ER_1 donde pone un ++ es una multiplicación y lo mismo en ER2ER_2. ER1=(1+(0010110))(001)0ER_1=(1+(00*10*11*0))*(00*1*)0*.

Empleando estas reglas se puede construir un AFD con transiciones epsilon, suelen quedar autómatas gigantescos. Se puede simplificar después o también hay casos donde es obvio el autómata que reconocen

R+S:L(R)+L(S)R+S:L(R)+L(S)

RS:L(R)(S)RS:L(R)(S)

R:L(R)R*:L(R*)

Ejemplo:

3.7 Lema del Bombeo para Lenguajes Regulares

Sección titulada «3.7 Lema del Bombeo para Lenguajes Regulares»

[!Nota] Esto en prácticas no lo dimos, y ns si cae en el final o no pero en anteriores finales lo pregunta. Y claro no se si en la teórica lo dijo porque ir a la teórica nunca fue opción.

Sea LL un lenguaje regular. Entonces existe un número entero p1p \geq 1 tal que cualquier cadena ww perteneciente a LL con longitud wp|w| \ge p puede dividirse en tres partes, w=xyzw = xyz, cumpliendo las siguientes tres condiciones:

  • y>0|y| > 0 (o lo que es lo mismo, yϵy \neq \epsilon): La parte central no puede estar vacía.
  • xyp|xy| \le p: La parte que se repite ocurre dentro de los primeros pp caracteres.
  • Para todo k0k \ge 0, la cadena xykzLxy^kz \in L: Podemos repetir la parte yy tantas veces como queramos (o borrarla con k=0k=0) y la cadena resultante seguirá perteneciendo al lenguaje.

Podemos pensarlo como:

  • xx (El prefijo): El camino desde el inicio hasta antes de entrar al bucle.
  • yy (El bucle): La parte de la cadena que hace que el autómata de una vuelta y regrese al mismo estado. Por eso puedes repetirla (kk veces) y el autómata sigue feliz en ese bucle.
  • zz (El sufijo): El camino desde que sales del bucle hasta el estado final.

El Lema del Bombeo no garantiza que el lenguaje sea regular, porque aunque lo cumpla podría no serlo. Lo que es seguro es que si no lo cumple, no es regular.

Ejemplo: L={aibjj=2i}L = \{ a^i b^j \mid j = 2i \}. Eso implica que Nb=2NaN_b = 2 \cdot N_a y a mayores se debe de respetar el orden. Normalmente nos darán algo así:

  • x=a(n/2)1x = a^{(n/2)-1} (Aporta n21\frac{n}{2}-1 aes, 0 bes).
  • y=abby = abb (Aporta 1 a, 2 bes).
  • z=bn2z = b^{n-2} (Aporta 0 aes, n2n-2 bes).

Y nos dirán que probemos con varios kk si se cumple o no. Si por ejemplo usamos k=2k=2 w=a(n/2)1(abb)(abb)bn2w' = a^{(n/2)-1} \cdot (abb) \cdot (abb) \cdot b^{n-2} Ya podemos apreciar simple vista que va a fallar porque tenemos abbabbabbabb lo cual no cumple el orden, por ello no tenemos un lenguaje regular. Pero si nos dicen que k=0k=0 tendríamos w=xzw' = x \cdot z w=a(n/2)1bn2w' = a^{(n/2)-1} \cdot b^{n-2}

Y aprovechamos Nb=2NaN_b = 2 \cdot N_a para sustituir: 2(n21)=n22 \cdot (\frac{n}{2} - 1) = n - 2

Vemos que el lema del bombeo no falla, pero esto no significa que sea regular.