En informática , en el área de teoría de lenguajes formales , se utilizan con frecuencia diversas funciones de cadena ; sin embargo, la notación utilizada es diferente a la que se utiliza en programación informática , y algunas funciones de uso común en el ámbito teórico rara vez se utilizan en la programación. En este artículo se definen algunos de estos términos básicos.
Una cadena es una secuencia finita de caracteres. La cadena vacía se denota por . La concatenación de dos cadenas y se denota por , o más corta por . La concatenación con la cadena vacía no hace ninguna diferencia: . La concatenación de cadenas es asociativa : .
Por ejemplo, .
Un lenguaje es un conjunto finito o infinito de cadenas. Además de las operaciones de conjuntos habituales, como unión, intersección, etc., la concatenación se puede aplicar a los lenguajes: si tanto y son lenguajes, su concatenación se define como el conjunto de concatenaciones de cualquier cadena de y cualquier cadena de , formalmente . Nuevamente, el punto de concatenación se omite a menudo por razones de brevedad.
El lenguaje que consiste únicamente en la cadena vacía debe distinguirse del lenguaje vacío . La concatenación de cualquier lenguaje con el primero no produce ningún cambio: , mientras que la concatenación con el segundo siempre produce el lenguaje vacío: . La concatenación de lenguajes es asociativa: .
Por ejemplo, al abreviar , el conjunto de todos los números decimales de tres dígitos se obtiene como . El conjunto de todos los números decimales de longitud arbitraria es un ejemplo de un lenguaje infinito.
El alfabeto de una cadena es el conjunto de todos los caracteres que aparecen en una cadena determinada. Si s es una cadena, su alfabeto se denota por
El alfabeto de un idioma es el conjunto de todos los caracteres que aparecen en cualquier cadena de , formalmente: .
Por ejemplo, el conjunto es el alfabeto de la cadena , y lo anterior es el alfabeto del idioma anterior, así como del idioma de todos los números decimales.
Sea L un idioma y Σ su alfabeto. Una sustitución de cadena o simplemente una sustitución es una aplicación f que asigna caracteres en Σ a idiomas (posiblemente en un alfabeto diferente). Así, por ejemplo, dado un carácter a ∈ Σ, se tiene f ( a )= L a donde L a ⊆ Δ * es algún idioma cuyo alfabeto es Δ. Esta aplicación se puede extender a cadenas como
para la cadena vacía ε, y
para la cadena s ∈ L y el carácter a ∈ Σ. Las sustituciones de cadenas se pueden extender a idiomas enteros como [1]
Los lenguajes regulares están cerrados a la sustitución de cadenas. Es decir, si cada carácter del alfabeto de un lenguaje regular se sustituye por otro lenguaje regular, el resultado sigue siendo un lenguaje regular. [2] De manera similar, los lenguajes libres de contexto están cerrados a la sustitución de cadenas. [3] [nota 1]
Un ejemplo sencillo es la conversión de f uc (.) a mayúsculas, que puede definirse, por ejemplo, de la siguiente manera:
Para la extensión de f uc a cadenas, tenemos por ejemplo
Para la extensión de f uc a los lenguajes, tenemos por ejemplo
Un homomorfismo de cadenas (a menudo denominado simplemente homomorfismo en la teoría del lenguaje formal ) es una sustitución de cadenas tal que cada carácter es reemplazado por una sola cadena. Es decir, , donde es una cadena, para cada carácter . [nota 2] [4]
Los homomorfismos de cadenas son morfismos monoides sobre el monoide libre , que conservan la cadena vacía y la operación binaria de concatenación de cadenas . Dado un lenguaje , el conjunto se denomina imagen homomórfica de . La imagen homomórfica inversa de una cadena se define como
Mientras que la imagen homomórfica inversa de una lengua se define como
En general, si bien uno tiene
y
Para cualquier idioma .
La clase de lenguajes regulares está cerrada bajo homomorfismos y homomorfismos inversos. [5] De manera similar, los lenguajes libres de contexto están cerrados bajo homomorfismos [nota 3] y homomorfismos inversos. [6]
Se dice que un homomorfismo de cadenas es ε-libre (o e-libre) si para todos los a en el alfabeto . Los cifrados de sustitución de una sola letra son ejemplos de homomorfismos de cadenas (ε-libres).
También se puede obtener un ejemplo de homomorfismo de cadenas g uc definiendo una sustitución similar a la anterior: g uc (‹a›) = ‹A›, ..., g uc (‹0›) = ε, pero dejando que g uc no esté definido en los caracteres de puntuación. Ejemplos de imágenes homomórficas inversas son
Para el último lenguaje, g uc ( g uc −1 ({ ‹A›, ‹bb› })) = g uc ({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› }. El homomorfismo g uc no es ε-libre, ya que asigna, por ejemplo, ‹0› a ε.
Un ejemplo muy simple de homomorfismo de cadenas que asigna cada carácter a solo un carácter es la conversión de una cadena codificada en EBCDIC a ASCII .
Si s es una cadena y es un alfabeto, la proyección de cadena de s es la cadena que resulta de eliminar todos los caracteres que no están en . Se escribe como . Se define formalmente mediante la eliminación de caracteres del lado derecho:
Aquí se denota la cadena vacía . La proyección de una cadena es esencialmente la misma que una proyección en álgebra relacional .
La proyección de cadenas puede convertirse en la proyección de un lenguaje . Dado un lenguaje formal L , su proyección está dada por
El cociente derecho de un carácter a de una cadena s es el truncamiento del carácter a en la cadena s , desde el lado derecho. Se denota como . Si la cadena no tiene a en el lado derecho, el resultado es la cadena vacía. Por lo tanto:
El cociente de la cadena vacía se puede tomar:
De manera similar, dado un subconjunto de un monoide , se puede definir el subconjunto cociente como
Los cocientes izquierdos se pueden definir de manera similar, con operaciones que tienen lugar a la izquierda de una cadena. [ cita requerida ]
Hopcroft y Ullman (1979) definen el cociente L 1 / L 2 de los idiomas L 1 y L 2 sobre el mismo alfabeto como L 1 / L 2 = { s | ∃ t ∈ L 2 . st ∈ L 1 } . [7] Esto no es una generalización de la definición anterior, ya que, para una cadena s y caracteres distintos a , b , la definición de Hopcroft y Ullman implicaproduciendo {}, en lugar de { ε }.
El cociente izquierdo (cuando se define de forma similar a Hopcroft y Ullman 1979) de un lenguaje singleton L 1 y un lenguaje arbitrario L 2 se conoce como derivada de Brzozowski ; si L 2 está representado por una expresión regular , también puede serlo el cociente izquierdo. [8]
El cociente derecho de un subconjunto de un monoide define una relación de equivalencia , llamada relación sintáctica derecha de S. Viene dada por
La relación es claramente de índice finito (tiene un número finito de clases de equivalencia) si y sólo si el cociente de derechos de la familia es finito; es decir, si
es finito. En el caso de que M sea el monoide de palabras sobre algún alfabeto, S es entonces un lenguaje regular , es decir, un lenguaje que puede ser reconocido por un autómata de estados finitos . Esto se analiza con mayor detalle en el artículo sobre monoides sintácticos . [ cita requerida ]
La cancelación correcta de un carácter a de una cadena s es la eliminación de la primera aparición del carácter a en la cadena s , comenzando desde el lado derecho. Se denota como y se define recursivamente como
La cadena vacía siempre se puede cancelar:
Claramente, cancelación correcta y conmuta proyección :
Los prefijos de una cadena son el conjunto de todos los prefijos de una cadena, con respecto a un idioma determinado:
dónde .
El prefijo de cierre de una lengua es
Ejemplo:
Un idioma se llama prefijo cerrado si .
El operador de cierre de prefijo es idempotente :
La relación de prefijo es una relación binaria tal que si y sólo si . Esta relación es un ejemplo particular de un orden de prefijo . [ cita requerida ]