Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Teoría de la Computación para Ingeniería de Sistemas: un enfoque práctico Prof. Hilda Contreras 15 de abril de 2012 2 Índice general 1. Introducción 5 1.1. Marco histórico de la teoría de la computación . . . . . . . . . . . . . . . . . . 5 1.2. Conceptos básicos: Alfabeto, Palabra o Cadena, Lenguaje y Problema . . . . . 7 1.3. Jerarquía de Chomsky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4. Los problemas en la Teoría de la Computación . . . . . . . . . . . . . . . . . . 10 1.5. Preguntas y respuestas, ejercicios resueltos y propuestos . . . . . . . . . . . . . 11 2. Lenguajes Regulares y autómatas �nitos 15 2.1. Autómatas de estados �nitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.1.1. Autómatas �nitos determinista (AFD) . . . . . . . . . . . . . . . . . . . 15 2.1.2. Autómatas �nitos no determinista (AFND) . . . . . . . . . . . . . . . . 19 2.1.3. Autómatas �nitos no determinista con transiciones nulas (AFND-λ) . . 23 2.1.4. Herramientas, implementación y uso de Lenguajes regulares . . . . . . . 29 2.1.5. Preguntas y respuestas, ejercicios resueltos y propuestos . . . . . . . . . 32 3 4 ÍNDICE GENERAL Capítulo 1 Introducción La teoría de la Computación es un poco más antigua que las computadoras electrónicas. Uno de sus pioneros, Alan Turing, pudo anticipar el poder de las computadoras a través de un modelo conceptual en 1936. Otras disciplinas como la matemática, �losofía, lingüística, biología e ingeniería eléctrica intervienen para completar sus teorías. Las teorías de bases son dos: Teoría de Autómatas y Teoría de los Lenguajes Formales. En general, la Teoría de la Computación facilita la comprensión de muchas áreas de la ciencia de la computación (como los compiladores), además: 1. Se utiliza en el diseño y construcción de aplicaciones importantes de software y hardware. 2. Ayuda a comprender que esperar del software. 3. Permite deducir si es posible resolver un problema (determinar los límites de la compu- tación). Además, la comprensión de estas teorías representa en la práctica un conjunto de herramientas muy útiles como alternativas simples y e�cientes para resolver problemas. 1.1. Marco histórico de la teoría de la computación Esta teoría surge a partir de importantes antecedentes del área de las matemáticas, la cual estuvo en una profunda cirsis a �nales del siglo XIX y primera mitad del XX. La lógica y las matemáticas trabajaron juntas en la formalización de la ciencia de la computación, los siguientes hechos son los mas resaltantes: Entre 1910 y 1923, Bertrand Russell elabora el "Principia Matemática"presentando la relación entre la lógica y la matemática pura. En 1928, el matemático alemán David Hillbert, presenta a sus colegas como reto demos- trar tres proposiciones de gran generalidad sobre su ciencia: • La matemáticas son completas. • Las matemáticas son consistentes. • Las matemáticas son decidibles. 5 6 CAPÍTULO 1. INTRODUCCIÓN En 1928, el matemático Ackermann presenta también el problema de la decisión en un estudio sobre la lógica de primer orden. En 1930, el matemático checo Kurt Gödel prueba que las matemáticas no pueden ser completas y consistentes al mismo tiempo (teorema de la Incompletitud). En 1936, el matemático americano Alonzo Church responde negativamente en un artículo al tercer problema propuesto por Hillbert, el problema decisorio (Teorema de Church y λ-cálculo). En ese mismo año 1936, el matemático inglés Alan Turing da una respuesta también negativa a esa tercera cuestión, sus resultados son más consistentes que los obtenidos por Church. La demostración de Turing se basa en principios completamente básicos y elementales. Turing enuncia el problema de decisión de la siguiente forma: "Buscar un algoritmo para determinar si una conclusión particular puede derivarse de ciertas premisas con el uso de reglas de prueba". Da una noción precisa del concepto de algoritmo, como aquello que pueda ser realizado por una máquina abstracta, la Máquina de Turing. De este modo, Alan Turing con su máquina universal capaz de realizar el trabajo de cualquier otra máquina, mediante la lectura de su descripción en una cinta, delinea el diseño de un computardor. En 1969, S. Cook extiende el estudio de Tuning. Cook separa aquellos problemas que pueden ser solucionados de aquellos que en principio pueden ser solucionados pero que en la práctica toman demasiados recursos (Complejidad computacional). En 1937, Claude Shannon presenta su tesis de licenciatura en el MIT, estableciendo el paralelismo entre la lógica de Boole y los circuitos de transmisión. En 1943, McCulloch-Pitts desarrolla unas máquinas simples, en cuanto su funcionamien- to, que fueron conocidas como autómatas �nitos de actividad nerviosa, para modelar el funcionamiento de una neurona biológica. En 1956, Moore publica el primer estudio riguroso sobre autómatas. Con anterioridad, debido al desarrollo de los primeros computadores, se habían estudiado diversos métodos para la síntesis de circuitos secuenciales (Hu�man en 1954 y Mealy en 1955). En los años 60 es donde se realizan la mayor parte de trabajos sobre la teoría de los autómatas �nitos. En 1956, N. Chomsky comienza el estudio formal de las gramáticas (como generadoras de lenguajes). Formaliza matemáticamente los conceptos de gramática generativa o re- glas para la construcción las frases de un lenguaje. Enuncia la teoría sobre el origen y la naturaleza de los lenguajes naturales. Estas herramientas fueron empleadas para la for- malización de los lenguajes de computación: Teoría de los Lenguaje Formales. A �nales de los años 50 se relacionan los autómatas, las gramáticas y los lenguajes (Jerarquía de Chomsky). 1.2. CONCEPTOS BÁSICOS: ALFABETO, PALABRAO CADENA, LENGUAJE Y PROBLEMA7 1.2. Conceptos básicos: Alfabeto, Palabra o Cadena, Lenguaje y Problema La Teoría de la Computación puede entenderse como un paradigma o un enfoque para resolver problemas. Este paradigma tiene los siguientes conceptos básicos sobre los cuales se fundamenta: Alfabeto, Palabra o Cadena, Lenguaje y Problema. Para todas estas de�niciones debe tenerse presente primero el concepto de un Conjunto, como la estructura que las soporta. Conjunto Colección (no importa el orden) de objetos (elementos del mismo tipo) sin repetición. Existen 2 (dos) tipos de representación de los conjuntos: Por Extensión, se enumeran todos sus elementos, por ejemplo: {0, 1} Por Comprensión, se de�ne de manera formal las características de sus elementos, por ejemplo: { i | Para todo j entero i = 2j } El conjunto vacío se representa así: ϕ. La pertenencia de un elemento a un conjunto: A = {0, 1, 2} y 1 ϵ A o también se escribe 1 en A. 1 El subconjunto: A ⊆ B signi�ca que todo elemento de A esta en B. Si A ⊆ B y A ̸= B entonces escribimos A ( B (subconjunto propio). Operadores sobre conjuntos: Unión: A ∪ B = {x | x en A o x en B} Intersección: A ∩ B = {x | x en A y x en B} Diferencia: A - B = {x | x en A y x no está en B} Conjunto Producto ó Producto Cartesiano: A × B {(x,z) | x en A y z en B}. Si A tiene n elementos y B tiene m elementos entonces A × B tiene n × m elementos y A∗ tiene 2n elementos. Conjunto de Potencias 2A ó A∗, es el conjunto de todos los subconjuntos de A. Tam- bién A∗ es denominado Clausura de Kleene de A. Las de�niciones formales son: A∗ = ∪|A| i=0A i y A+ = ∪|A| i=1A i (clausura positiva que no incluye al conjunto vacío). Donde Ai representa todos los subconjuntos de A con i elementos. Ejemplo: Dados los conjuntos A = {1,2} y B = {2,3}, se realizan las siguientes operaciones sobre conjuntos: A ∪ B = {1, 2, 3} A ∩ B = {2} A - B = {1} A × B = {(1,2),(1,3),(2,2),(2,3)} 2A = A∗ = {ϕ,{1},{2},{1,2}} 1 Nota: ϵ es un símbolo que puede ser utilizado por algunos autores para denotar a la cadena vacía. 8 CAPÍTULO 1. INTRODUCCIÓN En la Teoría de la Computación se visualizan las entradas, salidas y procesos de un dominio de aplicación como un tipo de problema particular: resolver la pertenenciade un elemento a un conjunto. El problema, los elementos y el tipo de conjunto que se van a utilizar se de�nen en base a los siguientes conceptos básicos: 1. Alfabeto: Denotado con Σ (sigma). Conjunto �nito de símbolos no vacíos. Por ejemplo: Alfabeto binario Σ = {0,1}. Símbolo: es una entidad abstracta que no se de�ne, por ejemplo números, letras, etc. 2. Cadena (Palabra): secuencia �nita de símbolos pertenecientes a un alfabeto (yuxtapues- tos = uno detrás del otro). Por ejemplo: Cadena binaria "0111001". Sobre las cadenas se de�nen: a) Cadena Vacía λ (lambda): contiene cero (0) símbolos, puede construirse a partir de cualquier alfabeto. b) Longitud de una Cadena: número de posiciones de la cadena ocupadas por símbo- los del alfabeto. Denotado con el pipe |, por ejemplo para el alfabeto binario, las longuitudes de las siguientes cadenas son |01101|= 5 y |λ|=0 c) Concatenación de Cadenas : x y y son cadenas entonces xy denota la concatenación. Por ejemplo: x = 011 y = 1110, la concatenación de xy = "0111110" d) Potencias de un Alfabeto: Conjunto de todas las cadenas formadas a partir de un alfabeto de cierta longitud. Σk Cadenas de longitud k formadas por símbolos del alfabeto Σ. Para el alfabeto binario Σ = {0,1}, Σ2 = {00, 11, 10, 01} Σ∗ Conjunto de todas las cadenas formadas por símbolos del alfabeto Σ. Se de�ne por Σ∗ = Σ0 ∪ Σi. Donde Σ0 = {λ} y Σi = ∪∞ i=1Σ i. Además se denota el Σ+ = Σ∗ − {λ} e) Su�jo, Pre�jo: cualquier cadena al �nal o comienzo respectivamente de la cadena. Por ejemplo para la cadena w=abca, formada de Σ = {a, b, c}, se tiene: Los pre�jos de w= λ, a, ab, abc, abca Los su�jos de w= λ, a, ca, bca, abca f ) Pre�jo (Su�jo) propio, es cualquier Pre�jo (Su�jo) que no sea la misma cadena. 3. Lenguaje: Conjunto de cadenas de símbolos del mismo alfabeto. El lenguaje formado por toda las cadenas posibles de un alfabeto se denota por Σ∗ (Sigma asterisco). ϕ es el lenguaje vacío, es un lenguaje para cualquier alfabeto. {λ} es un lenguaje formado por la cadena vacía. Es un lenguaje para cualquier alfabeto Σ. Por Ejemplo: Σ1 = {0, 1}, Σ2 = {00, 1} 2 Σ∗1 = {λ, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, 100, ... } Σ∗2 = {λ, 00, 1, 001, 100, 0000, 11, 00001, 00100, 10000, 1001, 0011, 111, 000000,... } Las cadenas formadas con Σ2 al aplicarle la cardinalidad: |001| = 2 y |1100| = 3 1.3. JERARQUÍA DE CHOMSKY 9 Figura 1.1: De�nición de Problema en la Teoría de la Computación 4. Problema: consiste en determinar la pertenencia de una cadena sobre un lenguaje. Este tipo de problema es llamado un Problema de Decisión: función con salida binaria (si, no) aplicada sobre conjuntos. Por ejemplo ver �gura 1.1: se de�ne un conjunto A con todas las posibles respuestas y un conjunto B que es subconjunto de A cuyos elementos son positivos (salida si, que pertenecn a B). Expresado en términos de la teoría de la computación, si Σ es un alfabeto y L es un lenguaje de Σ∗, entonces el problema sobre L es el siguiente: Dada una cadena w que pertenece a Σ∗, decidir si ¾w pertenece o no a L? 1.3. Jerarquía de Chomsky Noan Chomsky en los años 50, fue el creador de una jerarquía de lenguajes según las gramáticas que los generan. Esta gramática está organizada en base al poder generativo formal de la gramática y donde se destaca 4 tipos de gramáticas (denominados tipo 0, tipo 1, tipo 2 y tipo 3), cada una de�nida por la clase de reglas que contiene. El cuadro 1.1, muestra una jerarquía implicativa, de modo que los lenguajes de�nidos por gramáticas del tipo-i incluyen los lenguajes del tipo-(i+1). Dicho de otra forma: Tipo 3 ⊂ Tipo 2 ⊂ Tipo 1 ⊂ Tipo 0. Por tanto las gramáticas de tipo 0 son las más poderosas y las de tipo 3 las más restringidas. La Teoría de Autómatas y la Teoría de las Gramáticas formales tienen una estructura similar aunque traten de aspectos diferentes - procedimientos y gramáticas, respectivamente-. Las gramáticas generan un tipo de lenguaje y los autómatas reconocen un tipo de lenguaje, es decir el punto de conexión son los lenguajes. Esta es la razón por la cual se utiliza la jerarquía de Chomsky en la solución de problemas: un problema consiste en determinar si una cadena pertenece a un lenguaje, entonces si se conoce el tipo de lenguaje se puede determinar con que máquina reconocerlo o con cual tipo de gramática generarlo. 2Los símbolos del alfabeto pueden ser de diferentes tamaños 10 CAPÍTULO 1. INTRODUCCIÓN Cuadro 1.1: Jerarquía de Chomsky Tipo Lenguaje Máquina Gramática G = (V,T,P,S) 0 Recursivamente enumerable Máquina de Turing Gramática sin restricciones α → β (α, β en (V ∪ T )∗, α contiene una variable) 1 Dependiente del Contexto Autómata linealmente acotado Gramática sensible al contexto α → β (α, β en (V ∪ T )∗, α contiene una variable, |β| ≥ |α|) 2 Independiente del Contexto Autómata de Pila Gramática libre de contexto A → α (A en V y α en (V ∪ T)∗) 3 Lenguaje Regu- lar Autómata �- nito Gramática Regular A → aB, A → a, (A,B en V y a en T) 1.4. Los problemas en la Teoría de la Computación Teoría de la Computación trata de una teoría o formalismo general, la idea es aplicarla sobre todos los problemas que se pueden calcular en cualquier máquina. La teoría usa modelos de máquinas abstractas, pues no tendría sentido usar las máquinas reales que cambian cons- tantemente en el tiempo y que además son diferentes y complejas. Entonces ¾qué sucede con los problemas?, ¾los problemas también son abstractos?. Lo que se pretende calcular, es decir el Problema o Cálculo, puede ser de cualquier tipo, na- turaleza y condición. Los que han programado han podido resolver, de muchas formas, con un lenguaje de programación múltiples tipos de problemas. Además hay muchos lenguajes de programación e incluso algunos especí�cos para ciertas características de los problemas. Se sabe que los problemas no son iguales, entonces, ¾cómo esta Teoría puede generalizar a todos los problemas para aplicar sus reglas y sus modelos abstractos?. Bien, es lo primero que hay que entender, lo que hace la Teoría de la Computación es formalizar un solo tipo de problema, por tanto se debe convertir, transformar o reducir cualquier problema a lo que se llaman un "problema de decisión". Un problema de decisión es un problema que puede dar una respuesta positiva o negativa (si o no). Un problema de decisión, en términos matemáticos, es equivalente a decidir si un elemento pertenece o no a un conjunto dado. El conjunto equivalente al problema esta formado por los elementos para el cual la respuesta es positiva (si). La �gura 1.2 muestra el esquema general de los problemas. El Entscheidungsproblem [1] (problema de decisión en alemán) se de�ne como "dada una Figura 1.2: Problema de decisión en Teoría de la Computación frase del cálculo de predicados de primer orden, decidir si ella es un teorema", es el problema de 1.5. PREGUNTAS Y RESPUESTAS, EJERCICIOS RESUELTOS Y PROPUESTOS 11 decisión que motivó a Turing y a Church a dar origen a la Teoría de la Computación en 1936. Un ejemplo típico de este tipo de problema es la siguiente pregunta: ¾Es primo un número entero dado?, y una instancia de este problema sería: ¾Es 17 un número primo?. Se trata de entender al 17 como un elemento del conjunto de todos los números enteros y se quiere saber si pertenece al conjunto de los números primos. Lo anterior lleva a la pregunta de si realmente es posible reducir o rede�nir todos los problemas a la forma de un problema de decisión. Para lo cual le sugiero platearse ejemplos e investigar esta posibilidad, pues es en base a esta generalización de problemas sobre la cual funciona la Teoría de la Computación. Esto puede parecer una desventaja, como lo menciona Hopcroft [2]: . . . Un aspecto potencialmente poco satisfactorio de esta de�nición de problema es que normalmente no se piensa en los problemas como cuestiones de decisión (¾es o no verdadero lo siguiente?) sino como solicitudes para calcular o transformar algunos valores de entrada (encontrar la mejor forma para realizar esta tarea). . . Sin embargo, según la computabilidad y complejidad las soluciones al problema de decisión y al problema original se diferencian a lo sumo por un factor lineal y se puede decir que vale la pena esta generalización de los problemas a cambio del formalismo que necesita la Ciencia de la Computación. Esta teoría de la computación entonces va a de�nir los problemas en función de un lenguaje. Justamente, el cuadro 1.1 muestra la jerarquía de Chomsky en donde se relacionan los tipos de lenguajes (problemas) con el tipo de máquina (modelo) que reconoce cadenas que pertenecen a cada tipo y a la gramática (modelo) que genera las cadenas que pertenecen al tipo de lenguaje. Dicha jerarquía estable una relación inclusiva entre los lenguajes, asi, el lenguaje Tipo 3 ⊆ Tipo 2 ⊆ Tipo 1 ⊆ Tipo 0. Esto quiere decir que los lenguajes Tipo 0 son el tipo de lenguaje que abarca a todos los que se pueden resolver a través de una Máquina de Turing (la más poderosa). 1.5. Preguntas y respuestas, ejercicios resueltos y propuestos Preguntas y respuestas 1. ¾Qué es una teoría? [3] Dentro del proceso de producción cientí�ca: Una Teoría es un conjunto de medios de representación conceptual y simbólica (explicativo de los hechos), que tiene además un conjunto de reglas de inferencia que permiten la previsión de los datos de hecho. 2. ¾Qué es una máquina abstracta? Es una máquina que no existe físicamente, pero que ejecuta instrucciones sobre una entrada y produce una salida, habitualmente se han em- pleado en el estudio de la computabilidad. Ejemplos: Autómatas Finitos, Autómatas a Pila, Autómatas linealmente acotados y Máquina de Turing. La computadora que utili- zamos es compleja, cambia con el tiempo, por tanto una teoría basada en especi�caciones de hardware no sería muy útil, por tanto los Modelos de Computación están basados en máquinas abstractas. (matemática). 3. ¾Qué es el poder de una máquina abstracta?, ¾qué signi�ca que una máquina sea más poderosa que otra?. En el contexto de la Teoría de la Computación, una máquina es 12 CAPÍTULO 1. INTRODUCCIÓN poderosa en la medida que soluciona problemas sin importar como lo hace (no importa la e�ciencia en tiempo y recursos, sino su efectividad en lograr resolver el problema). En los términos del paradigma, si una máquina reconce lenguajes más complejos será más podedora, según la Jerarquía de Chomsky la máquina que reconoce el lenguaje tipo 0 es la más poderosa. Ejercicios resueltos 1. Diferencia entre el operador clausura de Kleene aplicado sobre un conjunto y sobre un alfabeto. Por ejemplo: El conjunto A = {a,b} cuál es el A* y para el alfabeto B = {a,b} cuál es B*. La diferencia se debe a que el operador estrella o clausura de Kleene es polimór�co. Aunque A y B son el mismo conjunto, se interpretan de forma diferente para el operador. En el caso de A es un conjunto de elementos y A* es el conjunto de todos sus subconjuntos, A es �nito y A* también, A* = {ϕ, {a}, {b}, {a, b}}. En el caso de B, es interpretado como un alfabeto, es decir un conjunto �nito de símbolos. Aplicando el mismo operador a B nos dá un conjunto in�nito, B* = {λ, a, b, aa, ab, ba, bb, aaa, aab, aba, ... } (se está formando el conjunto de todas las cadenas, incluyendo la cadena vacía, que se puede formar con el alfabeto B). 2. Considere el proceso de compilación de un programa escrito en un lenguaje de pro- gramación. Identi�que el alfabeto, cadena, lenguaje y problema según la Teoría de la Computación. El problema de la compilación de un programa escrito en algún lenguaje de programación puede ser visto a través del paradigam de lenguajes formales que contiene la Teoría de la Computación. El compilador no es más que un sistema que es capaz de ver si una en- trada (el código fuente) esta bien escrito y sigue las reglas del lenguaje de programación que está reconociendo. Es decir, el compilador es una máquina reconocedora de textos (códigos fuente) que pertenecen al conjunto de todos los códigos escritos en un lenguaje de programación. De esta forma se de�nen: El alfabeto Σ: es el conjunto de símbolos que puede escribirse en un teclado de computador con el cual puede escribirse texto (caracteres alfanuméricos, caracteres especiales, espacio, etc.). Cadena de entrada w: La entrada del compilador visto como una máquina reco- nocedora, no es más que cualquier texto que podamos escribir con el teclado del computador (es decir con Σ). Cada cadena w se puede generar concatenando ele- mentos de Σ, de esta maneras tenemos in�nitas cadenas (textos)y entonces Σ∗ es in�nito. El lenguaje L: es el subconjunto de Σ∗ formado por las cadenas (texto) que siguen las reglas de un lenguaje de programación especí�co. El compilador reconoce un lenguaje L in�nito pues las reglas de un lenguaje de programación (aunque son �nitas) permiten escribir in�nitos programas que formarían parte de L. El problema P: El compilador resuelve un problema de decisión al determinar si un texto de entrada compila o no. Decir que un texto compila signi�ca que pertenece al lenguaje L de todas los posibles e in�nitos códigos que pueden escribirse en 1.5. PREGUNTAS Y RESPUESTAS, EJERCICIOS RESUELTOS Y PROPUESTOS 13 el lenguaje de programación. Decir que un texto o cadena de entrada en Σ∗ no compila es decir que no pertenece a L, es decir que no sigue las reglas del lenguaje de programación. Comentario: Evidentemente, el compilador es un sistema que además de resolver el pro- blema de decisión aporta como valor agregado un listado de errores en el caso de no poder compilar y el código objeto en el caso de compilar. El problema P (compilación), es un problema de pertenencia de un conjunto: ¾pertenece el programa w al conjunto in�nito de programas L escritos en un lenguaje de programación particular?. Si L fuese �nito resultaría sencillo de resolver, pero como afortunadamente (para quienes programan) L es in�nito (se pueden escribir in�nitos programas utilizando un lenguaje de programación) se debe buscar el modelo �nito de L que permita reconocer un programa bien escrito en un lenguaje de programación dado. Este modelo �nito es justamente lo que la Teoría de la Computación permite hacer. Ejercicios propuestos 1. ¾Qué es un lenguaje formal?, Diferencia con los lenguajes naturales 2. Contestar verdadero (V) o falso (F): a) Σ∗ es un lenguaje formado por el alfabeto. b) La clausura de Kleene Σ∗ sobre el alfabeto Σ puede ser en algunos alfabetos un conjunto �nito. c) Dado el alfabeto Σ = {a,b} y ∆= {0,1}, la cadena w = a1b0 pertenece al alfabeto Σ ∪ ∆ d) Según la Jerarquía de Chomsky un lenguaje esta asociado un nivel de clasi�cación de problemas asociado a una máquina e) Un algoritmo es el conjunto de instrucciones que puede calcular f ) No existe un lenguaje in�nito L en el alfabeto Σ = {a,b} para el cual L sea diferente a L* (L ̸= L*) 3. Sea A, B y C lenguajes de un alfabeto Σ. En cada una de los ítems siguientes se indican la expresión de 2 lenguajes. Señale si son siempre iguales y justi�que (indique contraejemplos en caso de ser apropiado) a) A (B ∪ C) y AB ∪ AC b) A*B* y (AB)* 4. Enumere al menos 5 lenguajes (que no sean lenguajes de programación o idiomas) que haya utilizado. Para cada uno de ellos identi�que el alfabeto y de ejemplo de una cadena del lenguaje, describa el lenguaje. 14 CAPÍTULO 1. INTRODUCCIÓN Capítulo 2 Lenguajes Regulares y autómatas �nitos Los lenguajes regulares, de tipo 3 según la jerarquía de Chomsky, son aquellos que son reconocidos por autómatas de estados �nitos, son denotados por expresiones regulares y generados por gramáticas regulares. Estos lenguajes contienen a todos los lenguajes �nitos generados a partir de cualquier alfabeto. Los lenguajes in�nitos tipi�cados como regulares poseen ciertas propiedades que lo caracterizan y distinguen de otros lenguajes más complejos (ver tema sobre las propiedades y algoritmos de decisión de los lenguajes regulares). 2.1. Autómatas de estados �nitos Los Autómatas de Estados Finitos (AF): Describen, reconocen y de�nen a los LenguajesRegulares. Es el modelo matemático de un sistema con estados y salidas discretas. Los Tipos de Autómatas Finitos son: 1. Autómata Finito Determinista (AFD). No pueden estar en más de un estado simultá- neamente. 2. Autómata Finito No Determinista (AFN). Puede estar en varios estados al mismo tiempo. 2.1.1. Autómatas �nitos determinista (AFD) Un AFD es una quíntupla A = (Q , Σ, δ, q0, F), siendo: Q = conjunto �nito de estados. Σ = conjunto �nito de símbolos del alfabeto. q0 = es el estado inicial (denotado con �echa → a inicio) F = conjunto de estados �nales (o estados de aceptación), F ⊆ Q δ = La función de transición entre estados, δ: Q x Σ → Q. 15 16 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS En los AFD debe cumplirse que: Para toda a que esta en Σ existe exactamente una transición de salida de cada estado, es decir la función de transición dado un estado y un valor de entrada se obtiene como resultado siempre un solo valor (estado). Las siguientes son las tres formas para expresar y representar la función de transición, las cuales son equivalentes entre si, cualquiera de ellas es su�ciente para completar el diseño del AFD: 1. Diagrama de Transición: representado a través de un grafo. Un grafo G = (V,E) consiste de un conjunto �nito de vértices (o nodos) V y un conjunto �nito de pares de vértices (o aristas) E llamados enlaces (los cuales son bidireccionales). Un camino en un grafo es una secuencia de vértices V1, V2, ... , Vk, con k ≥ 1, tal que hay un enlace (Vi,Vi+1) con 1 ≤ i ≤ k. La longitud del camino es k-1. Si V1 = Vk entonces el camino es un ciclo. Una clase de grafo dirigido Dígrafo G =(V,E), consiste en un conjunto �nito de vértices V (o nodos) y un conjunto �nito de pares ordenados de vértices E llamados arcos (una sola dirección). Un arco de v a w se denota como v → w. Un camino en un dígrafo es una secuencia de vértices V1, V2, ... , Vk, con k ≥ 1, tal que Vi → Vi+1 es un arco con 1 ≤ i ≤ k. La longitud del camino es k-1. El camino es de V1 a Vk (importa la dirección). Si v → w es un arco entonces v es predecesor de w y w es sucesor de v. Ejemplo: Dado el Grafo G = ({1,2,3,4}, {i → j | i < j }) 1,2,3,4 es un camino de longitud 3 de 1 a 4. 1,4 es un camino de longitud 1 de 1 a 4. 3,3 no es un camino. 3 es un camino de longitud 0 de 3 a 3? Por notación, dado un AFD si p y q estan en Q y a en Σ, se de�ne la transición δ(q,a) = p. como un arco (enlace) etiquetado a entre el estado (vértice) q y el estado (vértice) p. Los estados o vértices de aceptación se denotan grá�camente con un doble círculo. Por ejemplo si r esta en F debe ser denotado con doble círculo como se observa en la �gura 2.1. Figura 2.1: Ejemplo de transición en AFD 2. Función de transición: representada a través de una función. Una función asigna a cada elemento de un conjunto (Conjunto Dominio) un elemento de otro conjunto (Conjunto Rango o Codominio). Así la función f se denota f : A → B, siendo A el dominio y B el rango. Por ejemplo, la siguiente función f(x)= x2, se de�ne f: N → N, donde N es el conjunto de los números naturales. Los tipos de funciones son: Inyectiva: Si a1 ̸= a2, entonces f(a1) ̸= f(a2) 2.1. AUTÓMATAS DE ESTADOS FINITOS 17 Cuadro 2.1: Estructura de la Tabla de Transición δ Símbolos de Σ Estados Estados Sobreyectiva: Si todo elemento de B es imagen de alguno de A, es decir la función inversa 1 f−1(b) ̸= ϕ, para todo b en conjunto Rango o Codominio. La función de transición de un AFD esta de�nida como δ: Q x Σ → Q, es decir tiene como dominio cualquier par del producto cartesiano (Q x Σ) del conjunto de estados Q y el alfabeto de entrada Σ, y da como resultado un elemento del conjunto rango de estados Q. En la �gura 2.1 se muestra un ejemplo de una función de transición δ(q,a) = p. 3. Tabla de Transiciones: representada a través de una matriz. La tabla tiene en las columnas todas las entradas del alfabeto Σ y en las �las los estados de Q, por lo que el par FilaxColumna representa el dominio de la función de transición (Q x Σ). Por notación, en la tabla se escriben los estados de aceptación o estados �nales con asterisco al lado del estado y el estado inicial con una �echa. En cada celda interna de la tabla se muestra el resultado de la transición (codominio) es decir el estado Q al cual se realiza la transición dado la �la y la columna de la posición de la celda respectiva. En los AFD cada celda de la tabla debe tener un estado, no se permiten celdas vacias. Ver cuadro 2.1. Ejemplo: Dado Σ = { 0, 1 } y el lenguaje L = { x | x en Σ∗ y x comienza con 0 }, es decir todas las cadenas binarias que comienzan con 0. El AFD que lo reconoce, en sus tres represen- taciones, es el siguiente: M = (Q, Σ, δ, q0, F) Donde Q = {q0, q1, q2}, Σ= {0,1} y F = {q1} 1. Diagrama de transición: se observa en la �gura 2.2. Figura 2.2: Ejemplo de AFD: cadenas binarias que comienzan con cero 1Dada f:A → B, la función inversa f−1:B → A, se de�ne como f−1(b) = {x | x en A y f(x) = b } para todo b en B 18 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Cuadro 2.2: Ejemplo de Tabla de Transición δ 0 1 → q0 q1 q2 *q1 q1 q1 q2 q2 q2 2. Función de transición δ δ(q0, 0) = q1 δ(q0, 1) = q2 δ(q1, 0) = q1 δ(q1, 1) = q1 δ(q2, 0) = q2 δ(q2, 1) = q2 3. Tabla de transición: se observa en el cuadro 2.2 Las tres representaciones del AFD son equivalentes y cada una de ellas es su�ciente para expresar el modelo. Sin embargo, debe enterderse la relación entre ellas aunque se seleccione solo una de ellas para representar al autómata. Ejecución de un Autómatas de estados �nitos determinista (AFD) Para la ejecución formal de un AFD se utiliza la de�nición de la función de transición extendida sobre cadenas δ̂. La de�nición de su dominio y rango es: δ̂ = Q x Σ∗ → Q. La de�nición recursiva de la función δ̂ se de�ne: 1. Caso base para la cadena vacía λ: Para todo q en Q, δ̂(q,λ) = q. Esto quiere decir que desde cualquier estado la cadena vacía λ no cambia el estado del AFD. 2. Caso recursivo para cadenas de cardinalidad mayor que 1: Para todo w en Σ∗ y a en Σ, se cumple que δ̂(q,wa) = δ(δ̂(q,w),a). Por ejemplo: Dado el AFD anterior que reconoce el lenguaje sobre Σ = {0, 1} y L = {x | x en Σ∗ y x comienza con 0}, pruebe si las cadenas w1 = 010 y w2 = 101 están en el lenguaje L: 1. δ̂(q0,010) = δ(δ̂(q0,01),0) = δ(δ(δ̂(q0,0),1),0) = δ(δ(δ(δ̂(q0, λ),0),1),0) → δ(δ(δ(q0, 0), 1), 0) → (δ(q1, 1), 0) → δ(q1, 0) = q1 → Se acepta al terminar de procesar la cadena 010 y quedar en un estado de aceptación δ̂(q0,010) = q1 (q1 está en F) 2.1. AUTÓMATAS DE ESTADOS FINITOS 19 2. δ̂(q0,101) = δ(δ̂(q0,10),1) = δ(δ(δ̂(q0,1),0),1) = δ(δ(δ(δ̂(q0, λ),1),0),1) → δ(δ(δ(q0, 1), 0), 1) → (δ(q2, 1), 0) → δ(q2, 0) = q2 → No se acepta al terminar de pro- cesar la cadena 101 y quedar en un estado que no es de aceptación δ̂(q0,101) = q2 (q2 no está en F) Lenguaje aceptado por un AFD Dado M = (Q, Σ, δ, q0, F) un AFD, el lenguaje L aceptado por M está de�nido por: L(M)= { w | w en Σ∗ y δ̂(q0,w) pertenece a F } Es decir, el lenguaje de M, es un conjunto de cadenas w que llevan al autómata M desde q0 a un estado de aceptación. Si L es un L(M) para algún AFD M, entonces decimos que L es un Lenguaje Regular. Nota importante: Para poder veri�car si la cadena w está (es aceptada) o no está (no es aceptada) en L se debe terminar de procesarse la cadena w (desde el principio hasta el �nal). 2.1.2. Autómatas �nitos no determinista (AFND) Son autómatas de estados �nitos que tienen la capacidad de estar en más de un estado simultáneamente. No hay que considerar todos los casos en cada estado, ya que permiten cero, una o más transiciones de salida de un estado para el mismo símbolo del alfabeto de entrada. Ellos tienen la ventaja de ser más compactos, �exibles y fáciles de diseñar que los AFD. Esta compuesta por la misma tupla de elementos que un AFD A = (Q, Σ, δ, q0, F), la diferencia es la de�nición de la función δ̂ y el rango de la función de transición, δ: Q x Σ → 2Q ó también δ: Q x Σ → Q∗ En la �gura 2.3 se muestra eldiagrama de transición δ(q,a) = {p,r}, donde el AFND dado el estado q y el símbolo a se mueve a dos estados (un conjunto de estados) simultáneamente. Como δ: Q x Σ → Q∗, entonces δ(q,a) = R, donde R ⊆ Q. Figura 2.3: Ejemplo de transición en AFND Ejecución de un Autómatas de estados �nitos determinista AFND Para la ejecución formal de un AFND se utiliza la de�nición de la función de transición extendida sobre cadenas δ̂ : Q x Σ∗ → Q∗, de�nida recursivamente así: 20 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Cuadro 2.3: Tabla de transición: Lenguaje de las cadenas binarias que terminan en 01 δ 0 1 → q0 {q0, q1} {q0} q1 ϕ {q2} *q2 ϕ ϕ 1. Caso base para la cadena vacía λ: δ̂(q,λ) = {q}. Es desde cualquier estado del autómata la cadanea vacía λ no cambia de estado. 2. Paso recursivo para cadenas de cardinalidad mayor que 1: δ̂(q,xa) = { r | para algún p en δ̂(q,x), δ(p,a) = r }. Sea w de la forma w = xa donde a es el símbolo �nal (su�jo de longitud 1) de w y x el resto de w. δ̂(q,x) = {p1, p2, ..., pn} sea ∪k i=1 δ(pi,a) = {r1, r2, ..., rn} Entonces δ̂(q,x) = δ(δ̂(q,x),a) = {r1, r2, ..., rn}, ver �gura 2.4. La extensión para δ̂ de Q∗xΣ: δ̂((P,w) = ∪ qenP δ̂(q,w), para todo conjunto de estados P en Q ∗ Figura 2.4: De�nición de δ̂ en un AFND Ejemplo: Dado el alfabeto Σ = {0,1} y el lenguaje de todas las cadenas binarias que terminan en 01, L= { x | x en Σ∗ y x termina en 01 }, hallar el AFND que lo reconozca L = { 01, 0001, 101, 1001, 10101, ... } A = (Q, Σ, δ, q0, F), donde: Q = {q0, q1, q2}, Σ = {0,1} y F = {q2} En la �gura 2.5 y el cuadro 2.3 se observa el AF que reconoce el lenguaje. Para las cadenas Figura 2.5: Ejemplo de AFND: cadenas binarias que terminan en 01 2.1. AUTÓMATAS DE ESTADOS FINITOS 21 w1 = 01 y w2 = 10101 se muestra la ejecución formal a partir de la función de transición extendida δ̂: 1. δ̂(q0,01) = δ(δ̂(q0,0),1) = δ(δ(δ̂(q0, λ),0),1) → δ(δ({q0},0),1) → δ({q0, q1},1) = δ(q0,1) ∪ δ(q1,1) = {q0} ∪ {q2} = {q0, q2},→ Acepto porque {q0, q2} ∩ {q2} ̸= ϕ, es decir al menos uno de los estados del autómata es de aceptación (pertenece a F) luego de procesar la cadena. 2. δ̂(q0,10101) = δ(δ̂(q0,1010),1) = δ(δ(δ(δ(δ(δ̂(q0, λ),1),0),1),0),1) → δ(δ(δ(δ(δ({q0},1),0),1),0),1), δ({q0},1) = {q0} → δ(δ(δ(δ({q0},0),1),0),1), δ({q0},0) = {q0, q1} → δ(δ(δ({q0, q1},1),0),1), δ({q0, q1},1) = δ(q0,1) ∪ δ(q1,1) = {q0} ∪ {q2} = {q0, q2} → δ(δ({q0, q2},0),1), δ({q0, q2},0) = δ(q0,0) ∪ δ(q2,0) = {q0, q1} ∪ ϕ = {q0, q1} → δ({q0, q1},1), δ({q0, q1},1) = δ(q0,1) ∪ δ(q1,1) = {q0} ∪ {q2} = {q0, q2} Acepto porque {q0, q2} ∩ {q2} ̸= ϕ, es decir al menos uno de los estados es de aceptación (pertenece a F). Lenguaje aceptado por un AFND Dado M = (Q, Σ, δ, q0, F) un AFND, el lenguaje L aceptado por M está de�nido por: L(M) = { w | w en Σ∗ y δ̂(q0,w) ∩ F ̸= ϕ } Es el conjunto de cadenas pertenecientes a Σ∗ tal que ejecutar el AFND desde el estado inicial q0 con la cadena w, la función de transición extendida δ̂(q0,w) contiene al menos un estado de aceptación (es diferente del vacío la intersección con F). Equivalencia entre AFD y AFND Todo Lenguaje regular puede describirse con ambos tipos de autómatas AFND y AFD. Generalmente un AFND es más fácil de diseñar (capturar su modelo) y un AFD es mas fácil de implementar (ejecutar para el conocimiento de cadenas). El AFD más grande puede tener 2n estados y el AFND más pequeño solo tiene n estados. Teorema 1. Si L es aceptado por un AFND entonces existe un AFD que acepta L (es decir, ambos aceptan la misma clase de lenguaje: lenguajes regulares). Algoritmo para la Construcción de Subconjuntos: Este algoritmo permite a partir de un AFND obtener un AFD equivalente que reconoce el mismo lenguaje. Su nombre se debe a que se intenta construir todos los subconjuntos del conjunto de estados del AFND. AFN N = (QN , Σ, δN , q0 , FN ) AFD D = (QD, Σ, δD, {q0} , FD) Tal que L(N) = L(D) (el lenguaje reconocido por el autómata N sea el mismo que el lenguaje 22 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Cuadro 2.4: Tabla de transición δN : Lenguaje de las cadenas binarias que terminan en 01 δN 0 1 → q0 {q0, q1} {q0} q1 ϕ {q2} *q2 ϕ ϕ reconocido por el autómata D, por tanto sean equivalentes) Algoritmo: 1. Σ son iguales para N y D. 2. QD es el conjunto de los subconjuntos de QN , (Conjunto potencia QD = Q ∗ N ). No todos los estados de QD son accesibles desde q0, los estados inalcanzables desde el estado inicial serán eliminados. 3. FD es el conjunto S de subconjuntos de QN (S ⊆ QN ) tal que S ∩ FN ̸= ϕ. Es decir FD contiene todos los conjuntos de estados de N que incluyen al menos un estado de aceptación de N. 4. Para todo S ⊆ QN y a en Σ, entonces δD(S,a) = ∪ pϵS δN (p,a). Ejemplo: Dado el AFDN de la �gura 2.5 y el cuadro 2.4 denotado como N = (QN , Σ, δN , q0, FN ), con Σ= {0,1} y QN = {q0, q1, q2}, FN = {q2}. Obtener D un AFD tal que L(N) = L(D) a través del algoritmo de construcción de subconjuntos. Figura 2.6: Relación AFDN y AFD: construcción de subconjunto sobre el AFND de la �gura 2.5 1. Σ = {0, 1} 2. D = (QD, Σ, δD, {q0}, FD) 3. QD = {ϕ, {q0}, {q1}, {q2}, {q0, q1}, {q0, q2}, {q1, q2}, {q0, q1, q2}} (Conjunto de todos los subconjuntos de Q) 2.1. AUTÓMATAS DE ESTADOS FINITOS 23 Cuadro 2.5: Tabla de transición δD a través de la construcción de subconjuntos δD 0 1 q0 → {q0} {q0, q1} {q0} q1 {q0, q1} {q0, q1} {q0, q2} q2 *{q0, q2} {q0, q1} {q0} 4. FD = {{q2}, {q0, q2}, {q1, q2}, {q0, q1, q2}} 5. Generar δD, ver cuadro 2.5 y �gura 2.6 (se renombran los estados {q0} = q0, {q0, q1} = q1, {q0, q2} = q2) a) δD({q0},0) = δN (q0,0) = {q0, q1} b) δD({q0},1) = δN (q0,1) = {q0} c) δD({q0,q1},0) = δN (q0,0) ∪ δN (q1,0) = {q0,q1} ∪ ϕ = {q0,q1} d) δD({q0,q1},1) = δN (q0,1) ∪ δN (q1,1) = {q0} ∪ {q2} = {q0,q2} e) δD({q0,q2},0) = δN (q0,0) ∪ δN (q2,0) = {q0,q1} ∪ ϕ = {q0,q1} f ) δD({q0,q2},1) = δN (q0,1) ∪ δN (q2,1) = {q0} ∪ ϕ = {q0} A continuación se realiza la ejecución de AFD resultante para evaluar la cadena w=10101: δ̂D({q0},10101) = δD(δ̂D({q0},1010),1) = δD(δD(δD(δD(δD(δ̂D({q0}, λ),1),0),1),0),1) δD(δD(δD(δD(δD({q0},1),0),1),0),1) = δD(δD(δD(δD(δD({q0},1),0),1),0),1) = δD(δD(δD(δD({q0},0),1),0),1) = δD(δD(δD({q0, q1},1),0),1) = δD(δD({q0, q2},0),1) = δD({q0, q1},1) = {q0, q2} Se acepta la cadena porque {q0, q2} esta en FD La demostración de este algoritmo se encuentra en el libro de Hopcroft [2] : Se demuestra por inducción sobre el tamaño de w, donde el caso base δ̂N (q0, λ) = δ̂N ({q0}, λ) y para el caso inductivo δ̂N (q0,w) = δ̂N ({q0},w). 2.1.3. Autómatas �nitos no determinista con transiciones nulas (AFND-λ) Es un AFND que permite transiciones para la cadena vacía λ. Antes los AF no se movían con la cadena vacía, es decir δ̂N (q, λ) = {q} y δ̂D(q, λ) = q, los AF se quedaban en el mismo estado cuando procesan a la cadena vacía. Ahora con AFND-λ se tienen transiciones espontáneas, es decir sin recibir o procesar ningún símbolo de la entrada. Se aplica si λ no pertenece al conjunto de símbolos de Σ. Su utilidad: 24 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Facilidad para modelar (autómatas más sencillos y con menos estados y transiciones). Relación directa con las expresiones regulares (equivalencia demostrada formalmente) Un AFND-λ es una quíntupla: A=(Q, Σ, δ, q0, F), siendo: Q = conjunto �nito de estados. Σ = conjunto �nito de símbolos del alfabeto. q0 = es el estado inicial (denotado con �echa →) a inicio F = conjunto de estados �nales (o estados de aceptación). F ⊆ Q δ = la función de transición entre estados δ: Q x Σ ∪ {λ} → Q∗. Ejemplo: Dado L = {0n1m2p | n,m,p ≥ 0 }, el lenguaje de todas las cadenas de 0, 1 o más digitos cero (0n) seguidas de 0, 1 o más dígitos uno (1m), y seguidas de 0, 1 o más digitos dos (2p). Los siguientes autómatas de las �guras 2.7 y 2.8 reconocen a L: En la tabla de transición 2.6, del AFND-λ puede o no asumirse la transición espontánea de Figura 2.7: AFND para el lenguaje 0n1m2p Figura 2.8: AFND-λ para el lenguaje 0n1m2pla cadena vacía λ. Es decir, δ̂(q,λ) = {q}. Por ejemplo en el estado q2, puede ser λ pero sin embargo también es ϕ ∪ {q2}. 2.1. AUTÓMATAS DE ESTADOS FINITOS 25 Cuadro 2.6: Tabla de transición de un AFND-λ δ 0 1 2 λ → q0 {q0} ϕ ϕ {q1} q1 ϕ {q1} ϕ {q2} * q2 ϕ ϕ {q2} ϕ Ejecución de un Autómatas de estados �nitos no determinista AFND-λ Dada una cadena w y un AFND-λ, para reconocer dicha cadena se debe aplicar la función extendida para cadenas δ̂: Q x Σ∗ → Q∗. Donde δ̂(q,w) es el conjunto de todos los estados pi tal que se puede ir de q a cada pi por un camino etiquetado w que puede incluir arcos etiquetados λ. Para calcular este camino es necesario de�nir el término de la λ-clausura(q) de un estado q (q en Q) como, el conjunto de todos los estados a los cuales se puede llegar a partir de q siguiendo un camino de arcos únicamente etiquetados con λ. La de�nición recursiva de λ-clausura(q): Base: λ-clausura(q) = {q} , es decir por de�nición δ̂(q,λ) = {q}, podemos imaginarnos un bucle de un estado a si mismo etiquetado λ. Ver �gura 2.9. Paso inductivo: Si δ̂ es la función de transición de AFND-λ y p está en la λ-clausura(q), es decir δ̂(q, λ) = {p} entonces la λ-clausura(q) también contiene los estados δ̂(p,λ). Ver �gura 2.9. Figura 2.9: Ejemplo de la de�nición de λ-clausura en un AFND-λ La de�nición de la función de transición extendida δ̂ de los AFND-λ, con la que se pueden ejecutar este tipo de autómata, es la siguiente: 1. δ̂(q0, λ) = λ-clausura(q0) 2. Para todo w en Σ∗ y a en Σ, δ̂(q,wa) = λ-clausura(P) con P ⊆ Q, Donde: λ-clausura(P) = { p | para algún r en δ̂(q,w), p en δ(r,a) } , Aplicar λ-clausura a cada p en P. 3. Como aplicar la función δ a un conjunto de estados R. δ(R,a) = ∪ qenR δ(q,a), R ⊆ Q 26 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Figura 2.10: Ejemplo de la de�nición de λ-clausura en un AFND-λ en caso inductivo 4. Como aplicar la función δ̂ a un conjunto de estados R. δ̂(R,a) = ∪ qenR δ̂(q,a), R ⊆ Q. Entonces se tienen las siguientes de�niciones δ̂(q,w) = δ̂(q,x) = {r1, r2, ..., rk} con w = xa.∪k i=1 δ(ri,a) = {p1, p2, ..., pm} y δ̂(q,w) = ∪m j=1 λ-clausura(pj). Ver �gura 2.10. Ejemplo: Dada la cadena w = 02 determinar si pertenece o no al lenguaje 0n1m2p reconocido por el AFND-λ de la �gura 2.8 De�nición de la λ-clausura de los estados del autómata: λ-clausura(q0) = {q0, q1, q2} λ-clausura(q1) = {q1, q2} λ-clausura(q2) = {q2} Aplicando la función de transición extendida δ̂: δ̂(q0,02) = λ-clausura(δ(δ̂(q0,0),2)) = λ-clausura(δ(λ-clausura(δ(δ̂(q0,λ),0)),2)) λ-clausura(δ(λ-clausura(δ({q0, q1, q2},0)),2)) → δ̂(q0, λ) = λ-clausura(q0) = {q0, q1, q2} λ-clausura(δ(λ-clausura({q0}),2)) → δ({q0, q1, q2},0) = {q0} ∪ ϕ ∪ ϕ = {q0} = λ-clausura(δ({q0, q1, q2},2)) → λ-clausura({q0}) = λ-clausura(q0) = {q0, q1, q2} λ-clausura(q2) → δ({q0, q1, q2},2) = ϕ ∪ ϕ ∪ {q2} = {q2} {q2} Acepto la cadena w = 02 ya que δ̂(q0,02) ∩ F = {q2} ̸= ϕ. Lenguaje aceptado por un AFND-λ Dado un AFND-λ E = (Q, Σ, δ, q0, F) el L(E) se de�ne como: L(E)= { w | w en Σ∗, δ̂(q0,w) ∩ F ̸= ϕ } 2.1. AUTÓMATAS DE ESTADOS FINITOS 27 El lenguaje L(E), el reconocido por el autómata E, es el conjunto de cadenas de Σ∗ que al aplicar la función de transición extendida δ̂ se obtiene un conjunto de estados de Q donde al menos uno pertenece al conjunto de estados de aceptación (F). Equivalencia entre AFD y AFND-λ (construcción de subconjuntos de λ) Teorema 2. Si L es aceptado por un AFND con λ-transiciones entonces L es aceptado por un AFND sin λ-transiciones. Teorema 3. Un lenguaje regular L es aceptado por un AFND con λ-transiciones si y sólo si es aceptado por un AFD. A partir de estos teoremas se deriva un algoritmo para pasar de un AFND-λ a un AFD, es decir para eliminar las transiciones λ y obtener un autómata equivalente que reconozca el mismo lenguaje de forma deterministica. Dado E un AFND-λ se quiere lograr que L(E) = L(A), con y A un AFD, es decir δ̂E(q0E ,w) = δ̂D(q0D,w) para todo w en L: E (AFND-λ) = (QE ,Σ, δE , q0E , FE) D (AFD) = (QD,Σ, δD, q0D, FD) Algoritmo: 1. q0D = λ-clausura(q0E) 2. QD = Q ∗ E , es decir el conjunto de subconjuntos de QE 3. FD = { s | s en QD y {s} ∩ FE ̸= ϕ } 4. δD(S,a) para todo a en Σ y S en QD, se cumple: δD(S,a) = ∪n j=1 λ-clausura(rj), {r1, r2, ..., rn} = ∪k i=1 δE(pi,a) con S = {p1, p2, ..., pk}. Ver �gura 2.11 Figura 2.11: Construcción de subconjuntos λ en un AFND-λ 28 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Cuadro 2.7: Tabla de transición δD a través de la construcción de sunconjuntos de λ δD 0 1 2 q0 → {q0, q1, q2} {q0, q1, q2} {q1, q2} {q2} q1 {q1, q2} ϕ {q1, q2} {q2} q2 *{q2} ϕ ϕ {q2} Ejemplo: Dado el AFND-λ E de la �gura 2.8, encontrar un AFD equivalente que reconozca el mismo lenguaje. E = (Q, Σ, δ, q0, F), donde Q = {q0, q1, q2}, Σ = {0, 1, 2} y F = {q2}. Se obtiene el AFD D = (QD, Σ, δD, q0D, FD), aplicando el algorimos de construcción de subconjuntos de λ: 1. Σ = {0, 1, 2} 2. q0D = λ-clausura(q0) = {q0, q1, q2} 3. QD = {ϕ, {q0}, {q1}, {q2}, {q0, q1}, {q1, q2}, {q0, q2}, {q0, q1, q2}} 4. FD = {{q2}, {q1, q2}, {q0, q2}, q0, q1, q2} 5. Cálculo de δD: (ver cuadro 2.7) Para el estado inicial {q0, q1, q2} se aplica la de�nición para todos los elementos de Σ: * δD({q0, q1, q2},0) = λ-clausura(δE(q0, 0) ∪ δE(q1, 0) ∪ δE(q2, 0)) = λ-clausura({q0} ∪ ϕ ∪ ϕ) = λ-clausura({q0}) = λ-clausura(q0) = {q0, q1, q2} * δD({q0, q1, q2},1) = λ-clausura(δE(q0, 1) ∪ δE(q1, 1) ∪ δE(q2, 1)) = λ-clausura(ϕ ∪ {q1} ∪ ϕ) = λ-clausura({q1}) = λ-clausura(q1) = {q1, q2} * δD({q0, q1, q2},2) = λ-clausura(δE(q0, 2) ∪ δE(q1, 2) ∪ δE(q2, 2)) = λ-clausura(ϕ ∪ ϕ ∪ {q2}) = λ-clausura({q2}) = λ-clausura(q2) = {q2} Para el estado {q1, q2} se aplica la de�nición para todos los elementos de Σ: * δD({q1, q2},0) = λ-clausura(δE(q1, 0) ∪ δE(q2, 0)) = λ-clausura(ϕ ∪ ϕ) = λ-clausura(ϕ) = ϕ * δD({q1, q2},1) = λ-clausura(δE(q1, 1) ∪ δE(q2, 1)) = λ-clausura({q1} ∪ ϕ) = λ- clausura({q1}) = λ-clausura(q1) = {q1, q2} * δD({q1, q2},2) = λ-clausura(δE(q1, 2) ∪ δE(q2, 2)) = λ-clausura(ϕ ∪ {q2}) = λ- clausura({q2}) = λ-clausura(q2) = {q2} Para el estado {q2} se aplica la de�nición para todos los elementos de Σ: * δD({q2},0) = λ-clausura(δE(q2, 0)) = λ-clausura(ϕ) = ϕ * δD({q2},1) = λ-clausura(δE(q2, 1)) = λ-clausura(ϕ) = ϕ * δD({q2},2) = λ-clausura(δE(q2, 2)) = λ-clausura({q2}) = λ-clausura(q2) = {q2} Hay dos formas de interpretar la construcción de subconjuntos-λ, una para crear un AFD y otra AFND. La idea es llegar a un AF más fácil de implementar (es decir obtener un AFD). AFD: Se toma cada estado como un conjunto de etiquetas. Ver �gura 2.12 AFND: Se interpreta el contenido de la etiqueta de cada estado. Ver �gura 2.13 2.1. AUTÓMATAS DE ESTADOS FINITOS 29 Figura 2.12: AFD equivalente del AFND-λ de la �gura 2.8 a través de la Construcción de subconjuntos λ Figura 2.13: AFND equivalente del AFND-λ de la �gura 2.8 a través de la Construcción de subconjuntos λ 2.1.4. Herramientas, implementación y uso de Lenguajes regulares Implementación de un AFD: programación basada en autómatas La simulación de un AFD resulta un enfoque de programación que permite aumentar el nivel de abstracción ante la solución de un problema. El siguiente algoritmo (no recursivo) expresado en pseudocódigo muestra el funcionamiento del AFD de la �gura 2.2: INICIO Conjunto Q[Estado] = {q0, q1, q2} Conjunto Σ[Simbolo]= {0,1} Conjunto F[Estado] = {q1} Estado Actual = q0 Simbolo A A = LeerSimboloCadena() Mientras a ̸= λ entonces Actual = transicionδ(Actual, A) A = LeerSimboloCadena() fin Mientras Si Pertenece(Actual,F) entonces 30 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Imprimir("Se acepta la cadena") sino Imprimir("No se acepta la cadena") fin Si FIN Función transicionδ(Estado q, Símbolo a): Estado Estado S Selección q = q0 y a = 0: S = q1 q = q0 y a = 1: S = q2 q = q1 y a = 0: S = q1 q = q1 y a = 1: S = q1 q = q2 y a = 0: S = q2 q = q2 y a = 1: S = q2 fin Selección Retornar S fin Función Dondese asume que se tiene los siguientes tipos de datos: Conjunto (paramétrico por el tipo de elemento), Estado, Simbolo. Para ellos se tiene las siguientes operaciones: LeerSimboloCadena() que permite obtener desde la entrada estándar un Símbolo de la cadena de entrada w (desde el comienzo, secuencialmente uno a uno) Imprimir(CadenaCaracter) función que permite imprimir la salida del autómata, si acepta o no la cadena de entrada Pertenece(Estado A, Conjunto B[Estado]), es una operación del tipo de dato Con- junto que determina si el elemento A (del tipo Estado) pertenece al Conjunto de Estados B. Una posible implementación del algoritmo anterior en lenguaje C se muestra a continuación: #include <iostream> #include <string> #include <stdio.h> using namespace std; enum estados { q0, q1, q2 }; void transicion(enum estados *estado, char a) // función de transición { switch(*estado) { case q0: if(a == '0') { 2.1. AUTÓMATAS DE ESTADOS FINITOS 31 putchar(a); *estado = q1; } else { if(a == '1') { putchar(a); *estado = q2; } } break; case q1: if(a == '0' || a == '1') { putchar(a); *estado = q1; } break; case q2: if(a == '0' || a == '1') { putchar(a); *estado = q2; } break; } } int main() { char c; string cad; enum estados state = q0; cout << "AFD que reconoce todas las cadena binarias que comienzan con 0" << endl; cout << "Estado inicial: " << state << endl; c = getchar(); cad = c; while((c == '0') || (c == '1')) { transicion(&state, c); cout << " Estado actual: " << state << endl; c = getchar(); if ((c == '0') || (c == '1')) cad = cad + c; } if (state == q1) cout << "La cadena " << cad << " SI esta en el lenguaje" << endl; else cout << "La cadena " << cad << " NO esta en el lenguaje" << endl; return 0; } 32 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS 2.1.5. Preguntas y respuestas, ejercicios resueltos y propuestos Preguntas y respuestas 1. ¾Qué es un autómata?. Es una máquina abstracta, dispositivo teórico o modelo matemá- tico que procesa una secuencia �nita de símbolos de un alfabeto, cambiando su estado de acuerdo al símbolo que está leyendo o procesando, lo que permite saber si una cadena se encuentra dentro o no de un lenguaje dado. Tiene un conjunto �nitos de estados posibles y muestra las posibles transiciones entre los estados. 2. ¾Por qué en los AF se tiene siempre un sólo estado de inicial y uno o más estados �nales?. El objetivo de una AF es aceptar cadenas de un lenguaje y para eso necesita estados de aceptacón, por tanto el conjunto F no puede ser vacío, pero si puede tener uno o más caminos para reconocer esas cadenas (tener mas de un estado en F). Con respecto al estado inicial se necesita sólo uno, pues el AF necesita saber de forma precisa por donde comenzar el funcionamiento de la máquina. Si se tiene más de un estado inicial el AF debe seleccionar por donde comenzar, lo cual resultaría complicado para un modelo matemático sencillo. De forma análoga ocurre en los lenguajes de programación donde sólo hay un inicio para el programa (main) pero puede tener mas de un �nal (exit). 3. ¾Por qué un AF debe terminar de procesar la cadena de entrada para saber si está o no en el lenguaje?. La mayoría de los autómatas o máquinas de reconocimiento (excepto la Máquina de Turing) tienen esta restricción que les permite simpli�car el funcionamiento de su modelo. Si bien es cierto que para algunos lenguajes no hace falta recorrer toda la cadena pues su de�nición no lo requiere (por ejemplo puede estar relacionada sólo con el pre�jo de las cadenas), hacer que estos casos funcionen como los demás es lo más simple y general en un modelo matemático. 4. ¾Por qué el conjunto de estados de un AF es �nito? Una de las características de los autómatas �nitos es que el conjunto de estados es �nito. Esto se debe a una propiedad matemática sobre los lenguajes regulares (relación de equivalencia) que establece parti- ciones �nitas sobre el lenguaje (aunque el lenguaje puede ser in�nito). Esta propiedad es diferente en otros tipos de lenguajes más complejos pues las particiones se hacen in�nitas y por ende el número de estados para representarlas. 5. ¾Puede obtener un AFND algorítmicamente a partir de un AFD?, ¾por qué? El pro- cedimiento de la construcción de subconjuntos permite llevar de un AFND a AFD, es decir eliminar el no determinismo. El no determinismo implica el manejo de opciones o alternativas en cada paso de transición generando instancias simultáneas del Autómata en cada alternativa. El caso contrario parte de un AFD y se quiere obtener un AFND, es decir agregar no determinismo al autómata. Este proceso no tiene un algortimo, pero si dicho algoritmo pudiera existir tendría que ser en si no determinístico, es decir aplicar alternativas �nitas en cada paso de transición que incluso podría no tener sentido, sería muy complejo e incluso di�cil de aplicar en algunos lenguajes regulares. 6. ¾Qué signi�ca la equivalencia de autómatas?. Dos autómatas son equivalente cuando reconocen exactamente el mismo lenguaje. Es necesario distinguir entre ser iguales y ser equivalente. Dos autómatas diferentes pueden tener diferente cantidad de estados, con diferentes transiciones e incluso diferente cantidad de estados de aceptaciión, es decir 2.1. AUTÓMATAS DE ESTADOS FINITOS 33 son diferentes en todo sentido y por tanto no son iguales. Sin embargo, estos autómatas diferentes, M1 ̸= M2, son capaces de procesar cadenas de Σ ∗ y reconocer el mismo lenguaje L (todas y cada una de las cadenas que forman a L, ni una más ni una menos), en ese caso son llamados autómatas equivalentes, es decir L(M1) = L(M2). Ejercicios resueltos 1. Determine las diferencias entre un AFD y un AFND. Ver el cuadro 2.8 2. Aplicaciones de la vida real que pueden ser vistos como AF. Algunas aplicaciones intere- santes de los AF están referidas al almacenamiento de diccionarios como los usados en los celulares, en la que se utilizan sus características para hacer búsquedas, inserciones o modi�caciones rápidas. Así como también para mejorar el ordenamiento y búsqueda en otros tipos de aplicaciones como los circuitos digitales, texto, secuencias lógicas de fun- cionamiento (como la maquinaria industrial, robótica) y otras. También son útiles para el modelado de aquellos casos en los que a partir de una acción anterior se puede llegar a un conjunto determinado de destinos, pero no se tiene certeza anticipada de cuál de ellos es el indicado, utilizados para modelar protocolos de comunicación, sistemas distribuidos, plani�cación, etc. 3. Modelar un AF que reconozca un identi�cador válido en el lenguaje de programación C. Un identi�cador es un nombre que de�ne a una variable, una función o un tipo de datos. Un identi�cador válido ha de empezar por una letra o por el carácer de subrayado _, seguido de cualquier cantidad de letras, dígitos o subrayados. Además: No debe contener caracteres especiales, tales como @, $, #, no debe haber espacios en blanco en los iden- ti�cadores. El AF que reconoce este lenguaje es el siguiente: A = (Q, Σ, δ, q0, F), donde Q = {q0, q1}, Σ son todos los caracteres alfanuméricos y ca- racteres especiales permitidos (tales como -,_,.) , F = {q1}, y δ se expresa en el diagrama de transición de la �gura 2.14 , donde se observa dos conjuntos de caracteres: A = conjunto de caracteres alfabéticos B = conjunto de caracteres alfabéticos, numéricos y subrayados Figura 2.14: AF que reconoce un identi�cador en el lenguaje C Existen palabras propias del lenguaje (palabras reservadas) que no pueden ser usadas como identi�cadores ej: if, do, while, etc. Cómo puede modi�car el AF anterior para no considerar como identi�cadores a las palabras reservadas del lenguaje. 34 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Cuadro 2.8: Tabla comparativa de AFD y AFND Característica AFD AFND Función de transición δ δ: Q x Σ → Q, rango es un elemento de Q δ: Q x Σ → Q∗, rango es un subcon- junto de Q De�nición del Lenguaje que reconoce L(M)={w|w ϵ Σ∗ yδ̂(q0,w) ϵ F }, Lenguaje regular L reconocido por el AFD M L(M)={w|w ϵ Σ∗ y δ̂(q0,w) ∩ F ̸= ϕ}, Lenguaje regular L reconocido por el AFND M Estado actual Un solo estado actual en cada paso del autómata El estado actual puede ser un con- junto de estados (subconjunto de Q), es deir múltiples estados simul- taneamente Condición del diagrama de transición Desde cada estado existe una tran- sición de salida por cada símbolo de Σ No hay restricciones con respecto a las transiciones, un símbolo de Σ puede tener 0, 1 o más transciones de salida desde el mismo estado Condición de la tabla de transición Cada posición de la celda de la ta- bla debe tener sólo un estado (estar completa) Las posiciones de las celdas pueden tener cualquier subconjunto de Q (incluyendo el ϕ). Utilidad Los AFD son los que se implemen- tan para el reconocimiento de len- guajes regulares, se usan para simu- lar AFND Los AFND se utilizan en lengua- jes regulares con alfabetos grandes y muchos estados, pues es más senci- llo de modelar, tiene relación directa con las expresiones regulares y son utiles para aplicar operaciones sobre autómatas Facilidad de modelado y programación El modelo de un AFD deben consi- derar todo Σ en cada estado, esto lo hace exhaustivo y difícil de diseñar. En cambio su programación o imple- mentación es un algortimo determi- nístico (tiene de�nido que hacer en cada caso) e�ciente El modelo de un AFND es sencillo pues no exige evaluar todo Σ en ca- da estado, al contrario puede con- siderar solo las opciones que acep- tan las cadenas y muestra un dise- ño más sencillo. Por el contrario, su implementación requiere simular las alternativas simultáneas en cada pa- so de transición (búsqueda en un ár- bol realizando backtracking) y pue- de hacer complejo y poco e�ciente su programación e implementación 2.1. AUTÓMATAS DE ESTADOS FINITOS 35 4. Modelar un AF que reconozca el conjunto de enteros y números en punto �otante o también llamadas "literales numéricas". En el lenguaje C, las siguientes expresiones son literales numéricas válidas: 3, +0, -2E+7, 13., -01, -14.4, 41.16, -.4E-7, 0.2E-20, 00E0, 01E-06. La letra E se re�ere a un exponente y su presencia hace que el número subsiguiente sea un entero. Se supone que no existe límite en el número de dígitos consecutivos en ninguna parte de la expresión (no hay el problema de la precisión). El AF que reconoce este lenguajs puede ser el siguiente: B = (Q, Σ, δ, q0, F), donde Q = {qi | 0 ≤ i ≤ 7 }, Σ son todos los caracteres numéricos y caracteres especiales permitidos (tales como .,+,-,E), F = {q1, q4, q5, q6}, y δ se expresa en el diagrama de transición de la �gura 2.15, donde se observa el conjunto de caracteres N = {0,1,2,3,4,5,6,7,8,9}. Figura 2.15: AF que reconoce un literal numérico en el lenguaje C Se plantea como ejercicio pensar cómo puede modi�car el AF de la �gura 2.15 para reconocer lo siguiente: cambiar el uso del punto para que en su lugar la coma (,) se utilice para separar enteros y decimales, y el punto (.) se emplee como separador de las unidades decimales (co- menzando desde el lado derecho de tres en tres). Por ejemplo, partes enteras de las literales numéricas como: 1.300 o 35.413 o 38 o 23.300.080, etc. Ejercicios propuestos 1. Para Σ = {0,1} construya un AFD que acepte los siguientes lenguajes: a) El conjunto de cadenas que tiene 011 como subcadena. b) El conjunto de todas las cadenas cuyo tercer elemento desde el extremo izquierdo sea un 1. c) El conjunto de cadenas en las que el número de ceros es divisible por 3. d) El conjunto de cadenas que terminan con 01. e) El conjunto vacío. f ) El conjunto de la cadena vacía. 2. Constuya un AF para los siguientes lenguajes: a) El conjunto de cadenas basadas en Σ={a,b,c} cuyo último símbolo no haya apare- cido antes en la misma entrada. 36 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Cuadro 2.9: Tabla de transición δ δ 0 1 → p {p, q} {p} q {r} {r} r {s} ϕ *s {s} {s} Cuadro 2.10: Tabla de transición δ δ 0 1 → p {q, s} {q} *q {r} {q, r} r {s} {p} *s ϕ {p} b) Conjunto de 0 y 1 que contenga 2 ceros separados por un número de posiciones múltiplo de 3. Nótese que 0 es un múltiplo de 3 válido. 3. Obtenga un autómata �nito (de cualquier tipo) para reconocer los siguientes lenguajes apartir del alfabeto binario: a) cadenas acabadas en 00 b) cadenas con dos unos consecutivos c) cadenas que no contengan dos unos consecutivos d) cadenas con dos ceros consecutivos o dos unos consecutivos e) cadenas con dos ceros consecutivos y dos unos consecutivos f ) cadenas acabadas en 00 o 11 g) cadenas con un 1 en la antepenúltima posición h) cadenas de longitud 4 4. Construir un AFD equivalente a los siguientes autómatas: a) M1 = ({p, q, r, s}, {0, 1}, δ, p, {s}) donde δ está dada por el cuadro 2.9 b) M2 = ({p, q, r, s}, {0, 1}, δ, p, {q, s}) donde δ está dada por el cuadro 2.10 c) M3 = ({p, q, r}, {a, b, c}, δ, p, {r}) donde δ está dada por el cuadro 2.11 d) M4 = ({q0, q1, q2, q3, q4}, {a, b}, δ, q0, {q4}) donde δ está dada por el cuadro 2.12 2.1. AUTÓMATAS DE ESTADOS FINITOS 37 Cuadro 2.11: Tabla de transición δ δ λ a b c → p ϕ {p} {q} {r} q {p} {q} {r} ϕ *r {q} {r} ϕ {p} Cuadro 2.12: Tabla de transición δ δ a b λ → q0 {q1, q2} {q1, q3} ϕ q1 ϕ ϕ {q3} q2 {q4} ϕ ϕ q3 ϕ {q4} ϕ q4 ϕ ϕ ϕ 38 CAPÍTULO 2. LENGUAJES REGULARES Y AUTÓMATAS FINITOS Bibliografía [1] Alonzo Church: A note on the Entscheidungsproblem. Journal of Symbolic Logic. 1 (1936). pp 40 - 41. [2] Hopcroft, Rajeev Motwani, Je�rey D. Ullman. Introducción a la Teoría de Autómatas y Lenguajes Formales. PrenticeHall, 2002. [3] Chacín, M. y Padrón, J. (1994) Qué es teoría. Investigación y Docencia. Caracas: Publi- caciones del Decanato de Postgrado, USR. [4] Seymour Lipschutz (1970) Teoría de Conjuntos y Temas a�nes. macGraw-Hill 39
Compartir