# Lenguaje formal

En matemáticas, lógica y ciencias de la computación, un lenguaje formal es un lenguaje cuyos símbolos son primitivos y las reglas para unir esos símbolos están formalmente especificadas. Al conjunto de los símbolos primitivos se le llama el alfabeto (o vocabulario) del lenguaje, y al conjunto de las reglas se le llama la gramática formal (o sintaxis). A una cadena de símbolos formada de acuerdo a la gramática se le llama una fórmula bien formada (o palabra) del lenguaje. Estrictamente hablando, un lenguaje formal es idéntico al conjunto de todas sus fórmulas bien formadas.
Por ejemplo, un alfabeto podría ser el conjunto {a,b}, y una gramática podría definir a las fórmulas bien formadas como aquellas que tienen el mismo número de símbolos a que b. Entonces, algunas fórmulas bien formadas del lenguaje serían: ab, ba, abab, ababba, etc., y el lenguaje formal sería el conjunto de todas esas fórmulas bien formadas.
Para algunos lenguajes formales existe una semántica formal que puede interpretar y dar significado a las fórmulas bien formadas del lenguaje. Sin embargo, una semántica formal no es condición necesaria para definir un lenguaje formal, y eso es una diferencia esencial con los lenguajes naturales.
En algunos lenguajes formales, la palabra vacía (esto es, la cadena de símbolos de longitud cero) está permitida, notándose frecuentemente mediante $\varepsilon \,$, $e\,$ o $\lambda \,$.

## Ejemplo de lenguajes formales

* La Numeración de Gödel {a$^n$ : a es un número primo y n un número de Gödel}.
* El conjunto de todos los programas sintácticamente válidos en un determinado lenguaje de programación.
* El conjunto de todas las fórmulas bien formadas en la lógica de primer orden.

## Especificación de lenguajes formales

Los lenguajes formales se pueden especificar de una amplia variedad de formas, como por ejemplo:
(Si el lenguaje es regular)
* Cadenas producidas por una gramática formal (véase la jerarquía de Chomsky).
* Cadenas descritas por una expresión regular.
* Cadenas aceptadas por un autómata, tal como una máquina de Turing o autómata finito.
Las cadenas están formadas por un conjunto de símbolos que pertenecen a un mismo lenguaje, existen dos formas de componer una sentencia o función con los símbolos:
* Sintaxis
* Semántica

## Operaciones

Se pueden utilizar varias operaciones para producir nuevos lenguajes a partir de otros datos. Supóngase que L$_1$ y L$_2$ son lenguajes sobre un alfabeto común. Entonces:
* La concatenación L$_1$L$_2$ consiste de todas aquellas palabras de la forma vw donde v es una palabra de L$_1$ y w es una palabra de L$_2$
* La intersección L$_1$&L$_2$ consiste en todas aquellas palabras que están contenidas tanto en L$_1$ como en L$_2$
* La unión L$_1$|L$_2$ consiste en todas aquellas palabras que están contenidas ya sea en L$_1$ o en L$_2$
* El complemento ~L$_1$ consiste en todas aquellas palabras producibles sobre el alfabeto de L$_1$ que no están ya contenidas en L$_1$
* El cociente L$_1$/L$_2$ consiste de todas aquellas palabras v para las cuales existe una palabra w en L$_2$ tales que vw se encuentra en L$_1$
* La estrella L$_1$$^*$(Llamada también clausura de Kleene del lenguaje L$_1$) consiste de todas aquellas palabras que pueden ser escritas de la forma W$_1$W$_2$...W$_n$ donde todo W$_i$ se encuentra en L$_1$ y n ≥ 0. (Nótese que esta definición incluye a λ en cualquier L*)
* La Clausura positiva L$_1$$^+$ consiste de todas aquellas palabras que pueden ser escritas de la forma W$_1$W$_2$...W$_n$ donde todo W$_i$ se encuentra en L$_1$ y n > 0. (Difiere de la clausura de Kleene ya que contiene a λ si y solo si L$_1$ contiene a λ)
* La intercalación L$_1$*L$_2$ consiste de todas aquellas palabras que pueden ser escritas de la forma v$_1$w$_1$v$_2$w$_2$...v$_n$w$_n$; son palabras tales que la concatenación v$_1$...v$_n$ está en L$_1$, y la concatenación w$_1$...w$_n$ está en L$_2$
Sean los $L_{i}$ lenguajes, de forma tal que para cada $i$ entonces $L_{i}$ esté formado por todas las palabras que pueden surgir de concatenar $i$ palabras del lenguaje $L$. Por ejemplo, si $L=\left\{v,w\right\}$, entonces $L_{3}=\left\{v.v.v,v.v.w,v.w.v,v.w.w,w.v.v,w.v.w,w.w.v,w.w.w\right\}$ En base al conceptor anterior pueden definirise la clausuras mencionadas anteriormente:
* La clausura de Kleene se denota formalmente: $L^{*}=\bigcup _{i\in \mathbb {N} _{0}}L_{i}=\left\{\lambda \right\}\cup L_{1}\cup L_{2}\cup L_{3}\cup \ldots \cup L_{i}$
* La clausura positiva se denota formalmente: $L^{+}=\bigcup _{i\in \mathbb {N} }L_{i}=L_{1}\cup L_{2}\cup L_{3}\cup \ldots \cup L_{i}$
Por lo tanto se deduce que $L^{*}=\left\{\lambda \right\}\cup L^{+}$
Una pregunta que se hace típicamente sobre un determinado lenguaje formal L es cuán difícil es decidir si incluye o no una determinada palabra v. Este tema es del dominio de la teoría de la computabilidad y la teoría de la complejidad computacional.
Por contraposición al lenguaje propio de los seres vivos y en especial el lenguaje humano, considerados lenguajes naturales, se denomina lenguaje formal a los lenguajes «artificiales» propios de las matemáticas o la informática, los lenguajes artificiales son llamados lenguajes formales (incluyendo lenguajes de programación). Sin embargo, el lenguaje humano tiene una característica que no se encuentra en los lenguajes de programación: la diversidad.
En 1956, Noam Chomsky creó la jerarquía de Chomsky para organizar los distintos tipos de lenguaje formal.

## Verdades concernientes a los lenguajes formales
### Teorema 1

    El conjunto de lenguajes en general (incluyendo los no formales) es incontable.

### Lema 1

    El conjunto de lenguajes en un alfabeto no vacío dado es incontable.
    Afirmar que un alfabeto es no vacío equivale a que ese alfabeto contenga al menos un símbolo, ergo, basta demostrar que el conjunto de lenguajes en el alfabeto $\{a\}\,$ es incontable. Como sabemos, un lenguaje L en $\{a\}\,$ es un subconjunto de $\{a\}^{*}\,$, esto nos lleva a la conclusión de que, el conjunto de todos los lenguajes en $\{a\}\,$ es justamente $2^{\{a\}^{*}}\,$ (el conjunto de todos los subconjuntos o conjunto potencia de $\{a\}^{*}\,$) y es evidente que $\{a\}^{*}\,$ es infinito (de hecho; contable), también ha sido demostrado que si $A$ es un conjunto infinito (contable o incontable), entonces $2^{A}$ es mayor que $A$ porque $2^{A}$ pasa a ser un conjunto infinito de órdenes del infinito, al ser mayor, no existirá biyección entre $A$ y $2^{A}$, lo que hace a $2^{A}$ un conjunto infinito incontable, la prueba ha finalizado. (ver Teorema de Cantor)

### Demostración del Teorema 1

    Puede derivarse fácilmente que la aseveración delineada en el Teorema 1 es verdadera, porque el conjunto de lenguajes en general es justamente una unión infinita de conjuntos del tipo $2^{A}$, donde $A$ es un conjunto infinito contable.

### Teorema 2

    Los lenguajes son conjuntos contables.
    Se sabe que un lenguaje $L$ en un alfabeto $\Sigma$ es un subconjunto de $\Sigma ^{*}$ y como ya se hizo mención, $\Sigma ^{*}$ es infinito contable, por ende, $L$ es como mucho un conjunto infinito contable (del mismo tamaño que $\Sigma ^{*}$), la prueba ha culminado.

### Teorema 3

    El conjunto de lenguajes formales es contable.
    Como sabemos un lenguaje formal puede ser generado por una gramática formal (o de estructura de frase), lo cual implica que todo lenguaje formal puede ser aceptado por una MT, lo que a su vez implica que se puede definir una biyección entre el conjunto de lenguajes formales y el conjunto de las MT´s (debido a la propiedad transitiva de la relación "existe biyección entre $A$ y $B$"). Para demostrar el teorema se utilizará el concepto de codificación de MT´s que se introduce en el estudio de las MT´s universales, generalmente se codifica una MT con una función que tiene precisamente como dominio al conjunto de las MT´s (lo llamaremos $X$) y como codominio $\{0,1\}^{*}\,$, esa función puede ser una biyección si el codominio pasa a ser Y (un subconjunto de $\{0,1\}^{*}\,$) y como $\{0,1\}^{*}\,$ es contable, ese subconjunto también será contable y como existe dicha biyección (entre $X$ e $Y$), la aserción ha sido demostrada, prueba concluida.

## Lenguajes libres de contexto

Los lenguajes formales derivados de un alfabeto que consta de una sola letra, conocida como lenguajes unarios, pueden ser considerados como conjuntos de números naturales, y las cuestiones de la representación de tales conjuntos mediante los dispositivos básicos de la teoría de lenguaje formal forman un tema especial de estudio. Los lenguajes unarios formales son básicamente conjuntos periódicos (Jez & Okhotin, 2007).
Los lenguajes unarios formales son caracterizados por sistemas de ecuaciones de lenguaje de la forma general:
${\begin{cases}X_{1}=\varphi _{1}{\biglX_{1},...,X_{n}{\bigr )},\\.\\.\\.\\X_{n}=\varphi _{n}{\biglX_{1},...,X_{n}{\bigr )}\\\end{cases}}$ (1)
Con operaciones diferentes y permitidas sobre su lado derecho. Los lenguajes libres de contexto o incontextuales se obtienen mediante el uso de la concatenación y unión del sistema. Como lo dice Jez & Okhotin (2007). Si la concatenación se limita a un solo lado lineal (es decir, cada concatenación que aparece en alguna parte derecha es de la forma w · φ por alguna cadena constante w), entonces las soluciones representan exactamente los lenguajes regulares. Por último, respaldando a los autómatas, como lo demuestra Okhotin (2004), se pueden simular mediante ecuaciones con unión, intersección y concatenación lineal de dos caras.
Cuando hablamos de lenguajes debemos considerar la gramática que los rigen. Barash & Okhotin (2014) nos dicen que las gramáticas libres de contexto se entienden mejor como una lógica para definir la sintaxis de los lenguajes. En esta lógica, las definiciones son inductivas, por lo que las propiedades de una cadena están determinadas por las propiedades de sus subseries. Así es como una regla S → aSb afirma que si una cadena a$^{n-1}$b$^{n1}$ tiene la propiedad S, entonces las cadenas a$^n$b$^n$ tienen la propiedad S también. Además de la concatenación, el formalismo de esta lógica incluye una operación de disyunción, representada por tener varias reglas para un único símbolo.