Está en la página 1de 23

Universidad Mariano

Gálvez, Coatepeque

Sexto Semestre, Ingeniería en Sistemas.

Integrantes: Carnets:

Ancel Rocael López López 6690-20-2546

Nery Elías Reyes López 6690-20-674

Roberto Carlos Rodríguez Mérida 6690-20-7435

Danilo Estuardo Calderón Barrios 6690-20-14991

Brandon Misael Martin Miranda 6690-20-26891

Simri Denilson Pinto Ramírez 6690-20-15670

Ingeniero: Demsshill Coutiño

Ciclo: 2022
Autómatas Finitos

Un autómata finito (AF) o máquina de estado finito es un modelo

computacional que realiza cómputos en forma automática sobre una entrada para

producir una salida.

Este modelo está conformado por un alfabeto, un conjunto de estados finito,

una función de transición, un estado inicial y un conjunto de estados finales. Su

funcionamiento se basa en una función de transición, que recibe a partir de

un estado inicial una cadena de caracteres pertenecientes al alfabeto (la entrada),

y que va leyendo dicha cadena a medida que el autómata se desplaza de un

estado a otro, para finalmente detenerse en un estado final o de aceptación, que

representa la salida.

La finalidad de los autómatas finitos es la de reconocer lenguajes regulares,

que corresponden a los lenguajes formales más simples según la Jerarquía de

Chomsky.

Historia y Origen

El origen de los autómatas finitos probablemente se remonta a su uso implícito

en máquinas electromecánicas, desde principios del siglo XX. Ya en 1907, el

matemático ruso Andréi Márkov formalizó un proceso llamado cadena de Markov,

donde la ocurrencia de cada evento depende con una cierta probabilidad del

evento anterior.2 Esta capacidad de "recordar" es utilizada posteriormente por los

autómatas finitos, que poseen una memoria primitiva similar, en que la activación
de un estado también depende del estado anterior, así como del símbolo o palabra

presente en la función de transición.

Posteriormente, en 1943, surge una primera aproximación formal de los

autómatas finitos con el modelo neuronal de McCulloch-Pitts. Durante la década

de 1950 prolifera su estudio, frecuentemente llamándoseles máquinas de

secuencia; se establecen muchas de sus propiedades básicas, incluyendo su

interpretación como lenguajes regulares y su equivalencia con las expresiones

regulares. Al final de esta década, en 1959, surge el concepto de autómata finito

no determinista en manos de los informáticos teóricos Michael O. Rabin y Dana

Scott.

En la década de 1960 se establece su conexión con las series de potencias y

los sistemas de sobre escritura. Finalmente, con el desarrollo del sistema

operativo Unix en la década de 1970, los autómatas finitos encuentran su nicho en

el uso masivo de expresiones regulares para fines prácticos, específicamente en

el diseño de analizadores léxicos (comando  lex ) y la búsqueda y reemplazo de

texto (comandos  ed  y  grep ).5 A partir de ese tiempo, los autómatas finitos

también se comienzan a utilizar en sistemas dinámicos.

Definición Formal
Representación como diagrama de estados

Los autómatas finitos se pueden representar mediante grafos particulares,

también llamados diagramas de estados finitos, de la siguiente manera:

 Los estados Q se representan como vértices, etiquetados con su nombre en el

interior.

 Una transición δ desde un estado a otro, dependiente de un símbolo del

alfabeto, se representa mediante una arista dirigida que une a estos vértices, y

que está etiquetada con dicho símbolo.

 El estado inicial q0 se caracteriza por tener una arista que llega a él,

proveniente de ningún otro vértice.

 El o los estados finales F se representan mediante vértices que están

encerrados a su vez por otra circunferencia.

Representación como tabla de transiciones


Otra manera de describir el funcionamiento de un autómata finito es mediante

el uso de tablas de transiciones o matrices de estados. Dos posibles tablas para el

ejemplo de la imagen anterior podrían ser las siguientes:

La primera representa explícitamente los parámetros y el valor que toma cada

ocurrencia de la función de transición.7 La segunda es más compacta, y marca con

una flecha el estado inicial, y con un asterisco los estados finales.

Funcionamiento

En el comienzo del proceso de reconocimiento de una cadena de entrada, el

autómata finito se encuentra en el estado inicial y a medida que procesa cada símbolo

de la cadena va cambiando de estado de acuerdo a lo determinado por la función de

transición. Cuando se ha procesado el último de los símbolos de la cadena de

entrada, el autómata se detiene en el estado final del proceso. Si el estado final en el

que se detuvo es un estado de aceptación, entonces la cadena pertenece al lenguaje

reconocido por el autómata; en caso contrario, la cadena no pertenece a dicho

lenguaje.
Arboles Binarios

En ciencias de la computación, un árbol binario es una estructura de datos en

la cual cada nodo puede tener un hijo izquierdo y un hijo derecho. No pueden

tener más de dos hijos (de ahí el nombre "binario"). Si algún hijo tiene como

referencia a null, es decir que no almacena ningún dato, entonces este es llamado

un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Usos

comunes de los árboles binarios son los árboles binarios de búsqueda,

los montículos binarios y Codificación de Huffman.

Teoría de Grafos

En teoría de grafos, se usa la siguiente definición: «Un árbol binario es un grafo

conexo, acíclico y no dirigido tal que el grado de cada vértice no es mayor a 2».

De esta forma solo existe un camino entre un par de nodos.

Un árbol binario con enraizado es como un grafo que tiene uno de sus vértices,

llamado raíz, de grado no mayor a 2. Con la raíz escogida, cada vértice tendrá un

único padre, y nunca más de dos hijos. Si rehusamos el requerimiento de la

conectividad, permitiendo múltiples componentes conectados en el grafo,

llamaremos a esta última estructura un bosque.

Tipos de Arboles Binarios


Un árbol binario es un árbol en el que ningún nodo puede tener más de dos

subárboles. En un árbol binario cada nodo puede tener cero, uno o dos hijos

(subárboles). Se conoce el nodo de la izquierda como hijo izquierdo y el nodo de

la derecha como hijo derecho.

Existen tipos de árboles binarios que suelen usarse para fines específicos, como:

 Árbol binario de búsqueda

 Árbol de Fibonacci

Recorridos Sobre Arboles Binarios

Recorridos en profundidad: El método de este recorrido es tratar de

encontrar de la cabecera a la raíz en nodo de unidad binaria. Ahora pasamos a ver

la implementación de los distintos recorridos:

Recorrido en pre orden: En este tipo de recorrido se realiza cierta acción

(quizás simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre

el nodo actual y posteriormente se trata el subárbol izquierdo y cuando se haya

concluido, el subárbol derecho. Otra forma para entender el recorrido con este

método sería seguir el orden: nodo raíz, nodo izquierda, nodo derecha.

En el árbol de la figura el recorrido en preorden sería: 2, 7, 2, 6, 5, 11, 5, 9 y 4.

Recorrido en postorden: En este caso se trata primero el subárbol izquierdo,

después el derecho y por último el nodo actual. Otra forma para entender el

recorrido con este método sería seguir el orden: nodo izquierda, nodo derecha,

nodo raíz. En el árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4,

9, 5 y 2.
Recorrido en inorden: En este caso se trata primero el subárbol izquierdo,

después el nodo actual y por último el subárbol derecho. En un ABB este recorrido

daría los valores de clave ordenados de menor a mayor. Otra forma para entender

el recorrido con este método sería seguir el orden: nodo izquierda, nodo raíz, nodo

derecha. En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 4,

9.

Recorridos en amplitud (o por niveles): En este caso el recorrido se realiza

en orden por los distintos niveles del árbol. Así, se comenzaría tratando el nivel 1,

que solo contiene el nodo raíz, seguidamente el nivel 2, el 3 y así sucesivamente.

En el árbol de la figura el recorrido en amplitud sería: 2, 7, 5, 2, 6, 9, 5, 11 y 4.

Al contrario que en los métodos de recorrido en profundidad, el recorrido por

niveles no es de naturaleza recursiva. Por ello, se debe utilizar una cola para

recordar los subárboles izquierdos y derecho de cada nodo.

El esquema algoritmo para implementar un recorrido por niveles es

exactamente el mismo que el utilizado en la versión iterativa del recorrido en

preorden pero cambiando la estructura de datos que almacena los nodos por una

cola.

Lenguajes

El lenguaje es un sistema compuesto por signos que sirve para transmitir

información.

Los signos que componen el lenguaje pueden ser sonoros (como los sonidos

que forman las palabras), gestuales (lenguaje corporal), escritos (letras o


símbolos) o icónicos (imágenes). En función del tipo de signos utilizados, existen

diferentes tipos de lenguajes:

 Lenguaje verbal

 Lenguaje no verbal

 Lenguaje natural

 Lenguaje artificial

 Lenguaje animal

Cuando los seres humanos se comunican, utilizan esos signos para crear un

mensaje, que luego será interpretado por otra persona o grupo de personas.

Tipos de Lenguaje

1.0 Lenguaje verbal

Es un tipo de lenguaje que requiere el uso de palabras para establecer la

comunicación. Dependiendo del tipo de signos utilizados, el lenguaje verbal puede

ser de dos tipos: oral o escrito.

1.1 Lenguaje oral

Requiere el uso de signos sonoros, que son los sonidos que hacemos para

formar palabras. Se caracteriza porque se aprende de forma natural, al estar en

contacto con hablantes de la misma lengua.


Un ejemplo de lenguaje oral es cuando enviamos una nota de voz.

1.2 Lenguaje escrito

Es un sistema compuesto por signos gráficos alfabéticos (letras) y numéricos.

Este sistema se caracteriza por tener reglas que deben ser aprendidas para poder

usar los signos correctamente y crear mensajes.

Un ejemplo de lenguaje escrito es cuando escribimos un correo electrónico.

2. Lenguaje no verbal

Es un tipo de lenguaje que utiliza recursos como imágenes, expresiones

faciales, o posturas corporales para crear un mensaje. Prescinde por completo del

uso de las palabras orales o escritas y se considera de vital importancia en el

proceso comunicativo debido a que puede ser un valioso complemento del

lenguaje verbal, aunque puede funcionar sin él.

El lenguaje no verbal se clasifica en:

2.1 Lenguaje icónico

Son todos los signos no verbales compuestos por imágenes (iconos). Para que

el proceso comunicativo pueda darse, este tipo de lenguaje debe ser consistente,

es decir, los iconos deben tener características específicas que puedan ser

comprendidas por la mayor cantidad de personas posible.


Un ejemplo de lenguaje icónico son las señales de tránsito, que pueden ser

comprendidas por cualquier conductor en casi todo el mundo, incluso aunque no

hable el idioma del lugar.

2.2 Lenguaje facial

Se refiere al conjunto de expresiones que hacemos con el rostro, de forma

intencional o no, para comunicar un mensaje. Aunque cada persona puede tener

sus propias expresiones, existen ciertos gestos faciales que son universales y que

por ello facilitan el proceso comunicativo.

Por ejemplo, cuando estamos alegres solemos sonreír y entrecerrar los ojos de

tal forma que se forman unas pequeñas arrugas alrededor de los ojos. En cambio,

cuando sentimos miedo tendemos a abrir mucho los ojos porque es una respuesta

del sistema nervioso para ayudarnos a ampliar nuestro campo visual y detectar el

peligro.

2.3 Lenguaje corporal

También llamado kinésica, son los movimientos o posturas corporales que

comunican un mensaje específico. Estas expresiones pueden variar según la

cultura y la interpretación del receptor del mensaje, sin embargo, hay signos

gestuales que son compartidos en casi todo el mundo.


Por ejemplo, el movimiento que hacemos con la cabeza como forma de decir

que sí, o entrecerrar el puño mostrando el dedo pulgar para expresar que estamos

de acuerdo con algo o que todo está bien.

2.4 Lenguaje táctil (háptica)

La háptica es una modalidad de lenguaje no verbal basado en los estímulos

que percibimos a través del tacto (sensaciones, texturas, temperatura,

movimiento, presión, etc).

Por ejemplo, en muchas culturas, especialmente en Occidente, un toque en el

hombro del interlocutor expresa cierto grado de confianza. El sistema Braille para

personas con discapacidad visual es otro ejemplo de lenguaje táctil.

2.5 Proxémica

La proxémica es un tipo de lenguaje no verbal referido al uso de nuestro

espacio personal. Se expresa en un sistema de gestos, posturas o movimientos

con los que gestionamos la distancia entre nuestro espacio corporal y el de

nuestro interlocutor.

La proxémica está influenciada por creencias personales, factores sociales y

culturales.Por esta razón, no solo depende del emisor del mensaje, sino de la

interpretación que haga el interlocutor y del valor o significado que ese gesto tenga

en esa cultura.
Por ejemplo, en muchos países de Latinoamérica es común que la distancia

entre el emisor y el receptor sea muy corta. Pero en otras culturas este gesto

puede ser interpretado como una actitud invasiva e incluso agresiva.

2.6 Paralenguaje

Es un tipo de lenguaje no verbal que toma en cuenta la cualidad de la voz. Está

compuesto por el tono, el volumen, el acento, las pausas, las onomatopeyas, los

silencios y las interjecciones.

El paralenguaje no tiene que ver con lo que se dice, sino con la forma en cómo

se comunica el mensaje. Por ello, es un complemento del lenguaje verbal oral.

Por ejemplo, cuando esperamos una respuesta afirmativa de nuestro

interlocutor y este responde que sí pero en un tono muy bajo, puede ser

interpretado como indecisión.

3. Lenguaje natural

Es el sistema de comunicación que aprendemos de manera innata, en principio

desde el entorno familiar y luego como resultado de la interacción social. El

lenguaje natural, en otras palabras, es nuestro idioma materno e incluye las

expresiones verbales y no verbales.


Un ejemplo de lenguaje natural son las palabras “mamá” y “papá”, que en

muchos casos constituyen las primeras expresiones orales de los bebés, como

resultado de su proceso de aprendizaje de la lengua materna.

4. Lenguaje artificial

También llamados lenguajes formales, son sistemas de comunicación creados

por el ser humano para expresar con precisión ideas de áreas de conocimiento

específicas, por lo que suelen tener sus propios signos y reglas. Algunos tipos de

lenguaje artificial son:

4.1 Lenguaje matemático

Es el sistema de comunicación diseñado para expresar conceptos de la

matemática. Está compuesto por signos alfanuméricos (letras y números), así

como una serie de símbolos generados para representar operaciones

matemáticas (+, -, x, %, =, etc.).

Por ejemplo, la ecuación 3 (x + 4) - 2 (2+2x) = 3 (x - 6x +12+2) es una

expresión de lenguaje matemático.

4.2 Lenguaje de programación

Es el sistema que permite crear las instrucciones que regulan el funcionamiento

de los componentes físicos y lógicos de una computadora.


Las instrucciones o secuencias, llamadas algoritmos, se expresan con código

binario, un sistema que requiere el uso de los valores uno (1) y cero (0).

Ejemplos de lenguaje de programación serían Javascript, C + + o Perl.

4.3 Lenguaje musical

Es un tipo de lenguaje artificial diseñado para componer, leer e interpretar

composiciones musicales. Tiene sus propios signos y reglas de lectura y escritura.

Un ejemplo de la expresión del lenguaje musical son las partituras, en donde

pueden verse los signos empleados para representar gráficamente la duración de

una nota.

5. Lenguaje animal

Se refiere al sistema de señales que usan los animales para comunicarse.

Aunque se suele conocer como “lenguaje animal”, la denominación es incorrecta,

ya que el lenguaje es un sistema de comunicación exclusivo de los seres

humanos. El término correcto es sistema de comunicación animal.

Esto incluye señales visuales (color de piel, pelaje o plumaje), sonoras (sonidos

característicos) u olfativas (olores).

Un ejemplo de los sistemas de comunicación animal son los diferentes tipos de

sonidos de las ballenas (llamados coloquialmente “cantos”), los cuales son


utilizados para comunicarse en diferentes eventos, como el apareamiento o la

migración.

Cerradura de Kleen

Clausura de Kleene. En Lingüística, Matemáticas e Informática y en la Teoría

de lenguajes formales se refiere a la operación unitaria de lenguajes que identifica

a la concatenación sucesiva de ninguna o más veces de todas y cada una de las

cadenas que conforman al lenguaje en cuestión.

Sean los lenguajes formales A y B el producto concatenacional,

denotado AxB se define por AxB, al conjunto de todas las cadenas ab donde a es

cada cadena de A y b todas las cadenas de B, es

decir  .

Sea el lenguaje formal L se define a la operación potencia concatenacional n-

ésima de L y denotada Ln' según las definiciones:

 L0={ε}.

 L1=L.

 L2=LxL={a1a1,a1a2} para todas las cadenas ai y aj de L.

 Ln=LxLn-1. (Definición recursiva).

Sea un lenguaje formal L={a,b,c,...}, se llama clausura de Kleene a la operación

sobre el lenguaje L y denotado L* a la unión de lenguajes.

También existe la clausura positiva de Kleene que se denota L+=L*-L0.


Ejemplos

 Sea el lenguaje L={a}, L*={ε,a,aa,aaa,aaaa,...}.

 Sea un B={0,1} lenguaje formal, B*={ε,0,1,00,01,10,11,000,001,010,011,...}.

 Sea la expresión regular e1* el AF equivalente toma la forma:

donde T(e1) es el AFND-V resultante de las expresión e1..

Consecuencias

La clausura de Kleene reviste gran importancia en la teoría de lenguajes

formales y la operatoria básica de los mismos, pues permite representar lenguajes

obtenidos de concatenaciones recurrentes y otros formalismos de gran uso en

todos los tipos de lenguajes de la jerarquía de Chomsky.

Por ejemplo, en los lenguajes regulares es común la representación de

versiones más simples como las clasuras en las expresiones regulares,

permitiendo una estrecha interrelación entre los distintos tipos de formas de

reconocimiento y representación de lenguajes regulares, en autómatas

finitos y gramáticas regulares.

Similar ocurre en reducciones de LLC como son los LL(k) y los LR(k).


Expresiones Regulares

Las expresiones regulares son una serie de caracteres que forman un patrón,

normalmente representativo de otro grupo de caracteres mayores, de tal forma

que podemos comparar el patrón con otro conjunto de caracteres para ver las

coincidencias. El objetivo de las expresiones regulares es representar todos los

posibles lenguajes definidos sobre un alfabeto Σ, en base a una serie de lenguajes

primitivos, y unos operadores de composición.

Dado un alfabeto Σ, las expresiones regulares sobre Σ se definen de forma

recursiva por las siguientes reglas: 

    1. Las siguientes expresiones son expresiones regulares primitivas:

 ∅

  λ

 a, siendo a ∈ Σ

    2. Sean α y β expresiones regulares, entonces son expresiones regulares

derivadas:

 α+β (unión)

 α.β (o simplemente αβ) (concatenación)

 α* (cierre)

 (α) 
    3. No hay más expresiones regulares sobre Σ que las construidas mediante

estas reglas. 

Operadores de las expresiones regulares

Las expresiones regulares denotan lenguajes. Por ejemplo, la expresión regular

01*+10* define el lenguaje que consta de todas las cadenas que comienzan con

un 0 seguido de cualquier número de 1s o que comienzan por un 1 seguido de

cualquier número de 0s.

Antes de describir la notación de las expresiones regulares, tenemos que

estudiar las tres operaciones sobre los lenguajes que representan los operadores

de las expresiones regulares. Estas operaciones son:

    1. La unión de dos lenguajes L y M, designada como L ∪ M, es el conjunto de

cadenas que pertenecen a L, a M o a ambos. Por ejemplo, si L={001,10,111}

y M = {ε ,001}, entonces L ∪ M = {ε ,10,001,111}.

    2. La concatenación de los lenguajes L y M es el conjunto de cadenas que se

puede formar tomando cualquier cadena de L y concentrándola con cualquier

cadena de M. Para designar la concatenación de lenguajes se emplea el punto o

ningún operador en absoluto, aunque el operador de concatenación

frecuentemente se llama “punto”. Por ejemplo, si L={001,10,111} y M = {ε ,001},


entonces L.M, o simplemente LM, es {001,10,111,001001,10001,111001}. Las tres

primeras cadenas de LM son las cadenas de L concatenadas con ε . Puesto que ε

es el elemento identidad para la concatenación, las cadenas resultantes son las

mismas cadenas de L. Sin embargo, las tres últimas cadenas de LM se forman

tomando cada una de las cadenas de L y concatenándolas con la segunda cadena

de M, que es 001. 

    3. La clausura (o asterisco, o clausura de Kleene) de un lenguaje L se designa

mediante L^*y representa el conjunto de cadenas que se pueden formar tomando

cualquier número de cadenas de L, posiblemente con repeticiones (es decir, la

misma cadena se puede seleccionar más de una vez) y concatenando todas ellas.

Por ejemplo, si L = {0,1}, entonces L^*es igual a todas las cadenas de 0s y 1s. Si L

= {0,11}, entonces L^(* )constará de aquellas cadenas de 0s y 1s tales que los 1s

aparezcan por parejas, como por ejemplo 011,11110 y ε , pero no 01011 ni 101.

Más formalmente, L* es la unión infinita ∪(i≥0) L^i, donde L^0=(ε),L^1=L y L^i, para

i>1 es LL• • •L (la concatenación de i copias de L).

Construcción de expresiones regulares

Caso Base. El caso básico consta de tres partes:

    1. Las constantes ε y ∅ son expresiones regulares, que representan a los

lenguajes {ε } y Ø, respectivamente. Es decir, L(ε)= {ε }y L(∅)= ∅.

    2. Si a es cualquier símbolo, entonces a es una expresión regular. Esta

expresión representa el lenguaje {a}. Es decir, L(a)={a}. 


    3. Una variable, normalmente escrita en mayúsculas e itálicas, como L,

representa cualquier lenguaje.

Paso Inductivo. Existen cuatro partes en el paso de inducción, una para cada

uno de los tres operadores y otra para la introducción de paréntesis.

    1. Si E y F son expresiones regulares, entonces E+F es una         expresión

regular que representa la unión de L(E)y L(F). Es decir, L(E+F)= L(E)∪ L(F).

    2. Si E y F son expresiones regulares, entonces EF es una expresión regular

que representa la concatenación de L(E)y L(F). Es decir, L(EF)=L(E)L(F).

    3. Si E es una expresión regular, entonces E* es una expresión regular, que

representa la clausura de L(E). Es decir, L(E*)=(L(E))*

    4. Si E es una expresión regular, entonces (E), una E encerrada entre

paréntesis, es también una expresión regular, que representa el mismo lenguaje

que E. Formalmente; L((E))=L(E).

Precedencia de los Operadores en las Expresiones Regulares

Como con otras álgebras, los operadores de las expresiones regulares tienen

un orden de “precedencia” prefijado, lo que significa que se asocian con sus

operando en un determinado orden. El orden de precedencia de los operadores es

el siguiente:
    1. El operador asterisco (*) es el de precedencia más alta. Es decir, se aplica

sólo a la secuencia más corta de símbolos a su izquierda que constituye una

expresión regular bien formada.

    2. El siguiente en precedencia es el operador de concatenación, o “punto”.

Después de aplicar todos los operadores * a sus operando, aplicamos los

operadores de concatenación a sus operando. Es decir, todas las expresiones

yuxtapuestas (adyacentes sin ningún operador entre ellas). Dado que la

concatenación es una operación asociativa, no importa en qué orden se realicen

las sucesivas concatenaciones, aunque si hay que elegir, las aplicaremos por la

izquierda. 

    3. Por último, se aplican todos los operadores de unión (+) a sus operando.

Dado que la unión también es asociativa, de nuevo no importa en que orden se

lleven a cabo, pero supondremos que se calculan empezando por la izquierda.

En ocasiones no se desea que una expresión regular sea agrupada según la

precedencia de los operadores. En dicho caso, se puede emplear paréntesis ( )

para agrupar los operando de la forma que se desee. Además, nunca está de más

encerrar entre paréntesis los operando que se quieran agrupar, incluso aunque la

agrupación deseada sea la prevista por las reglas de precedencia.

También podría gustarte