Operações em cadeias de caracteres

Fonte: testwiki
Saltar para a navegação Saltar para a pesquisa

Predefinição:Não enciclopédico

Em ciência da computação e nas linguagens formais é comum o uso de uma variedade de funções que operam sobre cadeias de caracteres com o intuito de transformá-las em variações bem definidas com base em sua estrutura original.

Concatenação

Predefinição:Artigo principalÉ a operação que une uma cadeia de caracteres a outra cadeia de caracteres, formando uma nova cadeia contendo os caracteres da primeira seguidos pelos caracteres da segunda. A concatenação de duas cadeias s e t é usualmente denotado por s · t ou abreviado como st. Concatenar uma cadeia qualquer com uma cadeia vazia 𝜀 não altera a cadeia original, assim s · 𝜀 = s = 𝜀 · s. A concatenação de cadeias de caraceres é associativa, mas não é comutativa, portanto, s · (t · u) = (s · t) · u, mas s · t ≠ t · s.

Substituição de cadeia

Seja L uma linguagem, e seja Σ seu alfabeto. Uma substituição de cadeia ou simplesmente uma substituição é um mapeamento f que mapeia letras em Σ para linguagens (possivelmente em um alfabeto diferente). Assim, por exemplo, dada uma letra a ∈ Σ, existe f(a)=La onde La ⊆ Δ* é alguma linguagem cujo alfabeto é Δ. Esse mapeamente pode ser estendido para cadeias como:

f(ε)=ε

para a cadeia vazia ε, e

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

para uma cadeia sL. Substituições de cadeias podem ser estendidas a linguagens inteias como [1]

f(L)=sLf(s)

Linguagens regulares são fechadas sobre substituição de cadeia. Isto é, se cada letra de uma linguagem regular é substituida por uma outra linguagem regular, o resultado é ainda a linguagem regular.[2] Similarmente, linguagens livres de contexto são fechadas sobre substituição de cadeia.[3][note 1]

Um simples exemplo é uma conversão fuc(.) à forma maiúscula, que pode ser definida e.g. como a seguir:

letter mapped to language remark
x fuc(x)
a { ‹A› } map lower-case char to corresponding upper-case char
A { ‹A› } map upper-case char to itself
ß { ‹SS› } no upper-case char available, map to two-char cadeia
‹0› { ε } map digit to empty cadeia
‹!› { } forbid punctuation, map to empty language
... similar for other chars

Para a extensão de fuc para cadeias, temos e.g.

  • fuc(‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASSE›},
  • fuc(‹u2›) = {‹U} ⋅ {ε} = {‹U›}, and
  • fuc(‹Go!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.

Para a extensão de fuc para linguagens, temos e.g.

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

Para a extensão de fuc para cadeias, temos e.g.

  • fuc(‹Straße›) = {‹S›} ⋅ {‹T›} ⋅ {‹R›} ⋅ {‹A›} ⋅ {‹SS›} ⋅ {‹E›} = {‹STRASSE›},
  • fuc(‹u2›) = {‹U} ⋅ {ε} = {‹U›}, e
  • fuc(‹Go!›) = {‹G›} ⋅ {‹O›} ⋅ {} = {}.

Para a extensão de fuc para linguagens, temos e.g.

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

Um outro exemplo é a conversão de uma cadeia ASC codificada.

Homomorfismo de cadeia

Um homomorfismo de cadeia (comumente referido como simplesmente homomorfismo em teoria de linguagens formais é a substituição de cadeia tal que cada letra é substituída por uma cadeia unitária. Isto é, f(a)-s, onde s é uma cadeia, para cada letra a.[note 2][4]

Homomofismos de cadeias são mofismos monoides no monoide livre, preservando a operação binaria de concatenação de cadeia. Dada uma linguagem L, o conjunto f(L) é chamado imagem homomorfica de L. A imagem homomorfica invertida de uma cadeia s é definida como

f−1(s) = { w | f(w)=s }

enquanto que a imagem homomorfica invertida de uma linguagem L é definida como

f−1(L) = { s | f(s) ∈ L }

No geral, f(f−1(L)) ≠ L, enquanto não há

f(f−1(L)) ⊆ L

e

Lf−1(f(L))

para cada linguagem L.

A classe de linguagens regulares é fechada sobre homomorfismos e homomorfismos invertidos.[5] Similarmente, as gramáticas livre-de-contexto são fechadas sobre homomorfismos[note 3] e homomorfismos invertidos.[6]

Um homomorfismo de cadeia é dito ε-livre (ou e-livre) se f(a) ≠ ε para todo a no alfabeto Σ. Simples cifras de substituição de única letra são exemplos de homomorfismos de cadeia e-livres.

Um homomorfismo de cadeia exemplo guc pode também ser obtido ao definir similar à substituição de cadeia: guc(‹a›) = ‹A›, ..., guc(‹0›) = ε, mas deixando guc undefinido em caracteres de pontuação.

Exemplos de imagens homomorficas invertidas são

  • guc−1({ ‹SSS› }) = { ‹sss›, ‹sß›, ‹ßs› }, since guc(‹sss›) = guc(‹sß›) = guc(‹ßs›) = ‹SSS›, and
  • guc−1({ ‹A›, ‹bb› }) = { ‹a› }, since guc(‹a›) = ‹A›, enquanto ‹bb› não pode ser alcançado por guc.

Para a ultima language, guc(guc−1({ ‹A›, ‹bb› })) = guc({ ‹a› }) = { ‹A› } ≠ { ‹A›, ‹bb› }. O homomorfismo guc não é ε-livre, uma vez que mapeia e.g. ‹0› para ε.

Projeção de cadeia

Se s é uma cadeia, e Σ é um alfabeto, a projeção de cadeia de s é a cadeia que resulta em remover todas as letras que não estão em Σ. É escrito como πΣ(s). É formalmente definido da remoção de letras do lado da mão direita.

πΣ(s)={εif s=ε the empty cadeiaπΣ(t)if s=ta and aΣπΣ(t)aif s=ta and aΣ

Aqui ε denota a cadeia vazia. A projeção de uma cadeia é essencial tal qual a projeção em algebra relacional.

Projeção de cadeia pode ser promovido a projeção de uma linguagem. Dada uma linguagem formal L, sua projeção é dada por

πΣ(L)={πΣ(s)|sL}

Quociente à direita

O quociente à direita de uma letra a de uma cadeia s é a truncação da letra a na cadeia s, do lado referente a mão direita. É denotado como s/a. Se a cadeia naõ tem a no lado referente a mão direita, o resultado é a cadeia vazia. Assim:

(sa)/b={sif a=bεif ab

O quociente de uma cadeia vazia é pode ser obtido:

ε/a=ε

De modo similar, dado um subconjunto SM de um monoide M, pode-se definir o subconjunto quociente como

S/a={sM|saS}

Quocientes à esquerda podem ser definidos de maneira similar, com operações se colocando à esquerda de uma cadeia.

Relação sintática

O quociente à direita de um subconjunto SM de um monoide M define uma relação de equivalencia, chamada de relação sintática à direita de S. É dada por

S={(s,t)M×M|S/s=S/t}

A relação é claramente de indice finito (tem um número finito de classes de equivalencia) se e somente se a família quocientes à direita é finida; isto é, se

{S/m|mM}

é finito. Nesse caso, S é uma linguagem reconhecível, isto é, uma linguagem que pode ser reconhecida por um automato de estados finito. Isto é discutido em mais detalhes no artigo sobre monoides sintáticos.

Cancelamento à direita

O cancelamento à direita de uma letra a de uma cadeia s é a remoção da primeira ocorrencia de uma letra a na cadeia s, começando pelo lado referente a mão direita. Isto é denotado como s÷a e é recursivamente definido como

(sa)÷b={sif a=b(s÷b)aif ab

A cadeia vazia é sempre cancelável:

ε÷a=ε

Claramente, cancelamento à direita e projeção comutam:

πΣ(s)÷a=πΣ(s÷a)

Prefixos

O prefixo de uma cadeia é um conjunto de todos os prefixos de uma cadeia, com relação à dada linguagem:

PrefL(s)={t|s=tu for t,uAlph(L)*}

here sL. aqui sL.

A conjectura de prefixo de uma linguagem é

Pref(L)=sLPrefL(s)={t|s=tu;sL;t,uAlph(L)*}

Exemplo:
L={abc} then Pref(L)={ε,a,ab,abc}

Uma linguagem é chamada fechada em prefixo se Pref(L)=L.

O operador de conjectura de prefixo é idempotente:

Pref(Pref(L))=Pref(L)

A relação de prefixo é a relação binária tal que st se e somente se sPrefL(t). Essa relação é um exemplo particular de uma ordem de prefixo.

Ver também

Notas

Predefinição:Reflist

Referências

Predefinição:Reflist

  1. Hopcroft, Ullman (1979), Sect.3.2, p.60
  2. Hopcroft, Ullman (1979), Sect.3.2, Theorem 3.4, p.60
  3. Hopcroft, Ullman (1979), Sect.6.2, Theorem 6.2, p.131
  4. Hopcroft, Ullman (1979), Sect.3.2, p.60-61
  5. Hopcroft, Ullman (1979), Sect.3.2, Theorem 3.5, p.61
  6. Hopcroft, Ullman (1979), Sect.6.2, Theorem 6.3, p.132


Erro de citação: Existem etiquetas <ref> para um grupo chamado "note", mas não foi encontrada nenhuma etiqueta <references group="note"/> correspondente