Teoría de autómatas y lenguajes formales

Introducción

¿Por qué?

La teoría de autómatas es una parte fundamental para las ciencias de la computación con múltiples usos y aplicaciones:

  • Diseñar y pruebas de circuitos digitales
  • Analizadores léxicos
  • Exploración de cuerpos de texto de gran tamaño
  • Verificación de sistemas con un número finito de estados, como protocolos de comunicación o intercambio de información

Un autómata simple

Representación

Generalmente usamos grafos dirigidos para representar autómatas, pero hay dos representaciones de particular importancia para su estudio y aplicaciones en ciencias de la computación:

  1. Gramáticas, usadas para procesar datos con estructuras recursivas
  2. Expresiones regulares, usadas para especificar estructuras de texto

Complejidad computacional

La computación tiene límites:

  • Decidibilidad, ¿qué es lo que puede hacer una computadora?
  • Intratabilidad, ¿qué puede hacer una computadora de manera eficiente?

Alfabetos

Un alfabeto es un conjunto de símbolos finito y no vacío, designado mediante la letra Σ, por ejemplo:

  • Σ = {0,1}, el alfabeto binario
  • Σ = {a,b, . . . , z}, el conjunto de todas las letras minúsculas
  • El conjunto de todos los caracteres ASCII

Cadenas

Una cadena  o palabra es una secuencia finita de símbolos de algún alfabeto, y se denotan por letras altas del alfabeto (normalmente de la w en adelante)

 

Todos los alfabetos cuentan con una cadena vacía, formada por ningún elemento y representada por la letra ε

 

Todas las cadenas tienen una longitud que es igual al número de símbolos que la conforman y se denota por |w|

 

Si queremos expresar todas las cadenas de longitud k de un alfabeto, o su potencia, lo hacemos mediante la notación Σk

Cadenas

Σ* denota, entonces, el conjunto de todas las cadenas de un alfabeto

\Sigma^* = \Sigma^0 \cup \Sigma^1 \cup \Sigma^2 \cup \Sigma^3 ...

De donde se desprende:

\Sigma^+ = \Sigma^1 \cup \Sigma^2 \cup \Sigma^3 ...
\Sigma^* = \Sigma^+ \cup \{\epsilon\}

Cadenas

Por último, podemos hacer concatenación de dos cadenas x, y, poniendo los elementos de la segunda después de la primera

x = a_1 a_2 a_3 ... a_i
y = b_1 b_2 b_3 ... a_j
xy = a_1 a_2 a_3...a_ib_1b_2b_3...b_j
|xy| = i + j

Lenguajes

Un lenguaje L de Σ es un conjunto de cadenas tal que todas son elementos de Σ*

L \subseteq \Sigma^*

Σ* es un lenguaje para cualquier alfabeto Σ

 es un lenguaje de cualquier alfabeto

{ε} es un lenguaje de cualquier alfabeto

\emptyset \neq \{\epsilon\}