• No se han encontrado resultados

Teoría de la Computación para Ingeniería de Sistemas: un enfoque práctico. Prof. Hilda Contreras

N/A
N/A
Protected

Academic year: 2021

Share "Teoría de la Computación para Ingeniería de Sistemas: un enfoque práctico. Prof. Hilda Contreras"

Copied!
39
0
0

Texto completo

(1)

Teoría de la Computación para Ingeniería de Sistemas: un

enfoque práctico

Prof. Hilda Contreras 15 de abril de 2012

(2)
(3)

Í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

(4)
(5)

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 ecientes 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.

(6)

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 (Human 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).

(7)

1.2. CONCEPTOS BÁSICOS: ALFABETO, PALABRA O 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 deniciones 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 dene 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 signica 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 deniciones formales son: A = ∪|A|

i=0Ai y A+ =

|A|

i=1Ai (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}}

(8)

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 pertenencia de un elemento a un conjunto. El problema, los elementos y el tipo de conjunto que se van a utilizar se denen 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 dene, 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 denen:

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 :xyyson cadenas entoncesxydenota la concatenación.

Por ejemplo:x = 011 y = 1110, la concatenación dexy = "0111110"

d) Potencias de un Alfabeto: Conjunto de todas las cadenas formadas a partir de un alfabeto de cierta longitud.

ΣkCadenas 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

dene por Σ = Σ0∪Σi. Donde Σ0 ={λ}i =∪i=1Σi. Además se denota

elΣ+= Σ∗− {λ}

e) Sujo, Prejo: 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 prejos de w= λ, a, ab, abc, abca

Los sujos de w=λ, a, ca, bca, abca

f ) Prejo (Sujo) propio, es cualquier Prejo (Sujo) 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,...

}

(9)

1.3. JERARQUÍA DE CHOMSKY 9

Figura 1.1: Denició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 dene 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 denida por la clase de reglas que contiene. El cuadro 1.1, muestra una jerarquía implicativa, de modo que los lenguajes denidos 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.

(10)

Cuadro 1.1: Jerarquía de Chomsky

Tipo Lenguaje Máquina Gramática G = (V,T,P,S)

0 Recursivamente

enumerable Máquina deTuring Gramática sin restricciones

α β (α, β

en (V ∪T ),α contiene una variable)

1 Dependiente del

Contexto Autómatalinealmente acotado

Gramática sensible al contexto α→β (α, β en (V ∪ T ),α contiene una variable,

|β| ≥ |α|)

2 Independiente

del Contexto Autómata dePila Gramática libre de contexto A

α (A en

V y α en (V∪T))

3 Lenguaje

Regu-lar Autómata -nito Gramática Regular Aen V y a en T) aB, A a, (A,B

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 dene como "dada una

Figura 1.2: Problema de decisión en Teoría de la Computación

(11)

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 redenir 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 denició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 denir 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 especicaciones 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é signica 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)

poderosa en la medida que soluciona problemas sin importar como lo hace (no importa la eciencia 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órco. 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 innito, 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. Identique 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 denen:

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 innitas cadenas (textos)y entoncesΣ es

innito.

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 innito pues las reglas de un lenguaje de programación (aunque son nitas) permiten escribir innitos 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 signica que pertenece al lenguaje L de todas los posibles e innitos códigos que pueden escribirse en

(13)

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 innito 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 innito (se pueden escribir innitos 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 clasicación de problemas asociado a una máquina

e) Un algoritmo es el conjunto de instrucciones que puede calcular

f ) No existe un lenguaje innito 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 justique (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 identique el alfabeto y de ejemplo de una cadena del lenguaje, describa el lenguaje.

(14)
(15)

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 innitos tipicados 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 denen a los Lenguajes Regulares. 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.

(16)

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 suciente 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 k1, tal que hay

un enlace (Vi,Vi+1) con 1 ik. 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 k1, tal que

Vi Vi+1 es un arco con 1ik. 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 dene 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 dene f:N N, donde N es el

conjunto de los números naturales. Los tipos de funciones son:

(17)

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 f1(b)̸=ϕ, para todo b en conjunto Rango o Codominio.

La función de transición de un AFD esta denida 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:AB, la función inversaf1:BA, se dene como

f−1(b)= {x | x en A y f(x) = b } para todo b en B

(18)

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 suciente 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 denición de la función de transición extendida sobre cadenas bδ. La denición de su dominio y rango es: bδ = Q x Σ Q. La

denición recursiva de la función bδ se dene:

1. Caso base para la cadena vacía λ: Para todo q en Q, bδ(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 quebδ(q,wa) = δ(bδ(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. bδ(q0,010)

=δ(bδ(q0,01),0)

=δ(δ(δb(q0,0),1),0)

=δ(δ(δ(bδ(q0, λ),0),1),0)

→δ(δ(δ(q0,0),1),0)(δ(q1,1),0)→δ(q1,0) =q1 Se acepta al terminar de procesar

(19)

2.1. AUTÓMATAS DE ESTADOS FINITOS 19 2. δb(q0,101)

= δ(bδ(q0,10),1)

= δ(δ(bδ(q0,1),0),1)

= δ(δ(δ(δb(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ónbδ(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á denido por:

L(M)= { w | w enΣ ybδ(q0,w) pertenece a F }

Es decir, el lenguaje de M, es un conjunto de cadenas w que llevan al autómata M desdeq0 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 vericar 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 denición de la funciónδby el rango de la función de transición,δ: Q xΣ2Q ó también

δ: Q xΣ→Q∗

En la gura 2.3 se muestra el diagrama 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 denición de la función de transición extendida sobre cadenasδb: Q xΣ∗→Q∗, denida recursivamente así:

(20)

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λ:δb(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: bδ(q,xa) = { r | para algún p

en bδ(q,x),δ(p,a) = r }. Sea w de la forma w = xa donde a es el símbolo nal (sujo de

longitud 1) de w y x el resto de w.

b

δ(q,x) = {p1, p2, ..., pn} sea

k

i=1δ(pi,a) = {r1, r2, ..., rn}

Entoncesbδ(q,x) = δ(bδ(q,x),a) = {r1, r2, ..., rn}, ver gura 2.4.

La extensión paraδbdeQ∗xΣ:

b

δ((P,w) =∪qenPbδ(q,w), para todo conjunto de estados P enQ∗

Figura 2.4: Denición deδben 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

(21)

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

extendidabδ: 1. δb(q0,01) = δ(bδ(q0,0),1) = δ(δ(bδ(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. δb(q0,10101) =δ(δb(q0,1010),1) = δ(δ(δ(δ(δ(δb(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á denido por:

L(M) = { w | w en Σ yδb(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 bδ(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)

(22)

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 deQN, (Conjunto potenciaQD =Q∗N). No todos

los estados deQD son accesibles desdeq0, 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} yQN = {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

(23)

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:

c δD({q0},10101) = δD(δcD({q0},1010),1) = δD(δD(δD(δD(δD(δcD({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δcN(q0, λ) =δcN({q0}, λ) y para el caso

inductivoδcN(q0,w) =δcN({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 δcN(q, λ) = {q} y δcD(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

(24)

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 0n1m2p

la cadena vacía λ. Es decir, bδ(q,λ) = {q}. Por ejemplo en el estado q2, puede ser λ pero sin

(25)

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 δb: Q x Σ Q∗. Donde bδ(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 denir 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 denición recursiva de λ-clausura(q):

Base: λ-clausura(q) = {q} , es decir por denición bδ(q,λ) = {q}, podemos imaginarnos

un bucle de un estado a si mismo etiquetado λ. Ver gura 2.9.

Paso inductivo: Siδbes la función de transición de AFND-λy p está en la λ-clausura(q),

es decirδb(q,λ) = {p} entonces laλ-clausura(q) también contiene los estadosbδ(p,λ). Ver

gura 2.9.

Figura 2.9: Ejemplo de la denición de λ-clausura en un AFND-λ

La denición de la función de transición extendida δbde los AFND-λ, con la que se pueden

ejecutar este tipo de autómata, es la siguiente: 1. δb(q0, λ) = λ-clausura(q0)

2. Para todo w enΣ y a enΣ,bδ(q,wa) =λ-clausura(P) con P Q, Donde:

λ-clausura(P) = { p | para algún r en bδ(q,w), p en δ(r,a) } , Aplicar λ-clausura a

cada p en P.

(26)

Figura 2.10: Ejemplo de la denición de λ-clausura en un AFND-λen caso inductivo

4. Como aplicar la función bδ a un conjunto de estados R. bδ(R,a) = ∪qenR δb(q,a), R Q.

Entonces se tienen las siguientes denicionesδb(q,w) = δb(q,x) = {r1, r2, ..., rk} con w =

xa.

k

i=1δ(ri,a) = {p1, p2, ..., pm} y bδ(q,w) =

m

j=1 λ-clausura(pj). Ver gura 2.10.

Ejemplo: Dada la cadena w = 02 determinar si pertenece o no al lenguaje0n1m2p reconocido

por el AFND-λde la gura 2.8

Denició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 extendidabδ:

b

δ(q0,02) = λ-clausura(δ(δb(q0,0),2)) = λ-clausura(δ(λ-clausura(δ(δb(q0,λ),0)),2))

λ-clausura(δ(λ-clausura(δ({q0, q1, q2},0)),2)) →δb(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 quebδ(q0,02)

F = {q2} ̸=ϕ.

Lenguaje aceptado por un AFND-λ

Dado un AFND-λE = (Q,Σ,δ,q0, F) el L(E) se dene como:

L(E)= { w | w en Σ,bδ(q0,w)

(27)

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 extendidabδ 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 δcE(q0E,w)

=δcD(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 enQD y {s}

FE ̸=ϕ}

4. δD(S,a) para todo a en Σy S enQD, 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

(28)

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 denició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 denició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 denició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

(29)

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

(30)

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

Donde se 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 ConCon-junto 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:

(31)

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)

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 simplicar el funcionamiento de su modelo. Si bien es cierto que para algunos lenguajes no hace falta recorrer toda la cadena pues su denición no lo requiere (por ejemplo puede estar relacionada sólo con el prejo 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 innito). Esta propiedad es diferente en otros tipos de lenguajes más complejos pues las particiones se hacen innitas 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 dicil de aplicar en algunos lenguajes regulares.

6. ¾Qué signica 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

(33)

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 modicaciones 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, planicación, etc.

3. Modelar un AF que reconozca un identicador válido en el lenguaje de programación C. Un identicador es un nombre que dene a una variable, una función o un tipo de datos. Un identicador 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-ticadores.

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 identicador en el lenguaje C

Existen palabras propias del lenguaje (palabras reservadas) que no pueden ser usadas como identicadores ej: if, do, while, etc. Cómo puede modicar el AF anterior para no considerar como identicadores a las palabras reservadas del lenguaje.

(34)

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 Denición del Lenguaje que reconoce L(M)={w|w ϵ Σ y δb(q0,w) ϵ F },

Lenguaje regular L reconocido por el AFD M

L(M)={w|w ϵ Σ y bδ(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 denido que hacer en cada caso) eciente

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 eciente su programación e implementación

(35)

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 reere 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 modicar 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

(36)

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

(37)

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)
(39)

Bibliografía

[1] Alonzo Church: A note on the Entscheidungsproblem. Journal of Symbolic Logic. 1 (1936). pp 40 - 41.

[2] Hopcroft, Rajeev Motwani, Jerey 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 anes. macGraw-Hill

Referencias

Documento similar

Proporcione esta nota de seguridad y las copias de la versión para pacientes junto con el documento Preguntas frecuentes sobre contraindicaciones y

Sanz (Universidad Carlos III-IUNE): &#34;El papel de las fuentes de datos en los ranking nacionales de universidades&#34;.. Reuniones científicas 75 Los días 12 y 13 de noviembre

(Banco de España) Mancebo, Pascual (U. de Alicante) Marco, Mariluz (U. de València) Marhuenda, Francisco (U. de Alicante) Marhuenda, Joaquín (U. de Alicante) Marquerie,

o Si dispone en su establecimiento de alguna silla de ruedas Jazz S50 o 708D cuyo nº de serie figura en el anexo 1 de esta nota informativa, consulte la nota de aviso de la

d) que haya «identidad de órgano» (con identidad de Sala y Sección); e) que haya alteridad, es decir, que las sentencias aportadas sean de persona distinta a la recurrente, e) que

Las manifestaciones musicales y su organización institucional a lo largo de los siglos XVI al XVIII son aspectos poco conocidos de la cultura alicantina. Analizar el alcance y

En este sentido, puede defenderse que, si la Administración está habilitada normativamente para actuar en una determinada materia mediante actuaciones formales, ejerciendo

En la parte central de la línea, entre los planes de gobierno o dirección política, en el extremo izquierdo, y los planes reguladores del uso del suelo (urbanísticos y