En informática , en el área de la teoría del lenguaje formal , se hace uso frecuente de una variedad de funciones de cadena ; sin embargo, la notación utilizada es diferente de la utilizada para la programación de computadoras , y algunas funciones comúnmente utilizadas en el ámbito teórico rara vez se usan al programar. Este artículo define algunos de estos términos básicos.
Una cadena es una secuencia finita de caracteres. La cadena vacía se indica con . La concatenación de dos cadenas y se denota por , o más brevemente por . Concatenar 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 conjunto habituales como unión, intersección, etc., la concatenación se puede aplicar a los idiomas: si ambos y son idiomas, 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 a menudo se omite por motivos de brevedad.
El lenguaje que consta únicamente de una cadena vacía debe distinguirse del lenguaje vacío . Concatenar cualquier idioma con el primero no genera ningún cambio: , mientras que concatenar con el segundo siempre produce el idioma vacío: . La concatenación de lenguas es asociativa: .
Por ejemplo, abreviando , el conjunto de todos los números decimales de tres cifras 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 en particular. 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 sea Σ su alfabeto. Una sustitución de cadena o simplemente una sustitución es una asignació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 Δ. Este mapeo puede extenderse a cadenas como
para la cadena vacía ε, y
para cadena s ∈ L y carácter a ∈ Σ. Las sustituciones de cadenas se pueden extender a idiomas completos como [1]
Los lenguajes regulares se cierran bajo sustitución de cadenas. Es decir, si cada carácter del alfabeto de un idioma normal se sustituye por otro idioma normal, el resultado sigue siendo un idioma normal. [2] De manera similar, los lenguajes libres de contexto se cierran bajo 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 cuerdas, tenemos, por ejemplo
Para la extensión de f uc a idiomas, 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 se reemplaza por una sola cadena. Es decir, donde hay una cadena para cada carácter . [nota 2] [4]
Los homomorfismos de cadenas son morfismos monoides en el monoide libre , que preservan la cadena vacía y la operación binaria de concatenación de cadenas . Dado un lenguaje , el conjunto se llama imagen homomórfica de . La imagen homomórfica inversa de una cuerda 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 lenguas 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 cadena es libre de ε (o libre de e) si es para todo a en el alfabeto . Los cifrados de sustitución de una sola letra simples son ejemplos de homomorfismos de cadenas (libres de ε).
También se puede obtener un ejemplo de homomorfismo de cadena 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 caracteres de puntuación. Ejemplos de imágenes homomórficas inversas son
Para este último idioma, g uc ( g uc −1 ({ ‹A›, ‹bb› })) = g uc ({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› } . El homomorfismo g uc no está libre de ε, ya que asigna, por ejemplo, ‹0› a ε.
Un ejemplo de homomorfismo de cadena muy simple que asigna cada carácter a solo un carácter es la conversión de una cadena codificada con 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 . Está escrito como . Se define formalmente eliminando los caracteres del lado derecho:
Aquí denota la cadena vacía . La proyección de una cuerda es esencialmente la misma que una proyección en álgebra relacional .
La proyección de cuerdas puede promoverse a la proyección de un idioma . Dado un lenguaje formal L , su proyección viene 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. De este modo:
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, realizando operaciones a la izquierda de una cadena. [ cita necesaria ]
Hopcroft y Ullman (1979) definen el cociente L 1 / L 2 de las lenguas L 1 y L 2 sobre el mismo alfabeto como L 1 / L 2 = { s | ∃ t ∈ L 2 . st ∈ L 1 } . [7] Esta 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 manera 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. esta dado por
La relación es claramente de índice finito (tiene un número finito de clases de equivalencia) si y sólo si los cocientes de derechos familiares son finitos; 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 necesaria ]
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 es cancelable:
Claramente, cancelación correcta y conmutación de proyección :
Los prefijos de una cadena es el conjunto de todos los prefijos de una cadena, con respecto a un idioma determinado:
dónde .
El prefijo cerrado de un idioma 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 orden de prefijo . [ cita necesaria ]