At 9

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 20

Teoria da Computação

Aula Teórica 9:
Expressões Regulares

António Ravara

Departamento de Informática, Faculdade de Ciências e Tecnologia,


Universidade Nova de Lisboa

6 de Abril de 2020
Expressões regulares Motivação

Como definir rigorosamente o que faz um autómato?

Linguagem
Um autómato “faz”, isto é, executa, sequências de acções. O conjunto
destas diz-se a linguagem do autómato.
Como é um conjunto pode-se definir em compreensão.
Exemplos
Considere o AFD com alfabeto {a, b}. Vejamos linguagens de AFDs da
aula passada.
Seja NS ⊆ {a, b}∗ × {a, b} → N0 uma função que conta o número de
ocorrências de um sı́mbolo (a ou b) numa palavra de as e bs.
I Palavras com pelo menos dois bs: {w ∈ {a, b}∗ | NS(w , b) ≥ 2}
I Palavras com pelo menos dois bs e um a:
{w ∈ {a, b}∗ | NS(w , b) ≥ 2 ∧ NS(w , a) ≥ 1}
I Palavras com pelo menos um b logo após dois as: mais desafiante...
António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 2 / 20
Expressões regulares Exemplos de modelação

Uma linguagem alternativa

Vamos usar “expressões”, parecidas com as da aritmética:


I ’+’ representa escolha
I ’.’ representa sequência (mas omite-se geralmente)
I ’*’ representa repetição (número arbitrário – zero ou mais – de vezes)
Ficamos com uma pequena “linguagem de programação”.
I Palavras com pelo menos dois bs: a∗ ba∗ b(a + b)∗
faz 0 ou + as antes de cada b; após fazer o segundo b pode fazer
qualquer coisa.
I Palavras com pelo menos um b logo após dois as: b ∗ ab ∗ ab(a + b)∗
I Palavras com pelo menos um b logo após CADA dois as:

(b ∗ ab ∗ abb ∗ )∗

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 3 / 20


Expressões regulares Exemplos de modelação

O ficheiro AFILE

Utilização
Para usar tem que se abrir; depois pode-se ler ou escrever (quantas vezes
se quiser); para terminar de usar tem que se fechar.
Expressão regular que define o comportamento (linguagem fica implı́cita):

open (read + write)∗ close

Ficheiro re-utilizável: repete-se o padrão de utilização (um número


arbitrário de vezes):

(open (read + write)∗ close)∗

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 4 / 20


Noções úteis - revisão Palavra

Palavra ou traço

Alfabeto
Um conjunto finito de sı́mbolos diz-se um alfabeto. Exemplos:
I ΣAFILE = {open, read, write, close}
I DIGITS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

Palavra
I Uma sequência finita (eventualmente vazia) de sı́mbolos de um
alfabeto diz-se uma palavra (sobre esse alfabeto).
I ε é uma palavra sobre qualquer alfabeto;
I close close write write é uma palavra sobre ΣAFILE ;
I 1 1 1 1 é uma palavra sobre DIGITS;
I open 1 2 close não é uma palavra, nem sobre ΣAFILE nem sobre
DIGITS.
António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 5 / 20
Noções úteis - revisão Palavra

Conjunto de palavras

Extensão de uma palavra com um sı́mbolo


Dada uma palavra w sobre Σ e um sı́mbolo a ∈ Σ, a sequência aw é a
palavra sobre Σ obtida colocando a à frente do primeiro sı́mbolo de w .
Exemplos:
I Se w = ε e a = 1 então aw = 1;
I Se w = 2 3 e a = 1 então aw = 1 2 3.

Words(Σ)
O conjunto Words(Σ) de todas as palavras sobre um alfabeto Σ define-se
indutivamente como se segue:

ε ∈ Words(Σ)
w ∈ Words(Σ) ∧ a ∈ Σ ⇒ aw ∈ Words(Σ)

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 6 / 20


Noções úteis - revisão Linguagem

Linguagem

Propriedades
I Se Σ é não vazio, Words(Σ) é infinitamente contável.
I Note-se que Words(Σ) = Σ∗ .

Lang (Σ)
I Uma linguagem sobre Σ é um conjunto LΣ ⊆ Words(Σ).
I Denote-se por Lang (Σ) = ℘(Words(Σ)) o conjunto de todas as
linguagens sobre Σ.

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 7 / 20


Noções úteis - revisão Linguagem

Exemplos de linguagens

Nem todas as palavras pertencem a uma linguagem.


Seja PRIMES ⊆ Words(DIGITS) o conjunto das palavras sobre
DIGITS que representam números primos
I 11 ∈ PRIMES mas 22 ∈ / PRIMES,
I apesar de 11 ∈ Words(DIGITS) e 22 ∈ Words(DIGITS).

Considere-se L(AFILE ), a linguagem das palavras aceites pelo AFD


AFILE
I open read close ∈ L(AFILE ) mas open open 6∈ L(AFILE ),
I apesar de open read close ∈ Words(ΣAFILE ) e
open open ∈ Words(ΣAFILE ).

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 8 / 20


Expressões Regulares Intuições

Linguagem dos AFDs

I Vimos vários exemplos de linguagens


(PRIMES, Words(DIGITS), L(AFILE ), Words(ΣAFILE )).
I Nem todas são linguagens aceites por algum AFD
(PRIMES não é).
I Como um AFD só tem um número finito de estados, não consegue
aceitar todas as palavras de uma linguagem que precise de “memória”
para saber o que já tratou, dada uma palavra arbitrária.
I Exemplos de linguagens que ultrapassam o poder expressivo dos
AFDs:
- PRIMES
- CAPICUAS (palavras que lidas da esquerda para a direita ou
vice-versa denotam o mesmo natural).

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 9 / 20


Expressões Regulares Intuições

Como caracterizar a linguagem dos AFDs?

Será possı́vel definir precisamente que tipo de linguagens podem ser


aceites por algum AFD?
A resposta foi dada por Kleene nos anos 50:
Teorema de Kleene
Linguagens Regulares = Linguagens reconhecidas por AFDs
I Mas o que são “Linguagens Regulares”?
I São as denotadas por “Expressões Regulares”.
I Uma expressão regular é uma forma concisa de identificar uma
linguagem (regular).
Cada expressão é uma sequência (finita) de sı́mbolos que define um
padrão (regular).
Como o padrão pode acontecer num conjunto infinito de palavras,
uma expressão pode denotar um conjunto (linguagem) infinito.

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 10 / 20


Expressões Regulares Definições

Expressões regulares

Definição
Dado um alfabeto Σ, o conjunto RegExp(Σ) é definido indutivamente:

∅ ∈ RegExp(Σ)
ε ∈ RegExp(Σ)
a ∈ Σ ⇒ a ∈ RegExp(Σ)
E ∈ RegExp(Σ) ∧ F ∈ RegExp(Σ) ⇒ (EF ) ∈ RegExp(Σ)
E ∈ RegExp(Σ) ∧ F ∈ RegExp(Σ) ⇒ (E + F ) ∈ RegExp(Σ)
E ∈ RegExp(Σ) ⇒ (E ∗ ) ∈ RegExp(Σ)

I Os três primeiros casos são a base: o vazio, a palavra vazia e qualquer


sı́mbolo do alfabeto (palavras de tamanho 1).
I Os “passos” são as operações concatenação, soma (ou escolha) e a
estrela (fecho de Kleene).

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 11 / 20


Expressões Regulares Definições

Expressões regulares

Exemplos
São expressões regulares:
I (a(b + c))
I ((a∗ )b)
I ((ab)((b + c)∗ ))
Para simplificar, omitem-se os parênteses exteriores, considera-se o
operador estrela mais forte que a concatenação, e esta que a soma.
As expressões acima escrevem-se:
I a(b + c)
I a∗ b
I ab(b + c)∗

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 12 / 20


Expressões Regulares Definições

Linguagem denotada por uma expressão regular

Uma expressão regular identifica (univocamente) uma linguagem.


A partir de um AFD não é tão claro ver a linguagem...
Considere o alfabeto {a, b}
I O conjunto das palavras só com um b é denotado por a∗ ba∗
I O conjunto das palavras começadas por a é denotado por a(a + b)∗
I O conjunto das palavras com pelo menos dois bs é denotado por
a∗ ba∗ b(a + b)∗
I O conjunto das palavras com só dois bs e não consecutivos é
denotado por a∗ ba∗ aba∗
I O conjunto das palavras com um número ı́mpar de bs é denotado por
a∗ ba∗ (ba∗ ba∗ )∗

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 13 / 20


Expressões Regulares Definições

Linguagem denotada por uma expressão regular

Relembre as operações de concatenação de conjuntos (A · B) e fecho de


Kleene de um conjunto (A∗ ).
Definição
Dada uma expressão regular E ∈ RegExp(Σ), o conjunto L(E ) é definido
indutivamente:
L(∅) = ∅
L(ε) = {ε}
a ∈ Σ ⇒ L(a) = {a}
L(E ) = LE ∧ L(F ) = LF ⇒ L(EF ) = LE · LF
L(E ) = LE ∧ L(F ) = LF ⇒ L(E + F ) = LE ∪ LF
L(E ) = LE ⇒ L(E ∗ ) = (LE )∗

def
Para qualquer conjunto A considera-se A+ = A∗ \ {ε}

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 14 / 20


Expressões Regulares Definições

Propriedades
Seja L uma linguagem
(conjunto eventualmente vazio de palavras sobre um alfabeto).
I Como ε é o elemento neutro da concatenação de palavras,
{ε}∗ = {ε}
I O vazio é o elemento absorvente da concatenação:
∅·L=∅=L·∅
I O fecho de Kleene do vazio é a linguagem ε
∅∗ = {ε}
I O fecho de Kleene é idempotente:
(L∗ )∗ = L∗
I Dados dois sı́mbolos distintos a e b, tem-se
{a, b}∗ = {a}∗ ({b}{a}∗ )∗
Naturalmente, sendo as linguagens conjuntos, as propriedades usuais
verificam-se (e.g. a união é comutativa e associativa, tem o vazio como
elemento neutro, etc.).
António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 15 / 20
Expressões Regulares Definições

Obtenção da linguagem denotada por uma expressão


Uma expressão regular define univocamente uma linguagem.
O contrário não é verdade: dada linguagem tem um número infinito
contável de expressões que a define (por causa das equivalências: a = a ε,
∅ = ∅a, a + b = b + a, etc.).
Exemplo: linguagem de (a + b)∗ a (ou de (b + a)∗ a)

L((a + b)∗ a) = L((a + b)∗ ) · L(a)


= L((a + b)∗ ) · {a}
= L(a + b)∗ · {a}
= (L(a) ∪ L(b))∗ · {a}
= ({a} ∪ {b})∗ · {a}
= {a, b}∗ · {a}
= {wa | w ∈ {a, b}∗ }

É o conjunto das palavras sobre {a, b} que terminam em a


António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 16 / 20
Expressões Regulares Definições

Linguagens regulares versus AFDs

Concisão
Uma expressão regular identifica univoca e concisamente uma linguagem.

Considere o alfabeto ΣAFILE


I A linguagem aceite pelo AFD AFILE é denotada pela expressão
regular (open(read + write)∗ close)∗
I Mas como verificar se uma palavra pertence ao conjunto denotado
pela expressão?
I O AFD, como modelo operacional, permite fazer isso facilmente:
executa-se a função de transição estendida!

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 17 / 20


Expressões Regulares Aplicações

Como verificar se dada palavra pertence a uma linguagem?

Análise de sub-palavras
w ∈ L(E ) com E ∈ RegExp(Σ), se:
I E = E1 E2 , w = w1 w2 e w1 ∈ L(E1 ) e w2 ∈ L(E2 )
I E = E1 + E2 , w ∈ L(E1 ) ou w ∈ L(E2 )
I E = F ∗ , w ∈ Ln (F ), para algum n.

Exemplos
I ε ∈ L(a∗ + b ∗ ), pois ε ∈ L(a∗ ) porque ε ∈ L0 (a)
I ε ∈ L(a∗ b ∗ ), pois ε = εε, ε ∈ L(a∗ ) e ε ∈ L(b ∗ )
I a ∈ L(a∗ ), pois a ∈ L1 (a)
I bb ∈ L(a∗ ) · L(b ∗ ), pois bb = εbb, ε ∈ L(a∗ ) e bb ∈ L(b ∗ ) porque
bb ∈ L2 (b)

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 18 / 20


Expressões Regulares Aplicações

Um exemplo mais elaborado

Note-se que E ∗ = ε + E + e E + = E E ∗ = E ∗ E
abc ∈ L((a + b)∗ (c + d))?
I abc ∈ L((a + b)∗ (c + d)) porque ab ∈ L((a + b)∗ ) e c ∈ L(c + d)
I c ∈ L(c + d) porque L(c + d) = L(c) ∪ L(d) e c ∈ L(c) = {c}
I ab ∈ L((a + b)∗ ) porque ab ∈ L(ε + (a + b)+ ) uma vez que
ab ∈ L((a + b)+ )
I ab ∈ L((a + b)+ ) porque a ∈ L((a + b)) e b ∈ L((a + b)∗ )
I b ∈ L((a + b)∗ ) porque b ∈ L(ε + (a + b)+ ) uma vez que
b ∈ L((a + b)+ )
I b ∈ L((a + b)(a + b)∗ ) porque b = bε, b ∈ L(a + b) e ε ∈ L((a + b)∗ )

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 19 / 20


Expressões Regulares Aplicações

Como verificar que dada palavra não pertence a uma


linguagem?

I Tem que se mostrar que não há nenhuma decomposição que permita
provar que pertence...
I Note-se que, para um alfabeto Σ, se dado sı́mbolo a ∈
/ Σ, então
/ Σ∗ , para {w1 , w2 } ⊆ Σ∗ .
w1 aw2 ∈

Exemplos
I ε∈/ L(a+ ) pois L(a+ ) = L(a) · L(a∗ ), ε = εε, mas ε ∈
/ L(a)
I abc ∈ +
/ L((a + b) ), pois considerando:
- (a + b)+ = (a + b)∗ (a + b) e apesar de ab ∈ L((a + b)∗ ), tem-se
que c ∈/ L(a + b) = {a, b}
- (a + b)+ = (a + b)(a + b)∗ e apesar de a ∈ L(a + b), tem-se que
bc ∈/ L((a + b)∗ ) = {a, b}∗

António Ravara (DI/FCT/UNL) Teoria da Computação 6 de Abril de 2020 20 / 20

Você também pode gostar