Algoritmos y Estructuras de Datos Compiladores e Intérpretes Herramientas Lenguaje de programación
!Prog C/C++
Linux Matemáticas
Mates Discretas
Programación Orientada a Objetos Redes y Computación Distribuida Sistemas Operativos

Lenguajes Regulares

[date: 12-01-2025] [last modification: 14-01-2025]
[words: 1511] [reading time: 8min] [size: 13644 bytes]

Definición de los lenguajes regulares y del álgebra expresiones regulares. Cómo construir autómatas finitos que aceptan expresiones regulares y cómo obtener la expresión regulare de un autómata. El lema del bombeo.

Expresión regular (ER)

Las expresiones regulares denotan lenguajes:

  • Descripción en forma algebraica de lenguajes regulares
  • Forma declarativa de expresar las cadenas que queremos aceptar

Aplicaciones

Búsqueda de patrones mediante ER que dan una imagen del patrón que se quiere reconocer. Además se usan como lenguajes de entrada en muchos sistemas de proceso de cadenas:

Propiedades

Descripción de los lenguajes regulares:

Importante

No todos los lenguajes son regulares:

$$L_{01} = \set{0^n 1^n | n \ge 1}$$

Este lenguaje, de ser regular, existiría un AF con $k$ estados que lo reconocería, pero es imposible porque debe contar cualquier $n$ (potencialmente infinitos valores) con solo $k$ estados.

Operadores

Operaciones con lenguajes
$L_1 \cup L_2$
$L_1 + L_2$
Contiene todas las palabras que pertenecen a cualquiera de ellos.
$L_1 \cap L_2$Contiene todas las palabras que pertenecen a ambos.
$L_1 - L_2$Contiene todas las palabras que pertenecen a $L_1$ pero no a $L_2$.
$L_1 . L_2$Contiene todas las palabras que se pueden formar por la concatenación de una palabra de $L_1$ y otra de $L_2$.
$L^i$La potencia $i$-ésima es la concatenación $i$ veces consigo mismo.
$L^-$La reflexión se forma por la aplicación de la reflexión a todas las cadenas.
$L^*$

La clausura, estrella o clausura de Kleene es el conjunto de cadenas formado por la concatenación de cualquier número de cadenas de $L$ (se admiten repeticiones).

$$ L^* = \bigcup^{\infty}_{i=0} L^i $$

Solo existen dos lenguajes con clausura no infinita:

Precedencia de los operadores

*    Clausura       <--- Mayor precedencia
.    Concatenación
+    Unión          <--- Menor precedencia

Con los paréntesis se modifican las reglas de precedencia.

Álgebra de Expresiones Regulares

Unión
Conmutatividad$L + M = M + L$
Asociatividad$(L + M) + N = L + (M + N)$
Identidad$L + \varnothing = L$
Idempotente

$L + L = L$

Concatenación
No conmutatividad$LM \ne ML$
Asociatividad$(LM)N = M(LN)$
Identidad$L \lambda = \lambda L = L$
Nulo

$L \varnothing = \varnothing L = \varnothing$

Concatenación respecto de la unión
Distributiva por la izquierda$L (M + N) = LM + LN$
Distributiva por la derecha$ (M + N) L = ML + NL$

Propiedades de las clausuras:

Construcción

Autómatas finitos y expresiones regulares

Las Expresiones Regulares definen los lenguajes regulares exactamente igual que los autómatas finitos.

Autómatas finitos a ER

Para convertir de un AF a un ER, se van eliminando progresivamente estados y sustituyendo las diferentes transiciones con las ER equivalentes (en los arcos aparecen ER, no símbolos). Nótese que solo es una representación para la conversión, estos no son realmente autómatas.

  1. Para cada estado final $q$ se aplica el proceso de reducción. Se eliminan todos los estados excepto $q$ y el inicial $q_0$.
  2. Si $q \ne q_0$ ==> $ L = (R^* + SU^*T)^* SU^* $
  3. Si $q = q_0$ (solo queda un estado) ==> $L = R^*$
  4. La ER deseada es la unión de las cadenas obtenidas para cada estado final.
    flowchart LR
    I:::hidden --> A
    A((A)) -- R --> A
    A -- S --> B(((B)))
    B -- U --> B
    B -- T --> A
    classDef hidden display:none;
$$ L = (R + SU^*T)^* SU^* $$

Desde el estado inicial $A$ se puede recibir cualquier número de veces $R$. También es posible transicionar al estado $B$ mediante $S$, recibir $U$ cualquier número de veces y regresar a $A$ recibiendo $T$. Esto se puede repetir cualquier número de veces, dado que se empieza en $A$ y se regresa a $A$. Sin embargo, para terminar, es necesario quedar en un estado final, por lo que se transiciona a $B$ mediante $S$ y luego puede llegar cualquier número de $U$.

    flowchart LR
    I:::hidden --> A
    A(((A))) -- R --> A
    classDef hidden display:none;
$$ L = R^* $$

Conversión de ER a autómata finito

Teorema
Todo lenguaje definido por una ER puede definirse mediante un AF.

Demostración: sea $L = L(R)$ para la ER $R$. Se demostrará que $L = L(E)$ para algún AFN-$\lambda$.

Paso base:

    flowchart LR
    I1:::hidden --> A1((A))
    I2:::hidden --> A2((A))
    I3:::hidden --> A3((A))

    subgraph Caso 3
        A3 -- $$a$$ --> B3(((B)))
    end

    subgraph Caso 2
        A2 ~~~ B2(((B)))
    end

    subgraph Caso 1
        A1 -- $$\lambda$$ --> B1(((B)))
    end

    classDef hidden display:none;
    classDef edgeLabel background-color:#222,padding:2px;

Paso inductivo:

    flowchart LR
    I:::hidden --> A((A))
    A -- $$\lambda$$ --> R1(($$R_1$$))
    A -- $$\lambda$$ --> S1(($$S_1$$))

    subgraph R
        R1 ~~~ R2(($$R_2$$))
    end

    subgraph S
        S1 ~~~ S2(($$S_2$$))
    end

    R2 -- $$\lambda$$ --> F(((B)))
    S2 -- $$\lambda$$ --> F

    classDef hidden display:none;
    classDef edgeLabel background-color:#222,padding:2px;
$$ R + S \implies L(R) \cup L(S) $$
    flowchart LR
    I:::hidden --> R1(($$R_1$$))

    subgraph R
        R1 ~~~ R2(($$R_2$$))
    end

    R2 -- $$\lambda$$ --> S1(($$S_1$$))

    subgraph S
        S1 ~~~ S2(($$S_2$$))
    end

    S2 -- $$\lambda$$ --> F(((B)))

    classDef hidden display:none;
    classDef edgeLabel background-color:#222,padding:2px;
$$ RS \implies L(R) L(S) $$
    flowchart LR
    I:::hidden --> A((A))
    A -- $$\lambda$$ --> R1(($$R_1$$))

    subgraph R
        R2 -- $$\lambda$$ --> R1
        R1 ---> R2(($$R_2$$))
    end

    R2 -- $$\lambda$$ --> B
    A -- $$\lambda$$ --> B(((B)))

    linkStyle 3 display:none;
    classDef hidden display:none;
    classDef edgeLabel background-color:#222,padding:2px;
$$ R^* \implies L(R^*) $$

Lema del Bombeo

Para un lenguaje regular infinito, el cumplimiento del lema del bombeo es una condición necesaria, pero no suficiente.

Lema del Bombeo (LB)

Sea $L$ un lenguaje regular. Entonces, existe una constante $n$ dependiente de $L$, tal que, para toda cadena $w$ de $L$ con más igual o más símbolos que $n$, podemos dividir $w$ en tres de forma que

  • $y$ no es vacía
  • $xy$ es menor o igual que $n$
  • y para todo $k$ positivo, la cadena $xy^kz$ también es del lenguaje $L$

O de forma más precisa:

$$ \exists n / \quad \forall w \in L, |w| \ge n \quad w = xyz \begin{cases} y \ne \lambda \\ |xy| \le n \\ \forall k \ge 0, xy^kz \in L \\ \end{cases} $$

Es decir, para que un autómata genere lenguajes infinitos a partir de un conjunto finitos de estados, debe tener un ciclo en su grafo. Por tanto, siempre podemos encontrar una cadena no vacía $y$ no demasiado lejos del comienzo de $w$ que se puede «bombear».

Si ser repite $y$ cualquier número de veces o se borra ($k = 0$), la cadena sigue siendo del lenguaje.

    flowchart LR
    I:::hidden --> A(($$q_0$$))
    A -- $$x = a_1 \ldots a_i$$ --> B(($$q_i$$))
    B -- $$ y = a_{i+1} \ldots a_j $$ --> B
    B -- $$z = a_{j+1} \ldots a_m$$ --> F((($$q_m$$)))

    classDef hidden display:none;
    classDef edgeLabel background-color:#222,padding:2px;

Aplicación del lema del bombeo

  1. Elegimos un lenguaje $L$ para el que tratamos de demostrar que no es regular.
  2. El valor de $n$ es desconocido, por lo que debemos considerar cualquier valor.
  3. Elegimos $w$, usando $n$ como parámetro.
    Si para un $n$ suficientemente grande no podemos escoger $w$, $L$ será regular.
  4. Repetir para todas las descomposiciones de $w$.
    1. Escoger una descomposición de $w$ en $xyz$ sujeta a las restricciones vistas: $y \ne \lambda$, $|xy| \le n$
    2. Si $x y^k z$ pertenece a $L$ para todo valor de $k$:
      • Se verifica el lema del bombeo
      • No se puede afirmar que el lenguaje sea regular
      • No es necesario probar con otras descomposiciones. Termina el algoritmo.
  5. Si en el paso anterior no se ha cumplido para ninguna descomposición, no se verifica el lema del bombeo y por tanto el lenguaje no es regular.
Anterior: Autómatas Finitos Volver a Compiladores e Intérpretes Siguiente: Gramáticas