• No se han encontrado resultados

Unidad 1 Teoría de autómatas y Lenguajes Formales

N/A
N/A
Protected

Academic year: 2021

Share "Unidad 1 Teoría de autómatas y Lenguajes Formales"

Copied!
17
0
0

Texto completo

(1)

Unidad 1

Teoría de autómatas y

Lenguajes Formales

Objetivos

1° Obtener los conocimientos antecedentes, necesarios para el desarrollo de las etapas de análisis de un Compilador.

2° Implementar modelos matemáticos a partir de algunos sistemas reales, principalmente de tipo electrónico o computacional.

3° Profundizar en el conocimiento sobre la computabilidad de los algoritmos. Competencias:

Escribe expresiones regulares para representar patrones léxicos. Diseña autómatas finitos para reconocer lenguajes.

Construye gramáticas para lenguajes sencillos.

1.1 Lenguajes Formales

1.1.1 ALFABETO Un alfabeto es un conjunto finito no vacío de símbolos. Ej.

∑1 = {0, 1}

∑2 = {a, b}

∑3 = {na, pa, bra, la}

∑4 = {<HTML>,</HTML>,<BODY>,</BODY>, . . .}

∑5 = {|}

∑6 = {a, ab, aab}

1.1.2 PALABRA Una secuencia finita de símbolos de un alfabeto es una palabra sobre dicho alfabeto.

Ej.

∑1 : 0, 1, 00, 01, 11, 000, 1001101

∑2 : a, aa, abb, ababa

(2)

∑6 : a, ab, aab, aaab, abab

Escribimos la palabra vacía, es decir, la palabra que no contiene ningún símbolo, como λ.

El símbolo λ no pertenece a ningún alfabeto, pero si al meta–alfabeto,  ∉ Σ Longitud de una palabra sobre un alfabeto es el número de símbolos que contiene.

Ej. ∑1 : w = 0 ⇒ |w| = 1 w = 1001101⇒ |w| = 7 ∑2 : w = a ⇒ |w| = 1 w = ababa ⇒ |w| = 5 ∑3 : w = napa ⇒ |w| = 2 w = palabra ⇒ |w| = 3 ∑6 : w = ab ⇒ |w| = 2 w = aab ⇒ |w| = 1 ó |w| = 2 ??

• Dependiendo del alfabeto puede resultar difícil dividir una palabra en sus símbolos.

• Si se puede dividir todas las palabras sobre un alfabeto solamente de una manera en sus símbolos, se llama tal alfabeto libre.

• Solemos usar solamente alfabetos libres.

• La longitud de la palabra vacía es cero, | λ | = 0

Universo del Alfabeto El conjunto de todas las palabras que se pueden formar sobre un alfabeto ∑ más la palabra vacía se llama el universo del alfabeto W(∑).

• W(∑) = { λ } υ {w | w es palabra sobre ∑} • Σ⊂ (Σ)

• λ es palabra de cualquier universo,  ∈ (Σ).

• La cardinalidad del universo es infinito (pero contable o enumerable) • Si el alfabeto es libre, escribimos Σ*por W(Σ).

Concatenación Podemos concatenar palabras, entonces sean w, v y u palabras en Σ.

w.v = wv

es decir, usamos el . como símbolo de concatenación, pero muchas veces obviamos de él (igual como se suele hacer con el — de la multiplicación).

• λw = w = wλ , es decir, λ se comporta como el elemento neutro (o elemento de intentidad) respecto a la concatenación.

(3)

• |w.v| = |w| + |v|

• w.v ≠ v.w, en general, es decir, la concatenación no es conmutativa.

• (w.v).u = w.(v.u) para cualquier palabras w, v y u es decir, la concatenación es asociativa (usamos las paréntesis como metasímbolos).

Prefijos y sufijos Si xy = w, llamamos x prefijo de w e y sufijo de w.

• Dado que λw = w y wλ = w, λ es por lo tanto prefijo y sufijo (trivial) de cualquier palabra,

• y w es prefijo y sufijo trivial de si mismo. • Si x es prefijo de w entonces |x| ≤|w|. • Si y es sufijo de w entonces |y| ≤ |w|.

Potencia Si concatenamos siempre la misma palabra w, obtenemos potencias de w. Sea w una palabra para ∈ IN se define:

=    =  .   > 0 Por tanto las siguientes afirmaciones son verdaderas:

• w.w = w2, w.w.w = w3, w. . . . . w=wi , i ∈ IN = {0, 1, 2, — — —} i - veces • w1= w • w0 • |wi| = i — |w| • |w0| = | λ| = 0 = 0—|w| = |w0| • wm+n = wm.wn • |wm+n| = (m + n) — |w| = m — |w| + n — |w| = |wm| + |wn|

Reflexión La reflexión de una palabra w (o la palabra reversa) es wR tal que:

 =   =   .   = .      ∈ ! ∧  ∈ !∗ Donde: • ($%)% = $ • |w| = |wR| • λ = λR

(4)

Igualdad de cadenas si w y z son palabras, se dice que w es igual a z, si tienen la misma longitud y los mismos símbolos en la misma posición. Se denota w=z.

Subcadenas Una cadena w es una subcadena o subpalabra de otra cadena z si existen las cadenas x e y para las cuales z=xwy.

1.1.3

LENGUAJE

Un lenguaje es cualquier subconjunto del universo sobre algún alfabeto, es decir, L⊂ (Σ) , o también L ⊂ Σ∗.

Ej.

• Lenguajes triviales

 L = ∅ es el lenguaje vacío (que no contiene ninguna palabra), |L| = 0  L = { λ } es el lenguaje que solamente contiene la palabra vacía, |L| = 1 Estos lenguajes son independientes del alfabeto y por eso son lenguajes sobre cualquier alfabeto.

• Sea Σ = {a, b} L1 = { λ, a, b}

L2 = {anbn / n ∈ IN}, es decir, el lenguaje que contiene todas las palabras con un número de as seguidos por el mismo número de bs.

L3 = { $$% ∕ w ∈ Σ∗}, es decir, palíndromos de longitud par.

L4 = {*+,/ n ∈ IN }

Si |L| <

para un lenguaje L ⊂ Σ∗, entonces se llama L lenguaje finito.

Operaciones sobre/con lenguajes, sean L, L1, L2, L3 ⊂ Σ∗ lenguajes (igual para

W(Σ)) Unión: ./ ∪ .1 = {$ $⁄ ∈ ./ ó $ ∈ .1 } Propiedades: • Conmutatividad: L1 U L2 = L2 U L1 • Asociatividad: (L1

υ

L2)

υ

L3 = L1

υ

(L2

υ

L3) • Idempotencia: L

υ

L = L • Operación con ∅: L∪ ∅ = L = ∅ ∪ L • Operación con Σ∗: L ∪ Σ∗= Σ∗= Σ∗∪ L

(5)

Intersección:

./ ∩ .1 = {$ $⁄ ∈ ./ 6 $ ∈ .1 } Propiedades (unos ejemplos):

• Conmutatividad: L1 ∩ L2 = L2 ∩ L1 • Asociatividad: (L1 ∩ L2) ∩ L3 = L1 ∩ (L2 ∩ L3) • Idempotencia: L∩ L = L • Operación con ∅: L ∩ ∅ = ∅ = ∅ ∩ L1 • Operación con Σ∗: L ∩ Σ∗ = L = Σ∗∩ L Complemento: .′ = {$ $⁄ ∈ Σ∗ 6 $ ∉ . } Propiedades: • Reglas de DeMorgan: (./ ∪ .1)′ = ./ ′ ∩ .1′ (./ ∩ .1)′ = ./ ′ ∪ .1′ Diferencia: ./ − .1 = {$ $⁄ ∈ ./ 9:;< $ ∉ .1 } Propiedades: • .=/ = Σ∗− ./ • ./− .1= ./ ∩ (Σ∗ ∩ .1)′ Concatenación: ./ . .1 = {$ $ = $⁄ /$16 $/ ∈ ./ 6 $/ ∈ .1 } Propiedades: • No–Conmutatividad: L1.L2≠ L2.L1 • Operación con ∅: L1.∅ = ∅ = ∅.L1 • Operación con {λ}: L1.{λ} = L1 = {λ}.L1 Potencia: ? = {}  =  ?. ?   > 0  Propiedades: Cero–Potencia: L0 = {λ} Clausura positiva: ?A = B ?= ?∪ ?C∪ ?D∪ … F G

(6)

Clausura (de Kleene): ?∗ = B ?= ? ∪ ?∪ ?C∪ ?D∪ … F G Propiedades: .A = .− {⋌} IJ ⋌ ∉ . Σ∗ = B .K F KGL Reflexión (o inverso): ?= { ∈ ?}

Homomorfismo: Sean Σ, Γ dos alfabetos. Sea O: Σ → Γ∗ una función que asigna a cada símbolo de Σ una palabra sobre Γ. Podemos ampliar la función O a un homomorfismo O: Σ∗→ Γ, es decir, una función que asigna a cada palabra sobre Σ una palabra sobre Γ, con

O (λ) = λ O (wR) = O (w) O (R)

1.2 Autómatas finitos

Ej. En la orilla izquierda de un río se encuentra un hombre, junto con un lobo, una cabra y una col. Hay un bote con la capppacidad suficiente para llevar al hombre y a uno de los otros tres. El hombre con la col y demás compañeros deben cruzar el río, y el hombre puede llevar uno solo a la vez. Sin embargo, si el hombre deja solos al lobo y a la cabra en cualquier lado del río, con toda seguridad que el lobo se comerá a la cabra. Del mismo modo, si la cabra y la col se quedan juntas, la cabra se comerá a la col. Es posible que se pueda cruzar el río sin que nada sea comido por nadie?. El problema se modela de la siguiente forma utilizando grafos:

H: hombre L:lobo

G:cabra C:col

Los estados están etiquetados por parejas separadas por un guion, por ejemplo HG-LC, donde los símbolos que están a la izquierda del guión denotan el subconjunto que

(7)

está en la orilla izquierda del río; los símbolos que están a la derecha del guión representan el subconjunto que se encuentra en la orilla opuesta. Algunos de los 16 estados, como GC-HL, son fatales y nunca deben acezarse al sistema.

Las entradas al sistema son las acciones del hombre. Como se aprecia en el siguiente grafo:

La estructura de un autómata está dada por:

Nota: El apuntador del autómata devuelve el estado en el que se encuentra, que puede ser de aceptación o no. Si es de aceptación "acepto la cadena", si no, "no acepto o rechazo la cadena".

1.2.1 Autómatas finitos deterministas (AFD)

Un autómata finito determinista (AFD) es una quíntupla

S =< Σ, Q, δ, q

L

, X >

Donde:

(8)

∑ es un alfabeto (donde  ∉ ∑)

Q es un conjunto finito no vacío de estados, es decir, 0 < |[| < ∞

δ

es una función de transición:

]: [ × Σ → [; ](`, R) = 9

es decir, si el autómata se encuentra en el estado q y ‘lee’ el símbolo R va al estado p.

`L ∈ [ es el estado inicial.

F ⊆ Q es el conjunto de estados finales.

Podemos pensar de un autómata como un dispositivo que lee desde una cinta con símbolos y que realiza cambios de estados internamente:

Representación de autómatas:

Existen tres formas de representar un AFD, mediante: • tablas o matriz de transición

• mediante diagramas de transición. • función de transición

Ejemplo. Sea el AFD: ∑={a,b}, Q={p,q,r}, q0=p, F={q}

Donde la función de transición está definida de la siguiente forma: δ(p,a)=q δ(q,a)=q δ(r,a)=r δ(p,b)=r δ(q,b)=r δ(r,b)=r

Matriz de transición: la siguiente matriz representa la función de transición.

La flecha indica que p es el estado inicial, y el asterisco indica que q es un estado final de aceptación (en general, pueden aparecer muchos asteriscos aunque sólo puede aparecer una flecha ya que sólo hay un estado inicial).

(9)

S =< Σ, Q, δ, qL, X >=< {a, b}, {p, q, r}, δ, p, {`} > Lenguaje aceptado por un AFD

El lenguaje que acepta un AFD es el conjunto de palabras definidas sobre Σ que hacen que el autómata llegue a un estado final de aceptación

L={x ∈ Σ ∗ / ] (q0,x) ∈ F}

Ejemplo Autómata finito determinístico que acepte el lenguaje

Las transiciones de estados se aprecian en el siguiente grafo

Ejemplo: Autómata finito determinístico que acepte el lenguaje

Las transiciones de estados se aprecian en el siguiente grafo

(10)

Las transiciones de estados se aprecian en el siguiente grafo

Autómatas Incompletos:

A menudo nos encontramos con autómatas para los que no están definidas todas las transiciones. Las situaciones que no están definidas deben ser consideradas como situaciones de error, es decir, si una cadena hace llegar al autómata hasta una situación no definida, consideraremos que la cadena no ha sido reconocida por dicho autómata.

Si deseamos completar un autómata (no es imprescindible) bastará con añadir un estado muerto (estado trampa) que reciba todas las transiciones que le faltan al autómata incompleto.

Ejemplo. El autómata de la izquierda está incompleto, pero podemos completarlo transformándolo en el de la derecha, al que hemos añadido el estado r, que es un estado muerto.

1.2.2 Autómatas finitos No deterministas AFND

En los autómatas deterministas sabemos exactamente cuál es la transición que debemos llevar a cabo ante una determinada situación. Sin embargo, en los no deterministas podemos encontrarnos con varias opciones e, incluso con λ-transiciones Formalmente ampliamos un poco las posibilidades de las transiciones de un autómata finito, es decir, cambiamos la función δ.

(11)

Un autómata finito no-determinista (AFND) es una quíntupla M = (Σ, Q, δ, qL, X)

Donde:

∑ es un alfabeto (donde  ∉ ∑)

Q es un conjunto finito no vacío de estados, es decir, 0 < |[| < ∞

δ

es una función de transición:

]: [ × Σ → e([) siendo P(Q) el conjunto de partes de Q `L ∈ [ es el estado inicial.

F ⊆ Q es el conjunto de estados finales. Ejemplo: Un AFND para el lenguaje

Representamos la función δ también con una tmatriz, solo que ahora aparece más de un estado en cada celda de la matriz, por eso usamos la notación de conjuntos:

Ampliamos de nuevo δ para definir el lenguaje aceptado por un AFND:

es decir, δ*coincide con δ para símbolos del alfabeto y en general enumera los estados alcanzables con la palabra.

Un autómata finito no-determinista M = M = (Σ, Q, δ, qL, X) acepta una palabra w ϵ ∑* si δ*(q0,w)F≠ donde δ* es la ampliación de la relación de transición δ.

O en otras palabras, M acepta w, si δ*(q0 ,w) contiene un estado final del autómata.

El lenguaje aceptado por un autómata finito no-determinista M es el conjunto de palabras aceptadas por M:

(12)

1.2.3 Equivalencia entre AFD y AFND

Autómatas equivalentes

Dos AFD son equivalentes si reconocen el mismo lenguaje. Es evidente que para que esto ocurra deben estar definidos sobre el mismo alfabeto.

La naturaleza de un autómata finito no determinístico, hace que la tarea de simularlo en un programa de computadora sea muy difícil. Para un símbolo de entrada pueden existir diferentes transiciones estado a estado, es decir, la aceptación de una cadena puede o debe, involucrar diferentes trayectorias y todas ellas deben de probarse para saber si la cadena de entrada es o no, reconocida por el AFND.

El algoritmo que construye un AFD dado un AFND, se denomina Construcción de subgrupos. Una vez encontrado el autómata finito determinístico, puede ser optimizado o sea, reducir el número de estados S que lo forman.

El algoritmo de construcción de subgrupos tiene como principal tarea, construir una matriz de transición (función move) para el nuevo AFD. Cada estado del AFD es un conjunto de estados del AFND. Además, el algoritmo hace uso de las operaciones que aparecen en la siguiente tabla:

Operación Descripción

λ−cerradura (s) Es el conjunto de estados del AFND que son “alcanzados” desde el estado s del AFND, con transiciones (arcos) λ solamente. λ -cerradura (T) Es el conjunto de estados del AFND que son “alcanzados” desde

algún estado s en T del AFND, con arcos Î (transiciones) solamente.

move (T,a) Es el conjunto de estados del AFND hacia los cuales hay una transición con un símbolo a en la entrada, desde algún estado s en T del AFND.

Tanto el algoritmo de construcción de subgrupos, como el algoritmo para el cálculo de la operación auxiliar λ-cerradura(Τ), se muestran en el siguiente cuadro:

Algoritmo de construcción de subgrupos.

Entrada

AFND Autómata finito no determinístico. Proceso

D = λ-cerradura (so)

D es el conjunto de estados del nuevo AFD.

Inicialmente los estados calculados en esta cerradura decimos que no están marcados.

(13)

While ( existe un estado T no marcado en D ) Do Begin

Marcar T

For(cada símbolo de entrada a ) Do Begin

U = λ-cerradura (move(T,a))

if ( U no está en D )then

añadir U como un estado no marcado a D

Dtran [T,a] = U

end end Salida

Dtran: Tabla de transición del AFD.

Cálculo de la λ-cerradura. Entrada

T: Cualesquier conjunto de estados del AFND.

Proceso

Meter todos los estados en T a la pila λ−cerradura (T) = T

While ( Pila no está vacía ) Do Begin

Sacar t, elemento tope de la pila

for ( cada estado u con un arco λ desde t a u ) Do if ( u no está en λ−cerradura (T)) then

Begin añadir u a λ −cerradura (T) meter u a la pila end end Salida λ-cerradura (T)

2.5 Expresiones regulares y Lenguajes regulares

2.5.1 Expresiones regulares

Una expresión regular es una notación normalizada para representar lenguajes regulares. Como veremos, las expresiones regulares permiten describir con exactitud y sencillez cualquier lenguaje regular. Para definir una expresión regular (e.r.) se pueden utilizar todos los símbolos del alfabeto Σ y, además, λ y Ø. Los operadores que también se pueden utilizar son:

|

representa la unión

(14)

*

representa el cierre de Kleene

()

modifican las prioridades de los demás operadores

Una expresión regular se puede definir de acuerdo a los siguientes criterios:

1. ∅ es una e.r. que representa al lenguaje vacío (no tiene palabras) L∅=∅ 2.  es una e.r. que representa al lenguaje .i= {}

3. ∀ a ∈ ∑, a es una e.r. que representa al lenguaje .*={*} 4. Si α y β son e.r. entonces también lo son:

 α • β y representa al lenguaje Lα.β = LαLβ  α |β y representa al lenguaje Lα|β = Lα|Lβ

 α* y representa al lenguaje

.j∗= ⋃ .FKGL KF que también se puede representar l∗= ∑ lF K KGm

5. Ninguna otra secuencia de métodos es Expresión regular. Teorema: Toda expresión regular representa un lenguaje regular

Inversa

1.2.6 Expresiones regulares y autómatas

Existen algoritmos que relacionan la especificación de expresiones regulares, con el reconocimiento de éstos -autómatas finitos-. Es posible dada una expresión regular

(15)

obtener el AFD que reconozca las cadenas del lenguaje denotado por la expresión regular. También es posible obtener el AFND que reconozca el lenguaje representado por dicha expresión regular.

El algoritmo utilizado para la construcción del autómata finito no determinístico AFND, es relativamente sencillo de aplicar, ya que se basa en reglas simples. Existen muchas variantes de este algoritmo denominado “Algoritmo de Thompson”.

Este algoritmo es dirigido por sintáxis, es decir, usa la estructura sintáctica de la expresión regular para guiar el proceso de construcción del autómata AFND, como se aprecia a continuación:

Entrada

Expresión regular r definida sobre un alfabeto ∑.

Proceso

Primero, reconocemos las subexpresiones que constituyen a r.

Usando las reglas (1) y (2), construímos los AFND’s para cada

símbolo básico en r.

Guiados por la estructura sintáctica de la expresión regular r,

combinamos estos AFND´s de manera inductiva usando la regla (3) hasta obtener el AFND para la expresión regular r.

Salida

Un AFND que reconoce al lenguaje L ( r ).

Las reglas a las que hace mención el algoritmo de Thompson son las siguientes:

1.Para el símbolo λ, construir el AFND:

i es el nuevo estado inicial, y f es el nuevo estado de aceptación. Este AFND reconoce a

{ λ}.

2.Para cualesquier símbolo adel alfabeto ∑, construir el AFND :

De nuevo, i es el nuevo estado inicial, y f es el nuevo estado de aceptación. Este autómata reconoce { a }.

3. Supongamos que N(s) y N(t) son AFND’s para las expresiones regulares s y t,

respectivamente.

(16)

i es el nuevo estado inicial, y f es el nuevo estado de aceptación. Se añade una transición λ desde i hacia los estados de inicio de N(s) y de N(t). Además, se añade una transición λ desde los estados de aceptación N(s) y de N(t) hacia el nuevo estado de aceptación f.

Los estados de inicio y de aceptación de N(s) y de N(t) no son los estados de inicio y de aceptación del autómata N(s|t). Este AFND reconoce, L(s) U L(t).

b) Para la expresión regular st (concatenación), construir el AFND, N(st) :

El estado de inicio de N(s) es ahora el estado de inicio para el AFND N(st), y el estado de

aceptación de N(t) se vuelve el estado de aceptación del AFND, N(st). El estado de

aceptación de N(s) es mezclado con el estado inicial de N(t); esto significa que todas las

transiciones, desde el estado inicio de N(t) son ahora arcos o transiciones desde el estado de

aceptación de N(s). El nuevo estado que resulta de esta mezcla, pierde su estatus de estado

de inicio o aceptación para el nuevo AFND. El AFND así construido, reconoce el lenguaje

L(s) L(t).

c) Para la expresión regular s*, construir el AFND, N(s*):

i es un nuevo estado inicial, y f es un nuevo estado de aceptación. Con el nuevo AFND

(17)

2.7 Gramáticas Formales

Si nos referimos a los lenguajes naturales el concepto de gramática es muy antiguo. Los primeros trabajos aparecen en la India durante los comienzos del primer milenio antes de Cristo, alcanzándose el máximo apogeo con Panini (siglos VII y VI a.C.). Al mismo tiempo en Grecia se desarrollaba una corriente de investigación gramatical, cuyo máximo representantes ería Pitágoras. Sin embargo, el concepto de gramática desde un punto de vista formal tiene su origen en los trabajos de Chomsky a mediados del siglo XX

2.7.1 Definiciones previas

Definición (Producción) Sea Σ un alfabeto, llamamos producción (o regla) definida sobre ese alfabeto a un par ordenado de palabras (x,y) donde x,y ∈ Σ ∗. Se dice que x es la parte izquierda de la producción y que y es la parte derecha. A las producciones también se las llama reglas de derivación. Se representa x⇒y.

Referencias

Documento similar