Palavras, linguagens e expressões

Operações sobre palavras e linguagens, provas por indução e leitura de expressões regulares.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Sobre o alfabeto {0,1}\{0,1\}, 01100110 é uma entrada concreta. Se aceitarmos apenas sequências terminadas em 1010, 01100110 pertence à linguagem e 01010101 fica de fora. A palavra é a sequência; a linguagem é o conjunto das sequências que cumprem a condição.

As operações seguintes permitem descrever esses conjuntos. Para conjuntos e relações, usa a revisão de MD.

Alfabetos e palavras

Um alfabeto Σ\Sigma é um conjunto finito e não vazio de símbolos. Uma palavra sobre Σ\Sigma é uma sequência finita desses símbolos. Sobre Σ={0,1}\Sigma=\{0,1\}, tens palavras como 00, 011011 e 11101110.

A palavra vazia ε\varepsilon não contém símbolos. O comprimento ∣w∣|w| conta símbolos, logo ∣011∣=3|011|=3 e ∣ε∣=0|\varepsilon|=0. Por isso ε\varepsilon não é uma letra que a máquina tenha de ler.

A concatenação xyxy escreve yy imediatamente depois de xx. Se x=01x=01 e y=10y=10, então xy=0110xy=0110 e yx=1001yx=1001. Vale:

∣xy∣=∣x∣+∣y∣,(xy)z=x(yz),xε=εx=x.|xy|=|x|+|y|,\qquad (xy)z=x(yz),\qquad x\varepsilon=\varepsilon x=x.

A potência xnx^n concatena nn cópias de xx, com x0=εx^0=\varepsilon. Por exemplo, (01)3=010101(01)^3=010101. O reverso xRx^R muda a ordem dos símbolos: (001)R=100(001)^R=100.

Uma palavra vv é subpalavra de ww se existem x,yx,y com w=xvyw=xvy. É prefixo quando podes escolher x=εx=\varepsilon, e sufixo quando podes escolher y=εy=\varepsilon. Em 0010100101, 001001 é prefixo, 101101 é sufixo e 010010 é subpalavra. A palavra vazia é prefixo e sufixo de qualquer palavra.

Σk\Sigma^k contém as palavras de comprimento kk. Assim, Σ0={ε}\Sigma^0=\{\varepsilon\} e {0,1}2={00,01,10,11}\{0,1\}^2=\{00,01,10,11\}. Juntando todos os comprimentos:

Σ∗=⋃k≥0Σk,Σ+=⋃k≥1Σk=Σ∗∖{ε}.\Sigma^*=\bigcup_{k\ge0}\Sigma^k, \qquad \Sigma^+=\bigcup_{k\ge1}\Sigma^k=\Sigma^*\setminus\{\varepsilon\}.

Se o alfabeto tem mm símbolos, há mkm^k palavras de comprimento kk, porque cada uma das kk posições oferece mm escolhas independentes.

Linguagens e operações

Uma linguagem é um conjunto de palavras, L⊆Σ∗L\subseteq\Sigma^*. Por exemplo,

L={0n1n∣n≥0}={ε,01,0011,000111,…}.L=\{0^n1^n\mid n\ge0\}=\{\varepsilon,01,0011,000111,\ldots\}.

A condição exige zeros antes dos uns, por isso 01010101 tem tantos zeros como uns mas não pertence a LL.

Três confusões com ε e ∅

A palavra 01 tem comprimento 2. A linguagem {01}\{01\} tem uma palavra. A linguagem {0,1}∗\{0,1\}^* tem infinitas palavras, incluindo ε\varepsilon e 01. Três erros frequentes:

  • escrever 0101 quando queres dizer {01}\{01\};
  • escrever {ε}\{\varepsilon\} quando queres dizer ∅\emptyset;
  • ler A∗A^* como “repetir uma palavra de AA” em vez de “concatenar zero ou mais palavras de AA”.

Testa cada definição com ε\varepsilon: ε∈{0,1}∗\varepsilon \in \{0,1\}^*, ε∈{a}∗\varepsilon \in \{a\}^*, mas ε∉{a}+\varepsilon \notin \{a\}^+. E ∅∗={ε}\emptyset^*=\{\varepsilon\}, porque existe uma concatenação vazia, com zero blocos. Não confundas ∅\emptyset com {ε}\{\varepsilon\}: a primeira linguagem tem zero palavras e a segunda tem uma palavra de comprimento zero, e esta distinção muda o resultado das operações.

Além de união, interseção e diferença de conjuntos, usamos:

AB={xy∣x∈A, y∈B},A0={ε},An+1=AnA,AB=\{xy\mid x\in A,\ y\in B\},\qquad A^0=\{\varepsilon\},\qquad A^{n+1}=A^nA, A∗=⋃n≥0An,A+=⋃n≥1An.A^*=\bigcup_{n\ge0}A^n,\qquad A^+=\bigcup_{n\ge1}A^n.

O complemento depende do alfabeto: L‾=Σ∗∖L\overline L=\Sigma^*\setminus L. Uma palavra que nem usa símbolos de Σ\Sigma não pertence a esse complemento.

Calcular sem perder palavras

Se A={a,ab}A=\{a,ab\} e B={ε,b}B=\{\varepsilon,b\}, enumera os pares:

Palavra de AAPalavra de BBConcatenação
aaε\varepsilonaa
aabbabab
ababε\varepsilonabab
ababbbabbabb

Portanto, AB={a,ab,abb}AB=\{a,ab,abb\}: três palavras para quatro pares, porque linguagens são conjuntos, não listas com repetições. Já BA={a,ab,ba,bab}BA=\{a,ab,ba,bab\}, logo a concatenação não é comutativa.

Os casos vazios seguem da definição: A∅=∅A=∅A\emptyset=\emptyset A=\emptyset, enquanto A{ε}={ε}A=AA\{\varepsilon\}=\{\varepsilon\}A=A. A estrela contém sempre ε\varepsilon, mesmo em ∅∗={ε}\emptyset^*=\{\varepsilon\}.

Provar ou refutar uma igualdade

Para provar L(M∪N)=LM∪LNL(M\cup N)=LM\cup LN, escolhe uma palavra ww de cada lado. Se w=xyw=xy com x∈Lx\in L e y∈M∪Ny\in M\cup N, então y∈My\in M ou y∈Ny\in N, logo w∈LM∪LNw\in LM\cup LN. O mesmo raciocínio ao contrário prova a outra inclusão.

A igualdade L(M∩N)=LM∩LNL(M\cap N)=LM\cap LN pode falhar. Usa L={ε,a}L=\{\varepsilon,a\}, M={a}M=\{a\} e N={ε}N=\{\varepsilon\}. O lado esquerdo é vazio, mas aa pertence a ambos LMLM e LNLN, porque as duas concatenações podem decompor a mesma palavra em sítios diferentes.

O mesmo método do elemento arbitrário prova inclusões com estrela. Para L∗M⊆(L+M)∗L^*M \subseteq (L+M)^*, escolhe w∈L∗Mw \in L^*M. Então w=xyw=xy, com x∈L∗x \in L^* e y∈My \in M. Escreve x=x1⋯xkx=x_1\cdots x_k, com cada xi∈Lx_i \in L. Cada bloco xix_i e ainda yy pertencem a L∪ML \cup M. Logo ww é uma concatenação de k+1k+1 palavras de L∪ML \cup M, e pertence a (L+M)∗(L+M)^*. O caso k=0k=0 dá w=yw=y, que também está incluído. A palavra foi arbitrária, por isso a inclusão vale para todas.

Provas por indução

A definição de palavras permite provar propriedades pelo comprimento. Para mostrar

(xy)R=yRxR,(xy)^R=y^Rx^R,

faz indução em ∣y∣|y|, mantendo xx arbitrário. A base trata a palavra vazia; o passo reduz uma palavra não vazia a uma mais curta e aplica a hipótese só a essa palavra mais curta.

  • Base: y=εy=\varepsilon. Ambos os lados são xRx^R.
  • Passo: escreve y=zay=za, com a∈Σa\in\Sigma. A hipótese diz (xz)R=zRxR(xz)^R=z^Rx^R. Pela definição de reverso, (xza)R=a(xz)R=azRxR=(za)RxR(xza)^R=a(xz)^R=az^Rx^R=(za)^Rx^R.

O passo usou a hipótese apenas numa palavra mais curta. Testar exemplos não substitui este argumento para todos os comprimentos.

Há também indução estrutural: provas sobre expressões ou árvores seguem os casos usados para construir esses objetos. Se uma expressão resulta de união, concatenação ou estrela, a prova explica cada uma dessas construções.

Expressões regulares

Uma expressão regular descreve uma linguagem com três operações. As expressões básicas são ∅\emptyset, ε\varepsilon e cada símbolo a∈Σa\in\Sigma. Se E,FE,F são expressões, também o são:

ExpressãoLinguagem descrita
E+FE+FL(E)∪L(F)L(E)\cup L(F)
EFEFL(E)L(F)L(E)L(F)
E∗E^*(L(E))∗(L(E))^*

Aqui, ++ entre expressões significa união. E+E^+ abrevia EE∗EE^*, ou seja, uma ou mais repetições. A estrela tem maior precedência que a concatenação, e esta tem maior precedência que a união.

Por isso, 01∗+1001^*+10 significa um zero seguido de zero ou mais uns, ou a palavra 1010. Não significa repetir 0101. A expressão (01)∗(01)^* inclui ε,01,0101\varepsilon,01,0101, enquanto 01∗01^* inclui 0,01,0110,01,011 e exclui ε\varepsilon.

Descrever uma condição

Sobre {a,b}\{a,b\}, palavras com exatamente dois bb têm expressão a∗ba∗ba∗a^*ba^*ba^*. Os dois bb são obrigatórios, e os três intervalos de aa podem estar vazios.

Palavras que contêm abab têm expressão (a+b)∗ab(a+b)∗(a+b)^*ab(a+b)^*, porque os lados permitem qualquer prefixo e sufixo. Palavras que terminam em abab têm apenas (a+b)∗ab(a+b)^*ab. Testa abaaba: pertence à primeira linguagem, mas não à segunda.

Para palavras binárias sem símbolos iguais consecutivos, podemos usar

(ε+1)(01)∗(ε+0).(\varepsilon+1)(01)^*(\varepsilon+0).

As quatro escolhas dos extremos dão comprimentos pares ou ímpares e permitem começar em 00 ou 11. Incluem ε\varepsilon, 00 e 11. Se a linguagem excluir a palavra vazia, terás de alterar a expressão.

Leis úteis e falsas simplificações

União é comutativa e idempotente: E+F≡F+EE+F\equiv F+E e E+E≡EE+E\equiv E. Concatenação é associativa e distribui sobre união. Temos Eε≡EE\varepsilon\equiv E e E∅≡∅E\emptyset\equiv\emptyset. O símbolo ≡\equiv indica a mesma linguagem, não o mesmo texto.

Também (E∗)∗≡E∗(E^*)^*\equiv E^* e E∗E∗≡E∗E^*E^*\equiv E^*. Mas (E+F)∗≡E∗+F∗(E+F)^*\equiv E^*+F^* é falso: para E=a,F=bE=a,F=b, o lado esquerdo contém abab e o direito não.

As expressões desta teoria equivalem aos autómatos finitos. Algumas bibliotecas de pesquisa acrescentam operações como referências a grupos anteriores, que ultrapassam este modelo. Para construir as máquinas equivalentes, segue expressões e autómatos.

Provar inclusões com um elemento arbitrário

A técnica usada acima para igualdades serve também para inclusões com estrela. O padrão é sempre o mesmo: escolhe uma palavra arbitrária do lado esquerdo, decompõe-na segundo as operações desse lado e reconstrói-a com as operações do lado direito. Uma única palavra nunca prova a inclusão; uma palavra bem escolhida refuta uma igualdade falsa.

Exercícios

A prova da inclusão adapta o exercício 5j da folha prática 1. Os restantes problemas usam exemplos próprios dos tópicos das aulas.

Quantas palavras distintas?

Sejam A={a,aa}A=\{a,aa\} e B={ε,a}B=\{\varepsilon,a\}. Quantas palavras distintas contém ABAB?

Pista

Lista as concatenações de cada par, incluindo as que usam ε\varepsilon.

Mais uma pista

Os quatro pares dão aa, aaaa, aaaa e aaaaaa.

Solução

AB={a,aa,aaa}AB=\{a,aa,aaa\} tem 3 palavras. Os dois pares que dão aaaa não criam duas palavras diferentes.

Erros frequentes

Não contes pares em vez de palavras. ε\varepsilon conserva a outra palavra, não apaga a concatenação.

Voltar à explicação
Contar blocos

Quantas palavras de comprimento 6 pertencem a {00,11}∗\{00,11\}^*?

Pista

Cada bloco tem comprimento 2. Quantos blocos cabem?

Mais uma pista

São três posições de bloco, com duas escolhas independentes em cada uma.

Solução

Há 23=82^3=8. A divisão em blocos de duas letras é única, por isso escolhas diferentes produzem palavras diferentes.

Erros frequentes

Não uses 262^6: cada posição de símbolo não é uma escolha independente nesta linguagem.

Voltar à explicação
Provar uma inclusão

Prova: se L⊆ML\subseteq M, então L∗⊆M∗L^*\subseteq M^*.

Pista

Uma palavra de L∗L^* é uma concatenação de um número finito de palavras de LL.

Mais uma pista

Se w=x1⋯xkw=x_1\cdots x_k com cada xi∈Lx_i\in L, a hipótese põe cada bloco em MM. Trata também k=0k=0.

Solução

Se w∈L∗w\in L^*, existe k≥0k\ge0 e existem x1,…,xk∈Lx_1,\ldots,x_k\in L com w=x1⋯xkw=x_1\cdots x_k. Pela inclusão, cada xix_i está em MM, logo w∈M∗w\in M^*. Para k=0k=0, w=εw=\varepsilon, presente em ambas as estrelas. Como ww era arbitrária, segue a inclusão.

Confere a tua resposta:

  • Escolhe uma palavra arbitrária de L estrela.
  • Representa-a como concatenação finita de palavras de L.
  • Usa L contido em M para concluir a mesma concatenação em M estrela, incluindo a vazia.

Erros frequentes

Não concluas que L=ML=M nem escolhas uma só palavra como prova. A hipótese transfere cada bloco, não apenas os símbolos.

Voltar à explicação
Construir uma expressão

Escreve uma expressão regular sobre {a,b}\{a,b\} para palavras sem dois bb consecutivos. Inclui ε\varepsilon e justifica por que não faltam palavras.

Pista

Um b que não é o último tem de ser seguido de a.

Mais uma pista

Podes repetir os blocos aa e baba, permitindo um bb isolado no fim.

Solução

Uma expressão é (a+ba)∗(ε+b)(a+ba)^*(\varepsilon+b). Dentro da estrela, cada bb pertence a um bloco baba, logo o símbolo seguinte é aa. O bb opcional do fim não fica junto de outro, porque os blocos não vazios da estrela acabam em aa.

Inversamente, percorre uma palavra válida da esquerda para a direita. Retira um bloco aa quando comece em aa, ou um bloco baba quando comece em bb e tenha mais letras. Só pode sobrar um bb no fim. Esta decomposição justifica que a expressão inclui todas as palavras pretendidas. Por exemplo, baba=ba⋅bababa=ba\cdot ba e ab=a⋅bab=a\cdot b.

Confere a tua resposta:

  • Inclui a palavra vazia e as palavras a e b.
  • Impede bb em qualquer posição.
  • Explica como decompor qualquer palavra válida nos blocos da expressão.

Erros frequentes

Não uses a∗b∗a^*b^*, que permite bbbb e impede voltar aos aa. Uma lista de exemplos não prova as duas inclusões.

Voltar à explicação
Provar pelo número de cópias

Prova ∣xn∣=n∣x∣|x^n|=n|x| para qualquer palavra xx e inteiro n≥0n\ge0. Indica a base e onde usas a hipótese de indução.

Pista

Fixa uma palavra xx arbitrária e faz indução em nn.

Mais uma pista

Usa xn+1=xnxx^{n+1}=x^nx e ∣uv∣=∣u∣+∣v∣|uv|=|u|+|v|.

Solução

Na base, ∣x0∣=∣ε∣=0=0∣x∣|x^0|=|\varepsilon|=0=0|x|. No passo, supondo ∣xn∣=n∣x∣|x^n|=n|x|, temos ∣xn+1∣=∣xnx∣=∣xn∣+∣x∣=n∣x∣+∣x∣=(n+1)∣x∣|x^{n+1}|=|x^nx|=|x^n|+|x|=n|x|+|x|=(n+1)|x|. A terceira igualdade usa a hipótese. Como xx era arbitrária, a prova vale para todas as palavras, incluindo x=εx=\varepsilon.

Confere a tua resposta:

  • Trata n=0 usando a palavra vazia.
  • Aplica a hipótese apenas a x elevado a n.
  • Usa a aditividade do comprimento na concatenação.

Erros frequentes

Não uses a propriedade para n+1 antes de a demonstrar. Não omitas n=0 só porque os primeiros exemplos têm palavras não vazias.

Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.