La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

LENGUAJES Y AUTOMATAS DR. RAMON ZATARAIN CABADA. INDICE 1.INTRODUCCION 2.GRAMATICAS 3.AUTOMATAS FINITOS 4.MAQUINAS DE TURING 5.GRAMATICAS Y AUTOMATAS.

Presentaciones similares


Presentación del tema: "LENGUAJES Y AUTOMATAS DR. RAMON ZATARAIN CABADA. INDICE 1.INTRODUCCION 2.GRAMATICAS 3.AUTOMATAS FINITOS 4.MAQUINAS DE TURING 5.GRAMATICAS Y AUTOMATAS."— Transcripción de la presentación:

1 LENGUAJES Y AUTOMATAS DR. RAMON ZATARAIN CABADA

2 INDICE 1.INTRODUCCION 2.GRAMATICAS 3.AUTOMATAS FINITOS 4.MAQUINAS DE TURING 5.GRAMATICAS Y AUTOMATAS 6.APLICACIONES A LENGUAJES

3 1.INTRODUCCION 1.1CONJUNTOS FINITOS E INFINITOS Los conjuntos X={1,2,3} Y={a,b,c,d} se definen de una manera explícita. Los conjuntos que contienen un número finíto muy largo de miembros o un número infiníto de miembros se definen de manera implícita. Ejemplo: El conjunto de todos los cuadrados perfectos es definido como: {n | n=m 2 para algún número natural m}

4 El conjunto vacío se representa por 0, y es el conjunto que no tiene miembros, o sea que0 = { }

5 Una cadena de un conjunto X es una secuencia finíta de elementos de X. Las cadenas son objetos fundamentales usados en la definición de lenguajes. El conjunto de elementos de donde las cadenas son producidas son llamados alfabetos de el lenguaje. Un alfabeto consiste de un conjunto finíto de objetos no divisibles. El alfabeto de un lenguaje se representa por El alfabeto de un lenguaje natural como el español consiste de las palabras de el lenguaje. Ejemplo: Sea ={a,b,c}. Las siguientes son cadenas de ese alfabeto: abc, ccb, cab,aaaabbbccc

6 Comúnmente los elementos de un alfabeto se representan por caracteres únicos como letras (a,b,c) o dígitos (1,2,3). La cadena que contiene cero elementos es llamada cadena nula o vacía y se representa por La concatenación de dos cadenas u y v, escrita uv, es pegar las dos cadenas para formar una nueva. Ejemplo: Sea u=ab, v=ca y w=bb. Entonces uv=abcavw=cabb (uv)w=abcabbu(vw)=abcabb El resultado de la concatenación de u,v y w es independiente de el orden en que las operaciones son ejecutadas. Matema- ticamente esta propiedad es conocida como asociatividad.

7 La longitud o tamaño de una cadena w es el número de elementos que contiene la cadena. Ejemplo: La cadena abcdef tiene una longitud de 6. Una subcadena u de la cadena v existe si existen las cadenas x y y de tal forma que v = xuy. Esto quiere decir Que u ocurre dentro de v. Un prefijo de v es una subcadena u en donde x es la cadena vacía en la descomposición de v. Eso quiere decir que v=uy. Similarmente, u es un sufijo de v si v=xu. Ejemplo: ab es un prefijo de la cadena abcdef y ef es un sufijo de la misma cadena.

8 1.2 Representación finíta del lenguaje Un lenguaje consiste de un grupo de cadenas de un alfabeto. Usualmente ciertas restricciones se aplican a las cadenas de el lenguaje. Por ejemplo el lenguaje Español consiste de todas las cadenas de palabras que nosotros llamamos oraciones. No todas las combinaciones de palabras forman oraciones. De alli que un lenguaje consiste de un subconjunto de el conjunto de todas las posibles cadenas que se pueden formar de el alfabeto. Ejemplo: El lenguaje L de cadenas de el alfabeto {a,b} en donde cada cadena comienza con una a y tiene longitud par. Las cadenas aa, ab, aaaa, abbb, abab, abbbaaba forman parte de ese lenguaje.

9 El lenguaje anterior se puede definir recursivamente como: i)Base: aa, ab son miembros de L. ii)Paso recursivo: Si u es miembro de L, Entonces uaa, uab, uba, ubb son miembros de L. iii)Cierre (Closure): Una cadena u es miembro de L solo si puede ser obtenida de los elementos base por un número finíto de aplicaciones del paso recursivo.

10 Ejemplo: El lenguaje L consiste de cadenas del alfabeto {a,b} en donde cada ocurrencia de b es inmediatamente precedida por una a. Por ejemplo, a, abaab estan en L y bb, bab, abb no estan en L. i)Base: es miembro de L. ii)Paso recursivo: Si u es miembro de L, Entonces ua, uab son miembros de L. iii)Cierre (Closure): Una cadena u es miembro de L solo si puede ser obtenida de los elementos base por un número finíto de aplicaciones del paso recursivo. Definiciones recursivas como la anterior son una herramienta para definir las cadenas de un lenguaje. Sin embargo esta técnica no es suficiente para definir lenguajes complejos como los Lenguajes de Programación.

11 Otra técnica para construír lenguajes es usar operaciones de conjuntos (sets) para construír, desde conjuntos mas simples conjuntos complejos de cadenas. Por ejemplo La concatenación de los lenguajes X y Y, denotada XY, es el lenguaje XY = {uv | u es miembro de X y v es miembro de Y} La concatenación de X consigo mismo n veces es denotada como X n. X 0 es definida como {

12 Ejemplo: Sea X = {a,b,c} y Y = {abb, ba}. Entonces XY = {aabb,babb,cabb,aba,bba,cba} X 0 = { X 1 = X = {a,b,c} X 2 = XX = {aa,ab,ac,ba,bb,bc,ca,cb,cc} X 3 = X 2 X = {aaa,aab,aac,aba,abb,abc,aca,acb,acc, baa,bab,bac,bba,bbb,bbc,bca,bcb,bcc, caa,cab,cac,cba,cbb,cbc,cca,ccb,ccc} Una operación importante es el Kleene Star, denotada para un conjunto X como X*, que no es otra cosa que la concate- Nación de del mismo lenguaje.

13 Lo anterior también es representado como X* = U X i i=0 Contien todos loas cadenas construídas desde X incluyendo la cadena nula. Si no se incluye la cadena vacía entonces tenemos a X + = U X i i=1 El conjunto de cadenas no nulas construídas desde X.

14 Ejemplo: El lenguaje L = {a,b}*{bb}{a,b}* consiste de las cadenas del alfabeto {a,b} que contiene la subcadena bb. La concatenación de el conjunto {bb} asegura la presencia de bb en cualquier cadena en L. Los conjuntos {a,b}* permiten cualquier número de as y bs, en cualquier orden, y que preceden y siguen la ocurrencia de bb. Las cadenas bb, abba, ababbbabab, bbaaaa, aaaabb son ejemplos de cadenas de el lenguaje L.

15 Ejercicios. Sea X = {aa,bb} y Y = { b,ab} Lista las cadenas en el conjunto XY. Lista las cadenas de el conjunto Y* de longitud tres o menos. ¿Cuántos cadenas de longitud 6 existen en X* ? Dar un lenguaje L sobre el alfabeto {a,b} que contenga todas las cadenas que comienzan con aa y terminan con bb. Sea L 1 = {aaa}*, L 2 = {a,b}{a,b}{a,b}{a,b} y L 3 = L 2 *. Describe las cadenas que estan en los lenguajes L2, L3 y L 1 L 3

16 2. GRAMATICAS 1.1 Introducción a las Gramáticas Una gramática es una herramienta o notación que nos permite definir un lenguaje por medio de una serie de reglas que nos dicen como construír cadenas v´alidas (oraciones) para el lenguaje. Chomski formalizó el concepto de una gramatica, al hacer observaciones importantes en la complejidad de una gramática que a su vez establece la complejidad de el lenguaje Como se estableció antes, un lenguaje es un conjunto finíto de cadenas desde un alfabeto. Una gramática es una forma de describir al lenguaje.

17 2.2 Estructuras de las gramáticas Una gramática G consiste de: Un alfabeto de símbolos terminales Un conjunto finíto de variables (símbolos no-terminales) V Un conjunto de reglas de substitución o producciones P Un símbolo inicial S G = ( V, P, S) Una regla de substitución o producción está formada por una parte izquierda y una parte derecha : Su significado es reemplazar con

18 La parte izquierda son cadenas desde V, que contienen al menos una variable desde V: es un miembro de (V * V (V * Mientras que el lado derecho son cadenas desde V es un miembro de (V * La gramática produce cadenas de * al aplicar las producciones e iniciando con el símbolo inicial hasta que no existan variables. Cada vez que una producción o regla es aplicada, una forma de sentencia (cadenas de variables de V y terminales de es producida.

19 El lenguaje generado por la gramática, L(G), es el conjunto de cadenas que pueden generarse aplicando las reglas anteriormente descritas. Ejemplo: Consideremos la siguiente gramática G = ( V, P, S) V= {S, A} a, m, o, t} P={ (1) S toAto, (2) A ma, (3) A maA } Que genera el lenguaje L(G)= {tomato, tomamato, tomamamato,...} Usando las siguientes reglas para la cadena tomamato S (1) toAto (3) tomaAto (2) tomamato

20 Ejercicios: Construír una gramática con alfabeto {a,b,c} para los Siguientes lenguajes: {a n b2 n c m | n,m > 0} {a n b m c 2n+m | n,m>0} Construír una gramática con alfabeto {a,b} cuyo lenguaje contiene Precisamente cadenas con el mismo numero de as y b´s.

21 2.3 Clasificación de las Gramáticas N. Chomsky en 1959 en su famoso artículo On certain formal properties of grammars definió cuatro familias de gramáticas (y lenguajes) que forman lo que se llama la jerarquía de Chomsky. Estas son: gramáticas sin restricciones, de contexto sensitivo, de contexto libre y regulares (tipo 0, 1, 2 y 3). La restricciones puestas en cada regla aumentan con el número de la gramática. Gramáticas sin Restriciones. Son el tipo de gramática mas generales. Una producción u v indica que una ocurrencia de una subcadena u en una cadena puede ser reemplazada con la cadena v. La única reestricción en una producción es que el lado izquierdo no sea cadena nula.

22 Una definición formal de una gramática sin restricciones es la siguiente: Un cuadruplo (V, P, S) donde V es un conjunto finíto de variables, el alfabeto) es un conjunto de símbolos terminales (del alfabeto), P es un conjunto de producciones y S es el símbolo inicial de V. Una producción de esta clase de gramática tiene la forma u v, donde u es miembro de (V + y v es miembro de (V. Ejemplo: La gramática sin restricciones V= {S, A, C} a,b,c} S aAbc | aAbC | Cb bC Cc cc Con símbolo inicial S genera el lenguaje {a i b i c i | i>=0}.

23 Gramáticas de Contexto Sensitivo Estas gramáticas representan un paso intermedio entre las gramáticas de contexto libre y las gramáticas sin restricciones. Para estas gramáticas no existe restricción alguna en la parte izquierda de la producción, pero la longitud de la parte derecha debe ser al menos la longitud de la parte izquierda. Una definición formal de una gramática de conexto sensitivo es la siguiente: Un cuadruplo G= (V,, P, S) donde cada producción tiene la forma u v, donde u es un miembro de (V +, v es miembro de (V + y longitud(u) >= longitud (v). Un lenguaje generado por una gramática de contexto sensitivo es llamado lenguaje de contexto sensitivo (en gramáticas sin restricciones el lenguaje también es llamado sin restricciones).

24 Si eliminamos las producciones de cadena vacía de la anterior gramática sin restricciones, tenemos una gramática de contexto sensitívo. S aAbc | abc A aAbC | abC que produce un lenguaje similar al ejemplo anterior. Gramáticas de Contexto Libre La flexibilidad proporcionada por las gramáticas de contexto libre es tal que es la mas usada para definir la sintaxis de los lenguajes de programación. Una definición formal de una gramática de conexto sensitivo es la siguiente:

25 Es un cuadruplo G= (V,, P, S) donde V es un conjunto finíto de variables, es un conjunto finíto de símbolos terminales, P es un conjunto finíto de reglas y S es el símbolo inicial. Cada producción tiene la forma u v, donde u es una variable del conjunto V, y v es un miembro de (V. Esto quiere decir En la parte izquierda dela producción viene siempre una variable (símbolo no terminal) y en la parte derecha pueden venir cualquier número de símbolos terminales y no terminales incluyendo la cadena nula. Una gramática de contexto libre produce un lenguaje también de contexto libre: G L(G).

26 Ejemplo: La siguiente gramática genera el lenguaje que consiste de cadenas con un número par positivo de as. G= (V,, P, S) V={S,A} a,b P: S AA A AAA | bA | Ab | a Una derivación por la izquierda es la siguiente: S AA bAA baA baa Una derivación por la derecha S AA AbA Aba aba

27 Un árbol de parsing o árbol de derivación es una representación gráfica de la derivación. Ejemplo: La siguiente figura representa el árbol de parsing para las cadenas del ejemplo anterior. S A b A a a S A a b A a

28 Ejercicios: Construír gramáticas de Contexto Libre (GCL) para los siguientes lenguajes: 1.L(G)= {a n b m a n | n>0, m>0} 2.L(G)= {a n b m c m d 2n | n>=0, m>0} ¿La solución también es una gramática de contexto sensitivo? ¿Si no, que modificarías de la GCL para hacerla GCS? 3.Sea G una GCL S abSc | A A cAd | cd Escribe una derivación por la izquierda de ababccddcc Construye un árbol de parsing para la misma cadena Usa notación de conjuntos para definir L(G)

29 Gramáticas Regulares Estas gramáticas constituyen una importante subclase de las gramáticas de contexto libre. Son también útiles en la definición de lenguajes de programación. Una gramática es regular (GR) si cada regla o producción cumple con las siguientes formas: 1.A a 2.A aB 3.A Donde A, B son miembros de V y a es miembro de Una GR G genera un lenguaje regular L(G).

30 Ejemplo La siguiente es una GCL ( U (ab) + a* ) G: S abSA | a una correspondiente gramática regular sería: S aB | B bS | bA A aA |

31 Expresiones Regulares Sea un alfabeto. Una expresión regular para se define recursivamente como: i)Base: 0 (el conjunto vacío), y a para cada a que es miembro de son expresiones regulares para ii)Paso recursivo: Sea u y v expresiones regulares para Las expresiones (u U v) (uv) (u*) son expresiones regulares para iii)Cierre: u es una expresión regular para solo si puede ser obtenido de los elementos base por medio de un número infiníto de aplicaciones de el paso recursivo.

32 Debido a que la unión y concatenación son asociativas, los paréntesis pueden ser omitídos de las expresiones que consisten de una secuencia de una de esas operaciones. Se Asigna también un orden de precedencia a los operadores. La operación Kleene Star tiene el mayor grado de precedencia, seguido de la concatenación y la unión. Por último, podemos decir que las expresiones regulares, al igual que las gramáticas, son una notación usada para especificar o definir un lenguaje Ejemplo: Sea = {a,b} 1.La expresión regular (a|b) denota el lenguaje {a, b} 2.La ER (a|b)(a|b) denota el lenguaje {aa,ab,ba,bb} 3.La ER a* denota el lenguaje { a, aa, aaa,...} 4.La ER (a|b)* denota el lenguaje de todos loas cadenas que contienen cero o mas instancias de una a o b, esto es, el conjunto de todas las cadenas de as y bs.

33 5.La ER a | a*b denota el lenguaje que contiene la cadena a y las cadenas que consisten de cero o mas as seguido de una b. 6.La ER (a|b)*bb(a|b)* denota el lenguaje que contiene las cadenas de as y bs con al menos una subcadena bb. Ejercicios: sea = {a,b} Escribir una ER para un lenguaje con cadenas que inician y terminan con a y contienen al menos una b. Lo mismo pero par el lenguaje de cadenas que contienen la subcadena aa y y la subcadena bb. Lo mismo pero para el lenguaje de cadenas que contienen la subcadena aa mínimo dos veces (cuidaddo con aaa). Lo mismo pero para el lenguaje de cadenas que no inician con la la subcadena aaa.

34 2.4 Representación de Gramáticas En las secciones anteriores, se usaron pequeñas gramáticas para generar lenguajes también pequeños. Esos ejemplos sirvieron para ilustrar el uso de gramáticas para definir lenguajes. Por otra parte, en el diseño de lenguajes de programación se maneja sintáxis y alfabetos mas complejas y mas grandes. Esto Por supuesto, incrementa la complejidad de las reglas para generar el lenguaje. Notación de BNF. John Backus y Peter Naur inventaron un sistema de reglas para definir el lenguaje de programación ALGOL 60. Este sistema recibió el nombre de Backus-Naur Form o BNF. La sintáxis del Pascal también fue definido con este sistema o técnica, y hoy en día se usa para definir la gran mayoría de los lenguajes de programación.

35 Una especificación BNF es un conjunto de reglas de producción, escritas como: ::= Ejemplo: Constantes Numéricas en Pascal ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ::= | ::=. |. E E ::= | ::= + | - ::= | ::= ::= |

36 Diagramas Sintácticos Es también un tipo de notación para especificar la sintáxis de Un lenguaje. La diferencia con la notación BNF es que en esta se usan líneas y figuras en lugar de nombres. Diagrama sintáctico de un Símbolo no terminal Símbolo terminal

37 Ejemplo: Diagramas sintácticos para expresiones aritméticas como a + b término expresión * factor / término

38 factor - identificador número (expresión)

39 3. AUTOMATAS FINITOS En este capítulo estudiaremos un tipo de máquinas abstractas de computación en donde la entrada consiste de una cadena de un determinado alfabeto, y la salida o resultado de la computación es la aceptación o no de la cadena de entrada. El conjunto de cadenas aceptadas por la máquina es el lenguaje reconocido por la máquina. De esta forma, asociamos lenguajes y máquinas, los dos tópicos principales de esta materia.

40 3.1 Autómatas Finítos Determinísticos (AFD) Un AFD es un quintuple M = (Q, q 0, F), donde Q es una máquina de estados finíta, es el alfabeto, q 0 es el estado inicial, F es el estado(s) final(es) y es una función de Q x a Q llamada la función de transición. Ejemplo: El siguiente AFD acepta el conjunto de cadenas que contienen la subcadena bb y donde ={a,b}. Esto quiere decir que L(M) = (a|b)*bb(a|b)*. M: Q = {q 0, q 1, q 2 } a, b} F = {q 2 }

41 (Continuación) M: Q = {q 0, q 1, q 2 } a, b} F = {q 2 } La función de transición es dada en forma tabular y llamada tabla de transición. a b q 0 q 1 q 0 q 2

42 Para las cadenas abba y abab tenemos las siguientes operaciones (computaciones) en la tabla: [q0, abba] [q0, abab] -[q0, bba]-[q0, bab] -[q1, ba]-[q1, ab] -[q2, a]-[q0, b] -[q2, -[q1, acepta rechazado La cadena abba es aceptada ya que la computación se para (halts) en estado q2. Una cadena de entrada es aceptada si existe una computación que procesa toda la cadena de entrada y para en un estado final o aceptador.

43 Diagramas de Estado El diagrama de estado de un AFD es un grafo dirigido-etiquetado en el cual los nodos representan los estados de la máquina y los arcos son obtenidos de la función de transición. Otra definición es la siguiente: El diagrama de estado de un AFD M = (Q, q 0, F) es un grafo etiquetado G definido por las sig. condiciones: i)Los nodos de G son los elementos de Q. ii)Las etiquetas sobre los arcos de G son elementos de iii)q 0 es el nodo inicial, representado con > iv)F es el conjunto de nodos aceptadores; cada nodo acaptador se representa con

44 v) Existe un arco desde nodo q i a q j etiquetado a si (q i,a)=q j. vi)Por cada nodo q i y símbolo a es miembro de existe exactamente un arco etiquetado a que sale de q i. Ejemplo: El diagrama de estados para el DFA del ejemplo anterior: a b q0q0 q1q1 q2q2 a,b b a

45 Ejemplo: El DFA siguiente acepta el lenguaje que no contiene la subcadena aa y donde ={a,b}. q0q0 q1q1 q2q2 a,b a b a b

46 Ejercicios: 1.Sea M un AFD M: Q = {q 0, q 1, q 2 } a, b} F = {q 2 } a b q 0 q 1 q 2 q 1 q 2 q 0 a)Realizar el diagrama de estados de M. b)Hacer las computaciones de M que procesan las cadenas abaa bbbabb Bababa c)¿Cuál de las cadenas anteriores son aceptados por M? d)Escribir la expresión regular para L(M)

47 Ejercicios: 2. Construye AFD en forma de diagrama de estados que acepte el lenguaje descrito: El conjunto de cadenas para alfabeto {a,b} en donde la subcadena aa ocurra al menos dos veces. El conjunto de cadenas para alfabeto {a,b,c} que comienzan con a, contienen exactamente dos b´s y terminan con cc. (ab)*ba (ab)*(ba)*

48 3.2 Autómatas Finítos No determinísticos (AFN) La diferencia es el no determinismo de esta clase de autómatas. Esto se manifiesta en la función de transición que en los AFD significa moverse de un estado a otro bajo un símbolo de entrada. En un AFN la función de transición también contempla lo anterior, pero además contempla otras dos transiciones: moverse de un estado a varios estados bajo una sola entrada o símbolo; y moverse de un estado a otro bajo no entrada o símbolo. Estas tres transiciones se dan como: a qnqn qiqi a a a qnqn qiqi qjqj qnqn

49 La relación entre AFD y AFN se sumariza con la siguiente frase: Cada AFD es AFN. La función de transición de un AFD especifíca exactamente que con una entrada solo se puede ir a un estado. Mientras en un AFN con una entrada se puede ir a cero, uno o mas estados. Esto quiere decir que la familia de AFDs es un subconjunto de los AFN. Una cadena de entrada para un AFN puede generar distintas computaciones. En unos casos el automata para (halt) sin aceptar la cadena, en otros la rechaza o las acepta.

50 Ejemplo: El AFN M para la cadena ababb con tres diferentes computaciones. M: Q = {q 0, q 1, q 2 } a, b} F = {q 2 } a b q 0 {q 0, q 1} q 1 0 q [q 0,ababb] -[q 0,babb] -[q 0,abb] -[q 0,bb] -[q 0,b] -[q 0, ] [q 0,ababb] -[q 0,babb] -[q 1,abb] [q 0, ababb] -[q 0, babb] -[q 0, abb] -[q 0, bb] -[q 1, b] -[q 2, ]

51 La primera computación procesa toda la entrada y para en un estado de rechazar. La segunda computación, para (halt) después de ejecutar tres instrucciones ya que no existe acción cuando la máquina esta en estado q 1 y leyendo una a. Por último, la tercera computación acepta la entrada. Una cadena de entrada es aceptada si existe una computación que procesa toda la cadena de entrada y para en un estado final o aceptador. Una cadena de entrada está en el lenguaje de un AFN si existe una computación que lo acepte. El lenguaje de un AFN M, denotado L(M), es el conjunto de cadenas aceptadas por M.

52 El diagrama de estados para el AFN del ejemplo anterior es el siguiente: q0q0 q1q1 q2q2 a,b b b El diagrama aceptado por este último AFN es (a | b)*bb Es AFN porqué existen dos transiciones de q 0 a q 0 y de q 0 a q 1 ante una misma entrada: b

53 El siguiente diagrama de estados para un AFN acepta el lenguaje expresado por (ab)* | a* a q0q0 q1q1 q2q2 b a a q3 a Es AFN porqué existen dos transiciones de q 0 a q 1 y de q 0 a q 3 ante una misma entrada: a

54 Transiciones Lambda Las transiciones de estado a estado en AFD y AFN se llevan a cabo al procesar o leer un símbolo de entrada. Podemos también redefinir a un AFN de tal manera que admita transiciones de estado a estado sin leer un símbolo de entrada. Una transición de esta forma es llamada transición lambda. A este tipo de máquinas se les llama AFN- Por medio de movimientos lambda se puede construír máquinas complejas a partir de máquinas mas simples. La definición de halting (cuando parar) se extiende para incluir la posibilidad que una computación puede continuar usando transiciones lambda después de que toda la cadena de entrada ha sido leída. También se pide, al igual que en los anteriores autómatas, que termine en un estado final, esto para finalizar el AFN- con éxito.

55 M1M1 q 1,0 Q 1,1 Q 1,2 a,b b b Ejemplo: Sea M1 y M2 las siguientes máquinas que aceptan los lenguajes descritos por (a | b)*bb (a | b)* y (b | ab)* (a | l). Q 2,0 Q 2,1 b a b M2M2 Podemos construír máquinas compuestas combinando los doagramas de estado M 1 y M 2.

56 a,b q 1,0 Q 1,1 Q 1,2 b b a,b Q 2,0 Q 2,1 b a b El lenguaje del AFN- M es L(M 1 ) U L(M 2 ) Una computación en la máquina M comienza siguiendo un arco lambda a un estado inicial de M 1 o M 2.

57 Ejemplo: Un AFN- M que acepta L(M 1 ) L(M 2 ), la concatenación de dos lenguajes se construye juntando las dos máquinas con un arco lambda. M1M1 q 1,0 Q 1,1 Q 1,2 a,b b b Q 2,0 Q 2,1 b a b M2M2 Una cadena de entrada es aceptada solo si consiste de una cadena de L(M 1 ) seguido de una cadena de L(M 2 ).

58 3.3 Equivalencia de AFN y AFD Tres clases de autómatas finitos se han estudiado. En esta sección demostraremos que los tres tipos de autómatas aceptan el mismo tipo de lenguajes; mejor dicho, el lenguaje aceptado por un AFN- es aceptado por un equivalente AFN y también por un equivalente AFD. Demostraremos como a un AFN- y aun AFN le podemos quitar su no determinismo mediante la construcción de un AFD equivalente.

59 q2q2 Q3Q3 Q 4, Q5Q5 a a q1q1 Q6Q6 En la figura anterior las transiciones de el estado q 1 ante entrada a son el conjunto {q 2, q 3, q 5, q 6 }. Esto debido a que podemos alcanzar o llegar a esos estados desde el estado q 1 y solo leyendo a. Al estado q 4 llegamos leyendo solo.

60 La función de transición t de un NFA- es una función un poco diferente a la función de transición de un AFD o un AFN. En la función t, las transiciones ante son válidas para moverse de un estado a otro y juntándola con una entrada del alfabeto. Ejemplo: Las tablas de transición siguientes ejemplifican las funciones de transición y t para el siguiente AFN- diagrama de estado M. El lenguaje de M es a + c*b*.

61 a b c q 0 {q 0, q 1, q 2 } 000 q 1 0 {q 1 }0 q 2 0 0{q 2 }{q 1 } t a b c q 0 {q 0, q 1, q 2 } 00 q 1 0 {q 1 }0 q 2 0 {q 1 }{ q 1, q 2 } ab a a c q0q0 q1q1 q2q2

62 La función de transición t es usada para construir un autómata finito determinístico equivalente. El procedimiento usa el diagrama de estados de el AFN- para construir el diagrama de estados de el equivalente AFD. Ejemplo: Construir un AFD equivalente para el siguiente AFN-. ab a a c q0q0 q1q1 q2q2

63 ab a a c q0q0 q1q1 q2q2 t a b c q 0 {q 0, q 1, q 2 } 00 q 1 0 {q 1 }0 q 2 0 {q 1 }{ q 1, q 2 } {q 1 }0 0 { q 1, q 2 }0{q 1 }{ q 1, q 2 } {q 0, q 1, q 2 } {q 1 }{ q 1, q 2 } Su correspondiente diagrama de estados: Se crean tres nuevos estados a los cuales se les aplica el mismo procedimiento para obtener hacia que estados se moverá. Este procedimiento termina hasta que no hay no se genere un nuevo estado

64 t a b c q 0 {q 0, q 1, q 2 } 00 q 1 0 {q 1 }0 q 2 0 {q 1 } { q 1, q 2 } {q 1 }0 0 { q 1, q 2 }0{q 1 }{ q 1, q 2 } {q 0, q 1, q 2 } {q 1 }{ q 1, q 2 } {q 0 } {q 0, q 1, q 2 } {q 1, q 2 } {q 1 } 0 a a b b,c a,c a,b,c a b c b c A partir del diagrama de estados se puede construir el AFD equivalente.

65 El AFN M acepta el lenguaje a + b +. Procedemos a convertirlo a un equivalente AFD. a q2q2 q1q1 q0q0 a b M: {q 0 } {q 0, q 1 } a {q 1, q 2 } b ø a, b b ba M: aa

66 Las máquinas M 1 and M 2 aceptan a(ba)* and a* respectivamente. M1:M1: q1q1 q2q2 a b M2:M2:q3q3 a

67 Usando arcos lambda para conectar un nuevo estado inicial a los estados iniciales de las máquinas originales creamos un NFA- M que acepta a(ba)* | a*. q0q0 M: q1q1 q2q2 a b q3q3 a

68 La función de transición para M es t a b q 0 {q 2, q 3 }0 q 1 {q 2 }0 q 2 0{q 1 } q 3 {q 3 }0

69 El equivalente AFD obtenido es {q 0, q 1, q 3 } {q 2, q 3 } {q 3 } {q 1 } {q 2 } aa b b ø b b b a a,b a

70 3.4 Propiedades de los Lenguajes aceptados por un Autómata Finito. Cada autómata finito con alfabeto acepta un lenguaje para Podemos probar que la familia de lenguajes aceptados por un autómata finito consiste precisamente de los conjuntos o lenguajes regulares para. Primero demostramos que cada conjunto o lenguaje regular es aceptado por algún AFN- La demostración va de acuerdo a una definición recursiva. Los lenguajes o conjuntos regulares se construyen a partir de los elementos básicos 0 (conjunto o estado vacío), (cadena vacía) y conjuntos individuales que contienen elementos del alfabeto.

71 Los diagramas de estado para las máquinas que aceptan dichos conjuntos son: q0q0 q0q0 q0q0 q1q1 q1q1 q1q1 a

72 Conjuntos regulares se construyen de los elementos básicos usando unión, concatenación y operación Kleene Star. Al igual que los conjuntos regulares, autómatas finítos mas complejos se pueden construir a partir de los diagramas anteriores y que acepten la unión, concatenación y operación Kleene Star de lenguajes regulares. Ejemplo: El lenguaje L(M 1 ) U L(M 2 ) es aceptado por la máquina siguiente: SM 1 FM 1 SM 2 FM 2 S M1M1 M2M2 F

73 La concatenación de dos lenguajes L(M 1 ) L(M 2 ) regulares puede ser aceptado por la máquina siguiente: SM 1 M1M1 FM 1 SM 2 M2M2 FM 2 Una máquina que acepta L(M1)* es la siguiente: S SM 1 M1M1 FM 1 F

74 CONCLUSION Usando los autómatas finitos anteriores podemos construir una máquina para cualquier expresión regular que describa a un lenguaje o conjunto regular. Por lo tanto, la conclusión es de que la familia de lenguajes aceptados por una máquina o autómata finito son del tipo regular. Ejercicio: Construir un AFN- que acepte el lenguaje denotado por (a|b)*ba. ab

75 ba a b (a|b) ba

76 b a (a|b)*

77 b a ba (a|b)*ba

78 3.5 Autómatas Finitos y Expresiones Regulares. Los lenguajes regulares son definidos por medio de expresiones regulares y aceptados por medio de autómatas finitos. Podemos establecer que un lenguaje es regular si Es una expresión regular bajo un Es aceptado por un AFD, AFN o AFN- Es generado por una gramática regular. En cuanto a las expresiones regulares y autómatas, hemos ya comprobado en la sección anterior que podemos construir un autómata finito para cualquier expresión regular dada. Por otra parte existen métodos para producir una expresión regular a partir de un autómata finito.

79 3.6 Determinación de lenguajes regulares y no regulares. Dado el lenguaje {a i b i | i<=n} ¿podemos construir un AFD que acepte dicho lenguaje? El siguiente AFD acepta dicho lenguaje pero está incompleto. a a a a b b b b bb b

80 El AFD anterior está incompleto puesto que es imposible construir un AFD para un lenguaje que no es regular. De hecho dicho lenguaje es del tipo contexto libre, o es un lenguaje no regular. Se puede demostrar que un lenguaje es regular al construir un autómata finito que lo acepte. Pero para demostrar que no es regular necesitamos usar otras técnicas (e.g. Pumping lemma) que veremos en otro capítulo.

81 4. AUTOMATAS DE PUSH- DOWN Los lenguajes regulares se caracterizan por ser lenguajes generados por gramáticas regulares y aceptados por autómatas finitos. En este capítulo estudiaremos un tipo de máquina usada para aceptar lenguajes de contexto libre. Esta máquina recibe el nombre de autómata de push-down (APD).

82 4.1 Definición. Un Autómata de Push-Down (APD) es una máquina de estado finíto aumentada o extendida con una pila de memoria externa. La adición de la pila al autómata le proporciona a este un medio de almacenamiento de memoria LIFO (last-in, first-out). Esta combinación de pila con estados le da la posibilidad a un APD de aceptar lenguajes como {a i b i | i>=0}. Un APD es un sextuple (Q, q 0, F), donde Q es el conjunto finito de estados, es un conjunto finito de el alfabeto de entrada, es un conjunto finito llamado el alfabeto de la pila, q 0 es el estado inicial, F (un subconjunto de Q) es el conjunto de estados finales y es la función de transición de Q x ( U { x ( U { }) a subconjuntos Q x ( U { }).

83 Un APD consulta el estado actual, el símbolo de entrada y el el símbolo en el tope de la pila para determinar la transición en la máquina. La función de transición lista todas las posibles transiciones dada una determinada combinación de estado, símbolo y tope de la pila. El valor de la función de transición (q i,a,A) = {[q j,B], [q k,C]} Indica que dos transiciones son posibles cuando el autómata esta en estado q i y leyendo una a con A en el tope de la pila. Si tomamos la primera opción [qj,B],esto causará que la máquina cambie de estado q i a estado q j procese el símbolo a (leer el siguiente símbolo) Remover A del tope de la pila Meter B dentro de la pila Un APD también puede representarse por medio de un diagrama de estados (nuestros ejemplos los utilizaran).

84 La transición (q i,a,A) = {[qj,B]} es representada por a A/B qiqj El símbolo / representa reemplazo (reemplazar A en el tope de la pila por B). El dominio de la función de transición permite transiciones lambda en el símbolo de entrada y en el tope de la pila.

85 Ejemplo: (q i,,A) = [q i, ] (q i,, ) = [q i, A] (q i,a, = [q j, ] A/ qiqi qiqi qiqi qjqj a *Pop una A *Push una A *Lee una a

86 4.2 Lenguajes aceptados por un Autómata de Push-Down La adición o extensión al autómata finíto al manejar una pila (APD) le permite a este ser un aceptador no solo de lenguajes regulares sino también de lenguajes de contexto libre. Esto nos permite establecer que existe una correspondencia entre un APD y una gramática de contexto libre. Lo anterior es demostrable y la forma de hacerlo es por medio de ir construyendo un APD a partir de cada producción de una gramática de contexto libre. Para cada regla existe una transición dentro del APD. Por otra parte un APD podría implementarse con puras transiciones de leer los símbolos de entrada pero sin movimientos en la pila ( ). Esto nos daría una máquina similar a un autómata finito la cual obviamente va a aceptar cualquier gramática regular.

87 4.3 APD determinístico. Un APD es determinístico si existe no mas de una transición que es aplicable por cada combinación de estado, símbolo de entrada y tope de la pila. A continuación construimos un APD M determinístico para aceptar el lenguaje {a i b i | i>=0}. M:Q = {q 0,q 1 } a,b} = {A} F = {q 0,q 1 } (q 0,a, ) = {[q 0, A]} (q 0,b, A) = {[q 1, ]} (q 1,b, A) = {[q 1, ]} q0q0 q1q1 b a /Ab A/

88 Ejercicios: Construir un APD que acepte el lenguaje {wcw R | w es un miembro de {a,b}*}. Construir un APD que acepte el lenguaje {a i c j b i | i,j>=0}. Construir un APD que acepte el lenguaje {a i b j c k | i+k=j}.

89 4.4 APD y Gramáticas de Contexto Libre Podemos probar que cada lenguaje libre de contexto es aceptado por un APD. Para llevar a cabo esto, las reglas de la gramática se usan para generar las transiciones de un APD equivalente. Sea L un lenguaje libre de contextos y G una gramática para ese lenguaje en forma normal de Greibach. En esta forma de Greibach todas las producciones de una gramática tienen una de las siguientes formas: A aA 1 A 2 ….A n A a A La gramática G en forma de Greibach que acepta {a i b i | i>=0} es usada para ilustrar la construcción de un APD equivalente.

90 G:S aAB | aB A aAB | aB B b El APD tiene dos estados: un estado inicial q 0 y un estado aceptador o final q 1. Una regla S de la forma S aA 1 A 2 …A n genera una transición que procesa el símbolo terminal a, mete (push) las variables A 1 A 2 …A n a la pila y se mueve al estado q 1. El resto de las operaciones usan el símbolo de entrada y el tope de la pila para determinar la transición apropiada. La función de transición de el APD es definido directamente de las reglas de G. (q 0,a, ) = {[q 1,AB], [q 1,B]} (q 1,a,A) = {[q 1,AB], [q 1,B]} (q 1,a,B) = {[q 1, ]} Por otra parte es también posible construír una gramática de contexto libre a partir de un APD.

91 5. MAQUINAS DE TURING La máquina de Turing nos proporciona muchas de las características comúnmente asociadas con una computadora moderna. De hecho, la máquina de Turing fue el modelo utilizado para diseñar y construir la primer computadora de programa almacenado. Esta máquina utiliza una secuencia de operaciones elementales para acceder y alterar una posición de memoria. A diferencia de una computadora, una máquina de Turing no tiene un límite de memoria o de tiempo para realizar un cálculo. Por último, la máquina de Turing representa lo máximo dentro de los dispositivos de computación abstractos.

92 5.1 Definición de Máquina de Turing. Una máquina de Turing es una máquina de estado finíto en donde en una transición se escribe un símbolo en la cinta (tape). La cabeza de la cinta puede moverse en cualquier dirección, permitiendo que la máquina lea y manipule la entrada tantas veces como se desee. Mas formalmente, una máquina de Turing es un quintuple M = (Q,, q0) donde Q es un conjunto finito de estados, es un conjunto finito llamado el alfabeto de la cinta y contiene un símbolo especial B que representa un blanco, es un subconjunto de – llamado el alfabeto de entrada, es una función parcial de Q x a Q x x {L,R} llamado la función de transición y q 0 (miembro de Q) es un estado distinguido llamado estado inicial.

93 5.2 funcionamiento de la máquina de Turing. La cinta de una máquina de Turing se extiende indefinidamente en una dirección. Las posiciones de la cinta están numeradas por los números naturales siendo la posición mas a la izquierda la número cero. q …. Una computación comienza con la máquina en estado q 0 y la cabeza de la cinta leyendo la posición mas a la izquierda. La entrada, una cadena de se escribe en la cinta comenzando en posición uno. Posición cero y el resto de la cinta es asumido que están iniciadas con blancos.

94 El alfabeto de la cinta proporciona símbolos adicionales que pueden ser usados durante la computación. Una transición consiste de tres acciones: cambiar el estado, escribir un símbolo en el cuadro leído por la cabeza de la cinta y mover la cabeza de la cinta. La dirección del movimiento de la cabeza de la cinta puede ser a la izquierda (L) o a la derecha (R). La configuración de la máquina q1q1 …. x y transición q i,x) = [q j,y,L] se combinan para producir la nueva configuración

95 qjqj y La transición cambió el estado de q i a q j, reemplazó el símbolo x con y y movió la cabeza de la cinta un cuadro a la izquierda. Una máquina de Turing halts (termina) cuando encuentra un estado (par de símbolos) para los cuales no existe definida una transición. Esto es una terminación normal. Una transición de la posición cero en la cinta puede especificar un movimiento a la izquierda de los límites de la cinta. Cuando esto ocurre, la computación se dice termina anormalmente.

96 Máquina de Turing Standard Son diseñadas para ejecutar computaciones en cadenas del alfabeto de entrada. Una computación comienza con la cabeza de la cinta leyendo el cuadro mas a la izquierda y la cadena de entrada posición uno. Todos los cuadros a la derecha de la cadena de entrada es asumido están en blanco. Ejemplo: La función de transición de una máquina de Turing standard con alfabeto de entrad {a,b} es mostrada a continuación. La transición del estado q 0 mueve la cabeza de la cinta a posición uno para leer la entrada. Las transiciones en estado q 1 leen la cadena de entrada e intercambian los símbolos a y b. Las transiciones en q 2 retornan la máquina a la posición inicial.

97 Bab q0q0 q 1,B,R q1q1 q 2,B,Lq 1,b,Rq 1,a,R q2q2 q 2,a,Lq 2,b,L Una máquina de Turing puede representarse gráficamente por un diagrama de estados. Ejemplo (tabla anterior): Intercambia as y bs en la cadena de entrada. B/B R B/B L a/b R b/a R b/b L a/a L q0q0 q1q1 q2q2

98 Ejemplo: La siguiente Máquina de Turing con alfabeto de entrada {a,b} produce una copia de la cadena de entrada. Esto quiere decir que una computación que comienza con la cinta teniendo la forma BuB termina con la cinta BuBuB. B/B R a/X R B/B L X/a L Y/b L a/a R b/b R b/Y R a/a R b/b R B/B R B/b L a/a R b/b R B/B R b/b R a/a R B/a L X/X R Y/Y R a/a L b/b L B/B L COPY:q0q0 q1q1 q2q2 q3q3 q4q4 q5q5 q6q6 q7q7

99 Ejercicios: Construir una máquina de Turing para mover la entrada un espacio a la derecha. La configuración de entrada q 0 BuB resulta en q f BBuB. Construir una máquina de Turing para concatenar una copia de la cadena de entrada en reversa. La configuración de entrada q 0 BuB resulta en q f Buu R B.

100 5.3 Lenguajes aceptados por la máquina de Turing Una máquina de Turing puede ser usada para calcular funciones y para aceptar lenguajes. En el primer caso el resultado de una computación se define in términos del estado en donde termina la computación o la configuración de la cinta. En el segundo caso, una computación acepta o rechaza la cadena de entrada. A diferencia de un autómata finíto o de Push Down, la máquina de Turing no necesita leer toda la cadena de entrada para aceptar la cadena. Una máquina de Turing aumentada con estados finales es un sextuple (Q,,,, q0, F) donde F es un subconjunto de Q y contiene los estados finales.

101 Un lenguaje aceptado por una máquina de Turing es llamado lenguaje recursivamente enumerable. La hablidad de una máquina de Turing para moverse en ambas direcciones y procesar blancos introduce la posibilidad de no parar (halt) ante ciertas entradas. Un lenguaje que es aceptado por una máquina de Turing y que termina (halt) ante todas las cadenas de entrada es llamado lenguaje recursivo. Existen muchas máquinas de Turing que aceptan un lenguaje en particular; algunas pueden parar (halt) para todas las entradas mientras otras no. La existencia de una máquina de Turing que para (halt) con todas las entradas es suficiente para demostrar que el lenguaje es recursivo.

102 B/B R a/a R b/b R q0q0 q1q1 q2q2 Ejemplo: La máquina de Turing acepta el lenguaje (a U b)*aa(a U b)*. La computación para la cadena aabb examina solo la mitad de la entrada antes de aceptar la cadena completa. El lenguaje (a U b)*aa(a U b)* es recursivo; las computaciones en la máquina terminan (halt) para cada cadena de entrada. Una computación exitosa termina cuando una subcadena aa es encontrada. b/b R a/a R q3q3

103 5.4 Ejemplo de mayor fuerza de la Máquina de Turing

104 5.5 Extensiones de la Máquina de Turing Existen variaciones al modelo de la máquina de Turing standard. Cada variación o extensión parece incrementar la capacidad de la máquina, pero la realidad es que los lenguajes aceptados por esas máquinas de Turing extendidas son también aceptados por máquinas de Turing Standard. Máquinas de Turing de Multipistas En este tipo de máquinas la cinta es dividida en varias pistas. Una posición en la multipista-cinta contiene n símbolos del alfabeto de la cinta. qjqj PISTA 1 PISTA 2

105 Una posición en la cinta en una máquina de 2 pistas es representada por un par ordenado [x,y] donde x es el símbolo en pista 1 y y en pista 2. Una transición lee y escribe la posición completa de la cinta y se escribe como: (q i,[x,y]) = [q j,[z,w],d] donde d es {L,R} La entrada es puesta en la pista 1. Todas las posiciones en la pista 2 están en blanco. Aceptación en este tipo de máquinas de Turing es por medio de estado final. Este tipo de máquinas de Turing, al ser equivalentes a la máquina de Turing standard, acepta lenguajes recursivamente enumerables.

106 Máquinas de Turing de dos direcciones (two-way) Este tipo de máquinas es identico a una máquina de Turing standard excepto que la cinta se extiende indefinidamente en ambas direcciones (izquierda y derecha). En este tipo de máquinas la cadena de entrad puede ser puesta en cualquier lugar de la cinta. Todas las demás posiciones de la cinta se asume que están en blanco. q0 …. Se puede colocar un símbolo especial (#) en una posición para que sea el límite de la izquierda (como en una máquina standard). Este tipo de máquinas es también equivalente al de la máquina standard (aceptan Lenguajes Rec. Enumerables).

107 Máquinas de Múltiple Cintas Consiste de k cintas y k cabezas de cintas independientes. Los estados y alfabetos son los mismos que en la máquina standard. La máquina lee las cintas simultáneamente pero solo tiene un estado. CINTA 1 CINTA 2 CINTA 3 qiqi

108 Una transición es determinada por el estado y el símbolo leído por cada cabeza de cinta. Una transición puede cambiar el estado escribir un símbolo en cada cinta independientemente reposicionar cada cabeza de cinta. El reposicionamiento consiste de mover la cabeza de la cinta un cuadro a la izquierda o la derecha o incluso dejar la cabeza en su posición actual. La entrada a la máquina es puesta en la cinta 1. Todas las demás cintas estarán en blanco. Al igual que en las máquinas anteriores este tipo de máquinas acepta lenguajes Rec. Enumerables.

109 5.6 Máquinas de Turing No Determinísticas Estas máquinas pueden especificar cualquier número finito de transiciones para una configuración dada. Los componentes de una máquina no determinística, con excepción de la función de transición, son idénticos a los de una máquina de Turing standard. Las transiciones en una máquina no determinística son definidas por una función de Q x a los subconjuntos Q x x {L,R}. Cuándo una transición indica que mas de una acción es posible, una computación arbitrariamente escoge una de las transiciones. Una cadena de entrada es aceptada por una máquina no determinística si existe una computación que termina en un estado aceptador.

110 5.7 El problema de Halting para las Máquinas de Turing Un problema de decisión consiste de un conjunto de preguntas cuyas respuestas son si o no. Una solución a un problema de decisión es un procedimiento efectivo que determine la respuesta para cada una de las preguntas. Una máquina de turing es un sistema matemático ideal para solucionar problemas de decisión. La teoría de Church-Turing dice que se puede diseñar siempre una máquina de Turing para resolver cualquier problema de decisión que tenga solución por un procedimiento efectivo. Entonces, para establecer que un problema no tiene solución es suficiente con mostrar que no existe solución en una máquina de Turing (Undecidability). El mas famoso de los problemas sin solución (undecidable problem) es el problema de Halting.

111 El problema de Halting se formula de la forma siguiente: Dada una máquina de Turing arbitraria M con alfabeto de entrada y una cadena w que pertenece a, ¿Pararía la computación de M con la entrada w ? Es importante entender la declaración del problema. Debemos ser capaces de determinar si una máquina de Turing en particular parará (halt) con una cadena determinada. Por ejemplo la última máquina de Turing revisada para (halt) con todas las cadenas conteniendo la subcadena aa. Sin embargo, una solución del problema halting requiere un algoritmo general que responda la pregunta de halting que para cada combinación posible de máquina de Turing y cadena de entrada la máquina va a parar.

112 Ejemplo: Tenemos una máquina de Turing H que resuelve el problema de parada Halting. H R(M)w acepta rechaza M hace parada con entrada w M no hace parada con entrada w La entrada consiste de la representación de la máquina de Turing M seguido de cadena w. La computación de M con entrada w hace parada. La máquina H es modificada para construir H. Las computaciones de H son las mismas que H excepto que H se cicla indefinidamente cuando H termina en un estado aceptador. Las transiciones de H son construidas agregandole a H que causan que H se mueva indefinidamente a la derecha cuando H entre a un estado aceptador.

113 H es combinado con una máquina de Turing que copia otra máquina de Turing para formar una nueva máquina D. R(M) ciclo para M para con entrada R(M) M no para con entrada R(M) copy R(M)R(M) H La entrada a la máquina D puede representarse por cualquier máquina Turing. Considera una computación de D con entrada R(D). Entonces tendriamos lo siguiente: R(D) ciclo para D para con entrada R(D) D no para con entrada R(D) copy R(D)R(D) H D D

114 En esta última máquina D, vemos que D hace parada con entrada R(D), si y solo si, D no hace parada con entrada R(D). Esto es una contradicción. Sin embargo, máquina D puede construirse desde máquina H que resuelve el problema de parada. La premisa que el problema de parada tiene solución nos lleva a la contradicción. Podemos concluir que el problema de parada no tiene solución.

115 6. GRAMATICAS Y AUTOMATAS Las gramáticas fueron estudiadas en el capítulo 2 donde se introdujo la clasificación de estas dada por Chomsky. En esta clasificación las gramáticas eran divididas en 4 clases de gramáticas: regulares, de contexto libre, de contexto sensitivo y de estructura de frase o sin restricciones. En esta unidad 6 regresamos a estudiar las tres primeras gramáticas con un poco mas de profundidad.

116 6.1 Lenguajes Regulares. Teorema de Kleene. Este teorema establece que un lenguaje L es aceptado por un AFD con alfabeto si y solo si, L es un conjunto regular para Para demostrar esto haremos uso de dos propiedades: 1.La primera ya explicada durante el tema 3.4, se refiere a que cada conjunto regular es aceptado por algún AFN-. 2.La segunda dice que cada lenguaje aceptado por un autómata finito es un conjunto regular. Y de acuerdo a lo establecido anteriormente sobre la equivalencia de autómatas determinísticos y no determinísticos concluímos con la validez del teorema de Kleene.

117 Para demostrar la segunda afirmación, extenderemos la noción de diagrama de estado. Un grafo de expresión es un grafo dirigido con etiquetas en donde los arcos están etiquetados por expresiones regulares y contiene un nodo inicial y nodos aceptadores o finales. El lenguaje de un grafo de expresión es la unión de los conjuntos representados por las expresiones regulares aceptadas. Los caminos (paths) en un grafo de expresión generan expresiones regulares. Ejemplo: Los sig. grafos aceptan las exp. reg. u* y u*vw*. u u w v

118 Para los grafos anteriores los cuales son muy sencillos es simple determinar las expresiones regulares aceptadas. Existe un procedimiento para reducir un grafo de expresión a una de dos formas simples. Esta reducción se lleva a cabo por medio de repetir remover nodos de el grafo de tal manera que produce la expresión aceptada por el grafo. El diagrama de estados de un autómata finito puede tener cualquier número de estados aceptadores. Cada uno de esos estados exhibe la aceptación de un conjunto de cadenas. El lenguaje de la máquina es la unión de esos conjuntos. Para determinar el lenguaje de un autómata, la observación anterior nos permite considerar los estados aceptadores separadamente.

119 El algoritmo para construir una expresión regular desde un diagrama de estados hace exactamente eso; construye una expresión para un conjunto de cadenas aceptadas por cada estado aceptador individual. Los nodos de un AFN- en el algoritmo se asumen están numerados. La etiqueta de un arco de nodo i a nodo j se denota como w i,j. Si no hay arco de nodo i a j, w i,j = 0.

120 Algoritmo: Construcción de una expresión regular desde un autómata finito. Entrada: Diagrama de estados G de un autómata finito Los nodos de G numerados 1,2,…,n 1.Sea M el número de estados aceptadores de G. Hacer m copias de G, cada una de cual tiene un estado aceptador. Nombra a cada una G 1,G 2,…,G m. Cada estado aceptador de G es el estado aceptador de algún G t, para t= 1,2,….,m. 2.Para cada G t Hacer 2.1 Repetir Escoger un nodo i en G t que no sea ni el nodo incial ni un nodo aceptador de G t Borrar el nodo i en G t de acuerdo al siguiente procedimiento: Para cada j,k no igual a i (esto incluye j = k) Hacer i.Si w j,i <> 0, w i,k <>0 y w i,i = 0 Entonces agregar un arco desde nodo j hasta nodo k etiquetado w j,i w i,k ii.Si w j,i <> 0, w i,k <>0 y w i,i <>0 Entonces agregar un arco desde nodo j hasta nodo k etiquetado w j,i (w i,i )*w i,k iii.Si nodos j y k tienen arcos etiquetados w 1,w 2,….,w s conectandose Entonces reemplazarlos por un solo arco etiquetado w 1 Uw 2 U….W s iv.Remover el nodo i y todos los arcos que inciden en nodo i en G t Hasta que los únicos nodos en G t sean el nodo inicial y un único estado aceptador 2.2 Determinar la expresión aceptada por G t Fin End 3.La expresión regular aceptada por G es obtenida juntando las expresiones para cada G t con U (unión)

121 Ejemplo: b c b c G: b c b c b c b c G1: G2: De G se construyen dos grafos de expresión G1 y G2::

122 Se reduce G1 borrando nodos 2 y 3: b cc b b La expresión aceptada por G1 es b*. Se remueve nodo 2 de G2 y se tiene: b cc b con expresión asociada b*ccb*.

123 La expresión aceptada por G, construida desde las expresiones G1 y G2, es b*| b*ccb*. Y con esto se prueba lo establecido en el teorema de Kleene. Las Aplicaciones del Lema de Pumping El lema de Pumping es usado para demostrar o establecer que un lenguaje no es regular y se basa en ciertas reglas de descomposición que se aplican a las cadenas de los lenguajes regulares. Bombear (Pumping) una cadena se refiere a construir nuevas cadenas repitiendo (bombeando) subcadenas de la cadena original.

124 Ejemplo: M: ba a a b a,b b q0 q1 q2 q3 Considere la cadena z=ababbaaab en L(M). Esta cadena puede descomponerse en subcadenas u, v y w donde u=a, v=bab, w=baaab y z=uvw. Las cadenas a(bab) i baaab son obtenidas al bombear (pumping) la subcadena bab en ababbaaab.

125 El lenguaje L(M) es regular pues producimos un autómata finito para el. Si las cadenas producidas al bomberase la cadena original también pertenecen a L(M), entonces L(M) es regular, si no, entonces L(M) no es regular. El lema de Pumping para lenguajes regulares tiene como objetivo principal demostrar que un lenguaje no es regular. Ejemplo: Para demostrar que L={a i b i | i>=0} no es regular probaremos con una cadena z=a k b k y descomponiendo esta en subcadenas u=a i,v=a j y w=a k-i-j b k, donde i+j 0. Si bombeamos cualquier cadena de esta forma produce uvw=a i a j a j a k-i-j b k, que no pertenece a L. Por lo tanto, ya que z pertenece a L y no tiene descomposición que satisface las condiciones del lema de pumping, concluimos que L no es regular.

126 El Teorema Myhill-Nerode Así como el teorema de Kleene establece la relación entre lenguajes regulares y autómatas finitos, el teorema Myhill- Nerode caracteriza la regularidad por medio de la existencia de una relación de equivalencia en las cadenas del lenguaje. Esta caracterización proporciona un método para obtener un AFD mínimo que acepta un lenguaje. Este teorema se utiliza, al igual que el lema de Pumping, para demostrar que un lenguaje no es regular.

127 6.2 Lenguajes de Contexto Libre Forma Normal de Chomsky. Una gramática de contexto libre está en forma normal de Chomsky si cada regla tiene una de las siguientes formas: A BC A a S Donde B,C son símbolos no terminales y no son símbolo inicial. El árbol de derivación asociado con una derivación en una gramática en forma normal de Chomsky es un arbol binario. Autómata de Push-Down. (tema cubierto en capítulo IV)

128 Compilador de Lenguajes Formales Un compilador es un programa que traduce otro programa escrito en un lenguaje de alto nivel (java, C++, Ada, etc.) produciendo como salida un programa objeto usualmente en código máquina. El compilador para realizar su tarea divide todo el trabajo en varias fases, las cuales pueden ser: Análisis de léxico Análisis de sintaxis Análisis de semántica Generación de código intermedio Generación de código objeto Optimización de código Las dos primeras fases utilizan lenguages formales como especificación de entrada a la fase.

129 Análisis de léxico. En esta fase el compilador descompone el programa fuente en tokens (identificadores, constantes, operadores, etc.) los cuáles son especificados por medio de expresiones regulares. Ejemplo: Identificador = letra (letra | digito)* Número entero = digito digito* Análisis de sintáxis. En esta fase el compilador revisa si los estatutos, expresiones o declaraciones del programa fuente cumplen con las especificaciones definidas por una gramática de contexto libre para el lenguaje siendo compilado. Existen muchas técnicas para implementar un analizador de sintaxis, los cuáles son llamadas Parsers.

130 Ejemplos de Parsers son: Recursivo descendente LL(1) Operador precedencia LR SLR LALR También existen herramientas para producir por medio de especificaciones analizadores de léxico y sintaxis. Algunas de estas herramientas son: Lex Yacc JavaCC Sable


Descargar ppt "LENGUAJES Y AUTOMATAS DR. RAMON ZATARAIN CABADA. INDICE 1.INTRODUCCION 2.GRAMATICAS 3.AUTOMATAS FINITOS 4.MAQUINAS DE TURING 5.GRAMATICAS Y AUTOMATAS."

Presentaciones similares


Anuncios Google