Articulo de referencia

Operaciones con cadenas

En informática , específicamente en el área de la teoría de lenguajes formales , se utilizan con frecuencia diversas funciones de cadena ; sin embargo, la notación empleada difi...

En informática , específicamente en el área de la teoría de lenguajes formales , se utilizan con frecuencia diversas funciones de cadena ; sin embargo, la notación empleada difiere de la utilizada en la programación , y algunas funciones comunes en el ámbito teórico rara vez se emplean en la programación. Este artículo define algunos de estos términos básicos.

Cadenas y lenguajes

Una cadena es una secuencia finita de caracteres. La cadena vacía se denota porε{\displaystyle \varepsilon }La concatenación de dos cadenass{\displaystyle s}yt{\displaystyle t}se denota porst{\displaystyle s\cdot t}, o más corto porst{\displaystyle st}Concatenar con la cadena vacía no supone ninguna diferencia:sε=s=εs{\displaystyle s\cdot \varepsilon =s=\varepsilon \cdot s}La concatenación de cadenas es asociativa :s(t)=(st){\displaystyle s\cdot (t\cdot u)=(s\cdot t)\cdot u}.

Por ejemplo,(bl)(εah)=blah=blah{\displaystyle (\langle b\rangle \cdot \langle l\rangle )\cdot (\varepsilon \cdot \langle ah\rangle )=\langle bl\rangle \cdot \langle ah\rangle =\langle blah\rangle }.

Un lenguaje es un conjunto finito o infinito de cadenas. Además de las operaciones de conjuntos habituales como la unión, la intersección, etc., la concatenación se puede aplicar a los lenguajes: si ambosS{\displaystyle S}yT{\displaystyle T}son los lenguajes, su concatenaciónST{\displaystyle S\cdot T}se define como el conjunto de concatenaciones de cualquier cadena deS{\displaystyle S}y cualquier cadena deT{\displaystyle T}formalmenteST={stsStT}{\displaystyle S\cdot T=\{s\cdot t\mid s\in S\land t\in T\}}. Nuevamente, el punto de concatenación{\displaystyle \cdot }A menudo se omite por brevedad.

El idioma{ε}{\displaystyle \{\varepsilon \}}Consistir únicamente en la cadena vacía debe distinguirse del lenguaje vacío.{}{\displaystyle \{\}}Concatenar cualquier idioma con el anterior no produce ningún cambio:S{ε}=S={ε}S{\displaystyle S\cdot \{\varepsilon \}=S=\{\varepsilon \}\cdot S}, mientras que al concatenar con este último siempre se obtiene el lenguaje vacío:S{}={}={}S{\displaystyle S\cdot \{\}=\{\}=\{\}\cdot S}La concatenación de lenguajes es asociativa:S(TU)=(ST)U{\displaystyle S\cdot (T\cdot U)=(S\cdot T)\cdot U}.

Por ejemplo, abreviarD={0,1,2,3,4,5,6,7,8,9}{\displaystyle D=\{\langle 0\rangle ,\langle 1\rangle ,\langle 2\rangle ,\langle 3\rangle ,\langle 4\rangle ,\langle 5\rangle ,\langle 6\rangle ,\langle 7\rangle ,\langle 8\rangle ,\langle 9\rangle \}}, el conjunto de todos los números decimales de tres dígitos se obtiene comoDDD{\displaystyle D\cdot D\cdot D}El conjunto de todos los números decimales de longitud arbitraria es un ejemplo de lenguaje infinito.

Alfabeto de una cadena

El alfabeto de una cadena es el conjunto de todos los caracteres que aparecen en una cadena particular. Si s es una cadena, su alfabeto se denota por

Alfa(s){\displaystyle \operatorname {Alph} (s)}

El alfabeto de un idiomaS{\displaystyle S}es el conjunto de todos los caracteres que aparecen en cualquier cadena deS{\displaystyle S}, formalmente: Alfa(S)=sSAlfa(s){\displaystyle \operatorname {Alph} (S)=\bigcup _{s\in S}\operatorname {Alph} (s)}.

Por ejemplo, el conjunto{a,do,o}{\displaystyle \{\langle a\rangle ,\langle c\rangle ,\langle o\rangle \}}es el alfabeto de la cadenadoadoao{\displaystyle \langle cacao\rangle }y lo anteriorD{\displaystyle D}es el alfabeto del idioma mencionado anteriormenteDDD{\displaystyle D\cdot D\cdot D}así como del lenguaje de todos los números decimales.

Sustitución de cadenas

Sea L un lenguaje y Σ su alfabeto. Una sustitución de cadenas , o simplemente una sustitución , es una función f que asigna caracteres de Σ a lenguajes (posiblemente con un alfabeto diferente). Así, por ejemplo, dado un carácter a ∈ Σ, se tiene f ( a )= L a donde L a ⊆ Δ * es algún lenguaje cuyo alfabeto es Δ. Esta función puede extenderse a cadenas como

f (ε)=ε

para la cadena vacía ε, y

f ( sa )= f ( s ) f ( a )

para cadena sL y carácter a ∈ Σ. Las sustituciones de cadenas pueden extenderse a lenguajes completos como [ 1 ].

F(L)=sLF(s){\displaystyle f(L)=\bigcup _{s\in L}f(s)}

Los lenguajes regulares son cerrados bajo 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 son cerrados bajo 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:

  • f uc (‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASSE›},
  • f uc (‹u2›) = {‹U›} ⋅ {ε} = {‹U›}, y
  • f uc (‹¡Vamos!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.

Para la extensión de f uc a los idiomas, tenemos, por ejemplo:

  • f uc ({ ‹Straße›, ‹u2›, ‹Go!› }) = { ‹STRASSE› } ∪ { ‹U› } ∪ { } = { ‹STRASSE›, ‹U› }.

homomorfismo de cadenas

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,F(a)=s{\displaystyle f(a)=s}, dóndes{\displaystyle s}es una cadena, para cada caráctera{\displaystyle a}. [ nota 2 ] [ 4 ]

Los homomorfismos de cadenas son morfismos de monoides en el monoide libre , que preservan la cadena vacía y la operación binaria de concatenación de cadenas . Dado un lenguajeL{\displaystyle L}, el conjuntoF(L){\displaystyle f(L)}se llama la imagen homomórfica deL{\displaystyle L}La imagen homomórfica inversa de una cadenas{\displaystyle s}se define como

F1(s)={wF(w)=s}{\displaystyle f^{-1}(s)=\{w\mid f(w)=s\}}

mientras que la imagen homomórfica inversa de un lenguajeL{\displaystyle L}se define como

F1(L)={sF(s)L}{\displaystyle f^{-1}(L)=\{s\mid f(s)\in L\}}

En general,F(F1(L))L{\displaystyle f(f^{-1}(L))\neq L}, mientras que uno sí tiene

F(F1(L))L{\displaystyle f(f^{-1}(L))\subseteq L}

y

LF1(F(L)){\displaystyle L\subseteq f^{-1}(f(L))}

para cualquier idiomaL{\displaystyle L}.

La clase de lenguajes regulares es cerrada bajo homomorfismos y homomorfismos inversos. [ 5 ] De manera similar, los lenguajes libres de contexto son cerrados bajo homomorfismos [ nota 3 ] y homomorfismos inversos. [ 6 ]

Se dice que un homomorfismo de cadenas es ε-libre (o e-libre) siF(a)ε{\displaystyle f(a)\neq \varepsilon }para todas las a en el alfabetoΣ{\displaystyle \Sigma }Los cifrados simples de sustitución de una sola letra son ejemplos de homomorfismos de cadenas (libres de ε).

Un ejemplo de homomorfismo de cadenas g uc también se puede obtener definiendo de forma similar a la sustitución anterior : g uc (‹a›) = ‹A›, ..., g uc (‹0›) = ε, pero dejando g uc indefinido en caracteres de puntuación. Ejemplos de imágenes homomórficas inversas son

  • g uc −1 ({ ‹SSS› }) = { ‹sss›, ‹sß›, ‹ßs› }, ya que g uc (‹sss›) = g uc (‹sß›) = g uc (‹ßs›) = ‹SSS›, y
  • g uc −1 ({ ‹A›, ‹bb› }) = { ‹a› }, ya que g uc (‹a›) = ‹A›, mientras que ‹bb› no puede ser alcanzado por g uc .

Para este último lenguaje, g uc ( g uc −1 ({ ‹A›, ‹bb› })) = g uc ({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› }. El homomorfismo g uc no es ε-libre, ya que mapea eg ‹0› a ε.

Un ejemplo muy simple de homomorfismo de cadenas que asigna cada carácter a un solo carácter es la conversión de una cadena codificada en EBCDIC a ASCII .

Proyección de cadena

Si s es una cadena, yΣ{\displaystyle \Sigma }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Σ{\displaystyle \Sigma }. Está escrito comoπΣ(s){\displaystyle \pi _{\Sigma }(s)\,}Se define formalmente eliminando caracteres del lado derecho:

πΣ(s)={εsi s=ε la cadena vacíaπΣ(t)si s=ta y aΣπΣ(t)asi s=ta y aΣ{\displaystyle \pi _{\Sigma }(s)={\begin{cases}\varepsilon &{\mbox{if }}s=\varepsilon {\mbox{ the empty string}}\\\pi _{\Sigma }(t)&{\mbox{if }}s=ta{\mbox{ and }}a\notin \Sigma \\\pi _{\Sigma }(t)a&{\mbox{if }}s=ta{\mbox{ and }}a\in \Sigma \end{cases}}}

Aquíε{\displaystyle \varepsilon }denota la cadena vacía . La proyección de una cadena es esencialmente lo mismo que una proyección en álgebra relacional .

La proyección de cadenas puede promoverse a la proyección de un lenguaje . Dado un lenguaje formal L , su proyección viene dada por

πΣ(L)={πΣ(s) | sL}{\displaystyle \pi _{\Sigma }(L)=\{\pi _{\Sigma }(s)\ \vert \ s\in L\}}

Cociente derecho e izquierdo

El cociente derecho de un carácter a de una cadena s es la truncación del carácter a en la cadena s , desde el lado derecho. Se denota comos/a{\displaystyle s/a}Si la cadena no tiene un carácter en el lado derecho, el resultado es una cadena vacía. Por lo tanto:

(sa)/b={ssi a=bεsi ab{\displaystyle (sa)/b={\begin{cases}s&{\mbox{if }}a=b\\\varepsilon &{\mbox{if }}a\neq b\end{cases}}}

Se puede tomar el cociente de la cadena vacía:

ε/a=ε{\displaystyle \varepsilon /a=\varepsilon }

De manera similar, dado un subconjuntoSMETRO{\displaystyle S\subset M}de un monoideMETRO{\displaystyle M}, se puede definir el subconjunto cociente como

S/a={sMETRO | saS}{\displaystyle S/a=\{s\in M\ \vert \ sa\in S\}}

Los cocientes izquierdos pueden definirse de forma similar, realizando las operaciones en el lado izquierdo de una cadena.

Hopcroft y Ullman (1979) definen el cociente L 1 / L 2 de los lenguajes L 1 y L 2 sobre el mismo alfabeto como L 1 / L 2 = { s | ∃ tL 2 . stL 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 implicalo que produce {} , en lugar de { ε } .

El cociente izquierdo (cuando se define de forma similar a Hopcroft y Ullman 1979) de un lenguaje unitario L 1 y un lenguaje arbitrario L 2 se conoce como derivada de Brzozowski ; si L 2 se representa mediante una expresión regular , también puede ser el cociente izquierdo. [ 8 ]

Relación sintáctica

El cociente derecho de un subconjuntoSMETRO{\displaystyle S\subset M}de un monoideMETRO{\displaystyle M}define una relación de equivalencia , llamada relación sintáctica derecha de S. Está dada por

S={(s,t)METRO×METRO | S/s=S/t}{\displaystyle \sim _{S}\;\,=\,\{(s,t)\in M\times M\ \vert \ S/s=S/t\}}

La relación es claramente de índice finito (tiene un número finito de clases de equivalencia) si y solo si la familia de cocientes derechos es finita; es decir, si

{S/metro | metroMETRO}{\displaystyle \{S/m\ \vert \ m\in M\}}

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 .

Derecho de cancelación

La cancelación derecha 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 comos÷a{\displaystyle s\div a}y se define recursivamente como

(sa)÷b={ssi a=b(s÷b)asi ab{\displaystyle (sa)\div b={\begin{cases}s&{\mbox{if }}a=b\\(s\div b)a&{\mbox{if }}a\neq b\end{cases}}}

La cadena vacía siempre se puede cancelar:

ε÷a=ε{\displaystyle \varepsilon \div a=\varepsilon }

Claramente, cancelación correcta y desplazamiento por proyección :

πΣ(s)÷a=πΣ(s÷a){\displaystyle \pi _{\Sigma }(s)\div a=\pi _{\Sigma }(s\div a)}

Prefijos

Los prefijos de una cadena son el conjunto de todos los prefijos de una cadena, con respecto a un lenguaje dado:

PrefL(s)={t | s=t para t,Alfa(L)}{\displaystyle \operatorname {Pref} _{L}(s)=\{t\ \vert \ s=tu{\mbox{ for }}t,u\in \operatorname {Alph} (L)^{*}\}}

dóndesL{\displaystyle s\in L}.

El cierre de prefijo de un lenguaje es

Pref(L)=sLPrefL(s)={t | s=t;sL;t,Alfa(L)}{\displaystyle \operatorname {Pref} (L)=\bigcup _{s\in L}\operatorname {Pref} _{L}(s)=\left\{t\ \vert \ s=tu;s\in L;t,u\in \operatorname {Alph} (L)^{*}\right\}}

Ejemplo:L={abdo} entonces Pref(L)={ε,a,ab,abdo}{\displaystyle L=\left\{abc\right\}{\mbox{ then }}\operatorname {Pref} (L)=\left\{\varepsilon ,a,ab,abc\right\}}

Un lenguaje se denomina prefijo cerrado siPref(L)=L{\displaystyle \operatorname {Pref} (L)=L}.

El operador de cierre de prefijo es idempotente :

Pref(Pref(L))=Pref(L){\displaystyle \operatorname {Pref} (\operatorname {Pref} (L))=\operatorname {Pref} (L)}

La relación de prefijo es una relación binaria.{\displaystyle \sqsubseteq }de tal manera quest{\displaystyle s\sqsubseteq t}si y solo sisPrefL(t){\displaystyle s\in \operatorname {Pref} _{L}(t)}Esta relación es un ejemplo particular de un orden de prefijo .

Véase también

Notas

  1. Aunque todo lenguaje regular es también libre de contexto, el teorema anterior no está implícito en el actual, ya que el primero produce un resultado de modelado para lenguajes regulares.
  2. Estrictamente hablando, un homomorfismo produce un lenguaje que consta de una sola cadena, es decirF(a)={s}{\displaystyle f(a)=\{s\}}.
  3. Esto se deduce del cierre mencionado anteriormente bajo sustituciones arbitrarias.

Referencias

  • Hopcroft, John E.; Ullman, Jeffrey D. (1979). Introducción a la teoría de autómatas, lenguajes y computación . Reading, Massachusetts: Addison-Wesley Publishing. ISBN 978-0-201-02988-8. Zbl 0426.68001 . (Véase el capítulo 3.)
  1. Hopcroft, Ullman (1979), Sec.3.2, p.60
  2. Hopcroft, Ullman (1979), Sec. 3.2, Teorema 3.4, pág. 60
  3. Hopcroft, Ullman (1979), Sec. 6.2, Teorema 6.2, pág. 131
  4. Hopcroft, Ullman (1979), Sec. 3.2, págs. 60-61
  5. Hopcroft, Ullman (1979), Sec. 3.2, Teorema 3.5, pág. 61
  6. Hopcroft, Ullman (1979), Sec. 6.2, Teorema 6.3, pág. 132
  7. Hopcroft, Ullman (1979), Sec.3.2, p.62
  8. Janusz A. Brzozowski (1964). "Derivadas de Expresiones Regulares" . J.ACM . 11 (4): 481– 494. doi : 10.1145/321239.321249 . S2CID 14126942 .