Conteúdos da cadeira

Linguagens e expressões regulares

Alfabetos, palavras, operações sobre linguagens e a sintaxe das expressões regulares.

Markdown

Perguntar sobre esta página

ChatGPTClaudePerplexityGeminiCopiar e abrir

Envia o link e pede à IA para ler a página. No Gemini, cola a pergunta copiada.

Ver pergunta para copiar
Nesta página

Antes de falar de máquinas, é preciso falar de dados. Um autómato lê palavras sobre um alfabeto, e uma linguagem é um conjunto de palavras. Esta página fixa esse vocabulário e apresenta as expressões regulares, a notação compacta para descrever linguagens simples. Se “conjunto”, “união” e “função” soam a novidade, revê conjuntos e relações primeiro.

Alfabetos e palavras

Um alfabeto Σ\Sigma é um conjunto finito e não vazio de símbolos. Exemplos: Σ={0,1}\Sigma = \{0, 1\} (o alfabeto binário), Σ={a,b,c}\Sigma = \{a, b, c\} ou o alfabeto ASCII dos teclados.

Uma palavra (ou cadeia) sobre Σ\Sigma é uma sequência finita de símbolos de Σ\Sigma. Exemplos sobre {0,1}\{0, 1\}: 01100110, 11, 00. A palavra vazia, escrita ε\varepsilon, é a sequência com zero símbolos. Não confundas ε\varepsilon com um símbolo do alfabeto: é a ausência de símbolos.

O comprimento w|w| de uma palavra ww é o número de símbolos que ela contém. Assim 0110=4|0110| = 4 e ε=0|\varepsilon| = 0.

A concatenação cola duas palavras: se x=01x = 01 e y=10y = 10, então xy=0110xy = 0110. Vale xy=x+y|xy| = |x| + |y|, e ε\varepsilon é o elemento neutro: wε=εw=ww\varepsilon = \varepsilon w = w para toda a palavra ww. A potência wnw^n abrevia ww concatenado consigo próprio nn vezes, com w0=εw^0 = \varepsilon.

Σ\Sigma^* designa o conjunto de todas as palavras sobre Σ\Sigma, incluindo ε\varepsilon. É infinito mesmo quando Σ\Sigma é finito. Por exemplo, {0,1}={ε,0,1,00,01,10,11,000,}\{0,1\}^* = \{\varepsilon, 0, 1, 00, 01, 10, 11, 000, \dots\}.

Linguagens e operações

Uma linguagem sobre Σ\Sigma é um subconjunto qualquer de Σ\Sigma^*. Exemplos sobre {0,1}\{0, 1\}:

  • L1={ww termina em 1}L_1 = \{w \mid w \text{ termina em } 1\} (infinita);
  • L2={01,0011}L_2 = \{01, 0011\} (finita);
  • L3=L_3 = \emptyset (a linguagem vazia, sem palavras);
  • L4={ε}L_4 = \{\varepsilon\} (a linguagem só com a palavra vazia).

Cuidado com a distinção entre L3L_3 e L4L_4: \emptyset não contém nada, nem ε\varepsilon; {ε}\{\varepsilon\} contém uma palavra, a vazia. É o erro mais barato desta cadeira e aparece em testes.

Sobre linguagens definem-se três operações, além das operações de conjuntos (união, interseção, complemento):

  • Concatenação: AB={xyxA e yB}AB = \{xy \mid x \in A \text{ e } y \in B\}. Cola cada palavra de AA com cada palavra de BB.
  • Potência: A0={ε}A^0 = \{\varepsilon\}, An+1=AnAA^{n+1} = A^n A.
  • Estrela de Kleene: A=A0A1A2A^* = A^0 \cup A^1 \cup A^2 \cup \dots (zero ou mais cópias coladas).

Exemplo: se A={0,11}A = \{0, 11\}, então A2={00,011,110,1111}A^2 = \{00, 011, 110, 1111\} e AA^* contém ε\varepsilon, 00, 1111, 000000, 011011, e por aí fora.

Expressões regulares

Uma expressão regular sobre Σ\Sigma é uma fórmula que descreve uma linguagem, construída com estas regras:

  • \emptyset descreve a linguagem vazia; ε\varepsilon descreve {ε}\{\varepsilon\}; cada aΣa \in \Sigma descreve {a}\{a\}.
  • Se R1R_1 descreve L1L_1 e R2R_2 descreve L2L_2, então (R1R2)(R_1 \cup R_2) descreve L1L2L_1 \cup L_2, (R1R2)(R_1 \circ R_2) descreve L1L2L_1 L_2 e (R1)(R_1^*) descreve L1L_1^*. Na prática escreve-se ++ ou | em vez de \cup, e omite-se o \circ.

A precedência poupa parênteses: estrela primeiro, depois concatenação, depois união. Assim abcab^* \cup c lê-se (a(b))c(a \circ (b^*)) \cup c, ou seja, “um aa seguido de zero ou mais bb, ou um cc”.

Exemplos sobre Σ={0,1}\Sigma = \{0, 1\}:

ExpressãoLinguagem descrita
010^*1^*zeros seguidos de uns (inclui ε\varepsilon)
(01)(0 \cup 1)^*todas as palavras, ou seja Σ\Sigma^*
1(01)1(0 \cup 1)^*palavras que começam em 11
((01)0)((0 \cup 1)0)^*palavras de comprimento par que terminam em 00

Exemplo resolvido: do enunciado à expressão

Enunciado: sobre Σ={a,b}\Sigma = \{a, b\}, escreve uma expressão regular para a linguagem das palavras que têm pelo menos dois aa consecutivos.

Raciocínio: “pelo menos dois aa consecutivos” significa que algures na palavra aparece o bloco aaaa. Antes desse bloco pode estar qualquer palavra (Σ=(ab)\Sigma^* = (a \cup b)^*), e depois dele também. Logo a expressão é:

(ab)aa(ab).(a \cup b)^* aa (a \cup b)^*.

Confirma com casos: aaaa pertence (escolhe ε\varepsilon dos dois lados). baaabbaaab pertence (prefixo bb, sufixo abab). abaaba não pertence, porque qualquer decomposição xaayx \cdot aa \cdot y exigiria dois aa seguidos algures, e abaaba não os tem. Repara que a verificação “não pertence” usa sempre o mesmo argumento: supõe uma decomposição e mostra que é impossível. Este estilo volta na página sobre limites das linguagens regulares.

Para levar para a próxima página

Linguagens são conjuntos de palavras, e expressões regulares descrevem uma família delas: as linguagens regulares. A próxima pergunta é mecânica: que máquinas reconhecem exatamente estas linguagens? São os autómatos finitos.

Ver o ficheiro no GitHub

À tua maneira

Escolhe como preferes ler.

Aparência
Ajustar cores e largura
Cor de destaque do tema FEUP
Tipo de letra

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

As tuas escolhas ficam guardadas neste navegador.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

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.