“Conocimiento Programación>Lenguajes De Programación

¿Cómo se puede demostrar que un idioma es regular?

2011/10/13
Hay varias formas de demostrar que un idioma es regular. Aquí hay un desglose de los métodos comunes, junto con explicaciones y ejemplos:

1. Construyendo un autómata finito (FA) o autómata finita determinista (DFA)

* Explicación: Si puede construir un DFA o NFA (autómata finito no determinista) que acepta * todos * y * solo * las cadenas en el idioma, entonces el idioma es regular.

* Cómo hacerlo:

* Defina los estados: Los estados de su FA representan la "memoria" de lo que se ha visto hasta ahora en la cadena de entrada. Piense en qué información es esencial para recordar para determinar si la cadena está en el idioma.

* Defina las transiciones: Las transiciones dictan cómo el FA se mueve de estado a estado en función de los símbolos de entrada. Asegúrese de que sus transiciones reflejen correctamente las reglas del idioma.

* Defina el estado de inicio: Donde el autómata comienza a procesarse.

* Defina los estados de aceptación: Los estados que indican la cadena están en el idioma.

* Ejemplo: Considere el lenguaje l ={cadenas sobre {a, b} que contienen "AB" como subcadena}.

`` `` ``

Estados:Q0 (inicio), Q1, Q2 (aceptación)

Transiciones:

- Q0, A -> Q1 (visto un 'a' hasta ahora, lo que puede conducir a "AB")

- Q0, B -> Q0 (visto A 'B', reinicio)

- Q1, A -> Q1 (visto 'aa' hasta ahora, todavía buscando "AB")

- Q1, B -> Q2 (visto 'AB'!)

- Q2, A -> Q2 (ya visto 'AB', por lo que cualquier entrada adicional nos hace aceptar)

- Q2, B -> Q2 (ya visto 'AB', por lo que cualquier entrada adicional nos hace aceptar)

Estado de inicio:Q0

Estado de aceptación:Q2

`` `` ``

Puede dibujar un diagrama de estado para visualizar este FA.

2. Construyendo una expresión regular

* Explicación: Si puede escribir una expresión regular que describe * todos * y * solo * las cadenas en el idioma, entonces el idioma es regular.

* Cómo hacerlo:

* Comprender los operadores de expresión regulares básicos:

* Concatenación:`Ab` (coincide con la cadena" AB ")

* Unión (o):`a | b` (coincide con" a "o" b ")

* Kleene Star (cero o más repeticiones):`a*` (coincide "", "a", "aa", "aaa", ...)

* Kleene Plus (una o más repeticiones):`a+` (coincide con "a", "aa", "aaa", ...)

* Paréntesis para agrupar:`(a | b) c` (coincide con" ac "o" bc ")

* Clases de caracteres:`[ABC]` (coincide 'A', 'B' o 'C'))

* Rangos:`[A-Z]` (coincide con cualquier letra minúscula)

* Desglose el idioma en partes más pequeñas y combínalas usando los operadores.

* Ejemplo: Usando el mismo lenguaje l ={cadenas sobre {a, b} que contienen "AB" como subcadena}.

La expresión regular es:`(a | b)*ab (a | b)*`

* `(a | b)*` significa cero o más ocurrencias de 'A' o 'B' (cualquier cadena de 'A y' B).

* `AB` es la subcadena requerida.

* `(a | b)*` nuevamente permite cualquier cadena de 'A y' B's* después* "AB".

3. Uso de propiedades de cierre de idiomas regulares

* Explicación: Los idiomas regulares están cerrados bajo ciertas operaciones. Esto significa que si aplica estas operaciones a los idiomas regulares, el resultado también es un idioma regular. Las propiedades de cierre comunes incluyen:

* Unión

* Concatenación

* Estrella de Kleene

* Intersección

* Complementación

* Diferencia

* Reversión

* Homomorfismo (sustitución)

* Cómo hacerlo:

1. Demuestre que el idioma se puede construir a partir de idiomas regulares más simples y conocidos utilizando operaciones de cierre.

2. Por ejemplo, si puede demostrar que su idioma es la unión de dos idiomas regulares, ha demostrado que es regular.

* Ejemplo: Deje l1 ={cadenas sobre {a, b} comenzando con 'a'} y l2 ={cadenas sobre {a, b} terminando con 'b'}. Tanto L1 como L2 son regulares (puede escribir fácilmente expresiones regulares para ellos:`a (a | b)*` y `(a | b)*b`).

Ahora, considere el lenguaje l =l1 ∩ l2 ={cadenas sobre {a, b} comenzando con 'a' * y * terminando con 'b'}.

Dado que los idiomas regulares están cerrados bajo intersección, L también es regular. Su expresión regular es `a (a | b)*b`.

4. Teorema de Myhill-Gerode

* Explicación: El teorema de Myhill-Gerode proporciona una condición necesaria y suficiente para que un idioma sea regular. Establece que un idioma l es regular si y solo si tiene un número finito de *sufijos distinguibles *. Dos sufijos *x *y *y *se distinguen con respecto a *l *si existe una cadena *z *tal que exactamente uno de *xz *o *yz *está en *l *. En términos más simples:un idioma l es regular si puede dividir todos los prefijos posibles en un número finito de clases de equivalencia.

* Cómo hacerlo (más avanzado):

1. Defina una relación de equivalencia basada en sufijos distinguibles:`x ≡ y` if y solo si para todas las cadenas` z`, `xz ∈ L` if y solo if` yz ∈ L`.

2. Demuestre que el número de clases de equivalencia bajo esta relación es finito. Si es así, entonces el idioma es regular. El número de clases de equivalencia es igual al número de estados en el DFA mínimo para el idioma.

* Ejemplo: Sea l ={0 n 1 n | n ≥ 0}. Este es un lenguaje * no regular * (utilizado para demostrar el lema de bombeo). Para comprender intuitivamente la aplicación myhill-gerode:

Considere los prefijos 0, 00, 000, ... Si L eran regulares, luego finalmente dos prefijos, digamos 0

i y 0 J (donde yo i a 0 i , obtienes 0 i 1 i , que * está * en L. Sin embargo, si se agrega 1 i a 0 J , obtienes 0 j 1 i , que es * no * en l (porque j> i). Por lo tanto, 0 i y 0 J son distinguibles. Dado que puede crear un número infinito de prefijos distinguibles, el lenguaje no es regular. El teorema de Myhill-Gerode a menudo se usa para demostrar que un lenguaje * no * regular.

5. El lema de bombeo para idiomas regulares (para demostrar que un idioma es * no * regular)

* Explicación: El lema de bombeo es una herramienta para demostrar que un idioma es * no * regular. Establece que si un idioma l es regular, entonces existe una longitud de bombeo *P *(un entero), de modo que cualquier cadena *S *en L con longitud mayor o igual a *p *se puede dividir en tres subcadenas, *x *, *y *y *z *, donde *s *=*xyz *, y las siguientes condiciones sostienen:

1. Para cada i> =0, xy i Z está en L. (puede "bombear" la parte y cualquier número de veces y el resultado todavía está en el idioma).

2. | Y |> 0. (La parte "bombeada" Y debe tener longitud al menos 1).

3. | XY | <=p. (La parte "bombeada" debe ocurrir dentro de los primeros caracteres P).

* Cómo usarlo para demostrar la no regularidad:

1. Suponga que L es regular.

2. Suponga que la longitud de bombeo es *P *. (No sabes qué es * P *, pero asumes que existe).

3. Elija una cadena * S * en L tal que | S |> =*p *. La clave aquí es elegir una cadena * S * que conduzca a una contradicción más adelante. Esta es a menudo la parte más complicada.

4. Considere todas las formas posibles de dividir * S * en * xyz * tal que | y |> 0 y | xy | <=*p *.

5. para *cada *posible división, encuentre un valor de *i *tal que *xy i Z* es* no* en l. Esto contradice el lema de bombeo, que dice que * para todos * i, xy i Z debe estar en L.

6. Dado que encontró una contradicción, su suposición inicial de que L es regular debe ser falso. Por lo tanto, L no es regular.

* Ejemplo: Sea l ={a n b n | n> =0}. Demuestre que L no es regular.

1. Suponga que L es regular.

2. Sea * p * la longitud de bombeo.

3. Elija * S * =A P B P . Observe que | S | =2p> =p.

4. Considere las posibles divisiones de * S * en * xyz * con | y |> 0 y | xy | <=*p *. Desde | xy | <=* p * y * s * comienza con un p , * xy * debe consistir solo en 'A's. Por lo tanto:

* x =a j para algunos j> =0

* y =a k para algunos k> 0 (porque | y |> 0)

* z =a p-j-k B P

5. Elija i =0. Luego xy i z =xz =a j A P-J-K B P =A P-K B P . Desde k> 0, p - k P-K B P es * no * en L.

6. ¡Contradicción! El lema de bombeo dice que para todos yo, xy i Z debe estar en L. Encontramos una división y un valor de I para el que no lo es.

7. Por lo tanto, L no es regular.

Consideraciones clave y mejores prácticas:

* Elija el método correcto: El mejor método depende del idioma.

* Para idiomas simples, la construcción de una DFA/NFA o expresión regular es a menudo la más fácil.

* Para idiomas construidos a partir de otros idiomas regulares que utilizan operaciones estándar, use propiedades de cierre.

*Para idiomas sospechosos de ser *no regulares *, use el lema de bombeo o el teorema de myhill-gerode.

* Claridad y rigor: Al demostrar que un idioma es regular, defina claramente su expresión de autómata/regular y explique por qué acepta * todas las * cadenas en el idioma y * solo * esas cadenas. En otras palabras, demuestre ambas direcciones de la implicación. Una descripción vaga no es suficiente.

* Minimización: Si construye un DFA, es útil (pero no es necesario) para minimizarlo. Un DFA minimizado es único para un idioma determinado.

* Práctica: Trabajar a través de muchos ejemplos es la mejor manera de comprender estos conceptos y desarrollar la intuición necesaria para aplicarlos de manera efectiva.

En resumen, demostrar que un lenguaje es regular generalmente implica demostrar su equivalencia a una definición formal de regularidad:ya sea construyendo directamente una máquina (FA) o un patrón (expresión regular) que la reconoce, o mostrando que se construye a partir de componentes regulares utilizando operaciones conocidas que preservan la regularidad. El lema de bombeo, en contraste, se usa para refutar la regularidad.

Lenguajes De Programación
Cómo crear índices espaciales
¿Cómo resolver una matriz por QBasic
Cómo aprender Python gratis
Cómo convolución de una función en MATLAB
Apache Struts Tutorial
Cómo crear una función UDB
¿Qué es un cliente de UML
Cómo escribir un programa de Software
Conocimiento de la computadora © http://www.ordenador.online