Escolar Documentos
Profissional Documentos
Cultura Documentos
Auto Matos
Auto Matos
Gabriel Fernando
March 2024
Autômatos Finitos
Neste capı́tulo estudaremos um modelo simples de computação, os autômatos
finitos, e a classe das linguagens regulares.
1 Linguagens Regulares
Voltaremos nossa atenção um instante para conjuntos (classes) de linguagens,
ou seja, conjuntos de conjuntos de strings.
A ∪ B = {x ∈ Σ∗ : x ∈ A ou y ∈ B}
A = {p1 p2 , p1 , p2 p1 }
B = {p1 p1 , p3 , p1 }
A∪B = {p1 p2 , p1 , p2 p1 , p1 p1 , p3 }
A ◦ B = {x · y ∈ Σ∗ : x ∈ A e x ∈ B}
1
A = {p1 p2 , p1 }
B = {p1 p1 , p3 }
A◦B = {p1 p2 p1 p1 , p1 p2 p3 , p1 p1 p1 , p1 p3 }
B◦A = {p1 p1 p1 p2 , p1 p1 p1 , p3 p1 p2 , p3 p1 }
A◦A = {p1 p2 p1 p2 , p1 p2 p1 , p1 p1 p2 , p1 p1 }
Podemos, por fim, aplica a estrela de Kleene sobre uma linguagem para
produzir todas as possı́veis concatenações dos elementos:
A∗ = {x1 . . . xk ∈ Σ∗ : xi ∈ A}
A = {a, b}
∗
A = {ε, a, b, aa, ab, bb, ba, aaa, aab, aba, abb, . . .}
Repare que a notação Σ∗ é consistente com a definição de estrela de Kleene.
As operações de união, concatenação e estrela de Kleene sobre linguagens
são chamadas operações regulares.
A = {a}
B = {aa, b}
A◦B = {aaa, ab}
A ∪ (A ◦ B) = {a, aaa, ab}
∗
(A ∪ (A ◦ B)) = {ε, a, aaa, ab, aa, aaaa, aab, aaaaaa, aaaab, . . .}
se A ∈ L então A∗ ∈ L
L1 = {{a}, {b}}
L2 = {{a}, {b}, {a, b}}
L3 = {{a}, {aa}, {aaa}, {aaaa} . . .}
L4 = {{a}, {ε, a, aa, aaa, . . .}}
2
L1 não é fechada por união, mas L2 é. L3 é fechada por concatenação e L4
é fechada pela estrela de Kleene.
A classe das linguagens regulares é a menor classe de linguagens fechada por
união, concatenação e estrela de Kleene que contém a seguinte linguagem:
{{a} : a ∈ Σ}
L(ø) = ∅
L(01) = L(0) ◦ L(1)
= {0} ◦ {1}
= {01}
⋆
L(01 1) = L(01⋆ ) ∪ L(1)
= L(0) ◦ L(1⋆ ) ∪ {1}
3
= {0} ◦ {1}∗ ∪ {1}
= {1, 0, 01, 011, 0111 . . .}
L(ϵø) = L(ϵ) ∪ L(ø)
= {ε} ∪ ∅
= {ε}
Podemos definir a classe das linguagens regulares como a classe das lingua-
gens expressı́veis por meio de expressões regulares.
Σ é uma alfabeto,
δ : Q × Σ → Q é uma função de estados e sı́mbolos em estados chamada
função de transição,
q0 ∈ Q é um estado chamado inicial e
A função de transição é representada por uma seta entre os estado com uma
etiqueta:
4
δ(q1 , a) = q2
M = ⟨Q, Σ, δ, q0 , F ⟩
Q = {q0 , q1 , q2 }
Σ = {0, 1}
F = {q1 }
δ 0 1
q0 q0 q1
q1 q2 q1
q2 q1 q1
δ(q0 , 0) = q0
δ(q0 , 1) = q1
δ(q1 , 0) = q2
δ(q1 , 1) = q1
δ(q2 , 0) = q1
δ(q2 , 1) = q1
3. rm ∈ F
5
Dizemos que M consome a string conforme passa de um estado para outro.
Assim, começando pelo estado inicial, a cada passo a função de transição indica
qual o próximo estado conforme consome um sı́mbolo da string. Ao final do
processo, quando todos os sı́mbolos foram consumidos, a string é aceita se o
estado atual for final.
Escrevemos L(M ) para a linguagem das strings aceitas por M .
L(M ) = {ω ∈ Σ∗ : M aceita ω}
3. r2 = q1 pois δ(q1 , 1) = q1
4. r3 = q2 pois δ(q1 , 0) = q2
5. r4 = q1 pois δ(q2 , 1) = q1
6. a string é aceita, pois r4 = q1 ∈ F
δ 0 1
q0 q0 q1
q1 q0 q1
δ 0 1
q0 q0 q1
q1 q0 q1
6
L(M2 ) = {ω ∈ {0, 1}∗ : ω = ε ou ω termina com 0}
δ a b
s q1 r1
q1 q1 q2
q2 q1 q2
r1 r2 r1
r2 r2 r1
δ 0 1
q0 q1 q0
q1 q2 q0
q2 q2 q3
q3 q3 q3
7
δ a b
q0 q1 q0
q1 q2 q1
q2 q3 q2
q3 q3 q3
δ a b
q0 q0 q1
q1 q1 q2
q2 q2 q2
8
Definimos formalmente um AFN é também definido como uma 5-upla N =
⟨Q, Σ, ∆, q0 , F ⟩, mas agora ∆ : Q × (Σ ∪ {ε}) → 2Q . Ou seja, a entrada da
função pode ser a string vazia ϵ e sua saı́da é um conjunto de estados.
Representamos o diagrama de estados da mesma forma que fizemos com os
AFDs, mas agora é possı́vel que de um mesmo estado partam mais de uma seta
com o mesmo sı́bolo, existem setas com ε e pode haver estados em que não haja
seta com determinado sı́mbolo.
Uma string é aceita por um AFN se existir alguma possibilidade de execução
do autômato que consuma toda string e termine em um estado final.
Formalmente, N = ⟨Q, Σ, ∆, q0 , F ⟩ aceita uma string ω = y1 . . . yn onde
yi ∈ Σ ∪ {ε} se existe uma sequência de estados r0 , . . . , rm tal que:
1. r0 = q0
2. ri+1 ∈ ∆(ri , yi+1 )
3. rm ∈ F
∆ 0 1 ε
q0 {q0 } {q0 , q1 } ∅
q1 {q2 } ∅ {q2 }
q2 ∅ {q3 } ∅
q3 {q3 } {q3 } ∅
9
Cada ramo dessa árvore representa uma possı́vel execução do autômato para
a entrada dada. O autômato para apenas quando toda a entrada foi consumida.
Note que nos três ramos mais a esquerda quando isso ocorre não estamos em
um estado final, mas nos dois ramos seguintes sim. Basta que exita um ramo,
uma possibilidade de execução, para que a string seja aceita. Assim, neste caso
a string de fato é aceita, basta escolher um caminha que termine em um estado
final. Por exemplo: q0 , q0 , q1 , q1 , q2 , q3 , q3 , q3 satisfaz a definição para a string
0101ε10 = 010110.
∆ 0 1 ε
q0 {q0 } {q0 , q1 } ∅
q1 {q2 } {q2 } ∅
q2 {q3 } {q3 } ∅
q3 ∅ ∅ ∅
O seguinte é o diagrama de N4 :
10
L(N4 ) = {ω ∈ {0}∗ : |ω| é múltiplo de 2 ou de 3}
O seguinte é o diagrama de N5 :
O seguinte é o diagrama de N6 :
4 AFD ≡ AFN
Vimos nas últimas seções dois modelos computacionais. O primeiro é mais
próximo da descrição de dispositivos simples, mas sua descrição em termos de
diagramas possui diversas limitações. O segundo modelo é mais flexı́vel e mais
fácil de descrever pictoricamente.
A pergunta que procuraremos responder nessa seção é se algum desses mod-
elos é mais expressivo que o outro. Ou seja, será que algum deles é capaz
de resolver problemas, reconhecer linguagens, que o outro não consegue. A re-
sposta será negativa. De fato, ambos os modelos são equivalentes em um sentido
bastante preciso. Comecemos então com essa definição.
Dois autômatos M1 e M2 são ditos equivalentes (escrevemos M1 ∼ M2 ) se
reconhecem a mesma linguagem, ou seja, se L(M1 ) = L(M2 ).
Exemplo : 2
M1 = ⟨{q0 , q1 }, {a}, δ, q0 , {q0 , q1 }⟩
δ a
q0 q1
q1 q0
11
[node distance=2cm,auto,¿=latex,initial text=] initial text= [state, initial,
accepting] (q0) q0 ; [state, accepting] (q1) at (3,0) q1 ; [-¿, bend left = 30] (q0)
edge node a (q1); [-¿, bend left = 30] (q1) edge node a (q0);
L(M1 ) = L(a⋆ )
L(M2 ) = L(a⋆ )
M1 ∼ M2
Primeiramente devemos mostrar que AFNs são uma extensão dos AFDs.
Essa parte coincide com nossa intuição uma vez que todo diagrama de um AFD
é também um diagrama para um AFN (o contrário não vale!). Vamos formalizar
essa ideia no seguinte teorema:
Se M é um AFD então existe um AFN N tal que M ∼ N Seja M =
⟨Q, Σ, δ, qo , F ⟩ um AFD qualquer. Considere o AFN N = ⟨Q, Σ, ∆, q0 , F ⟩ em
que: ′
{q } se a ∈ Σ e δ(a, q) = q ′
∆(a, q) =
∅ se a = ε
Note que os diagramas de M e de N são idênticos e segue trivialmente que
M ∼N
A demonstração da outra equivalência exige mais cuidado e faremos em duas
partes. Primeiro vamos supor que não fosse permitido mudar de estado sem
consumir sı́mbolos em um AFN. Ou seja, suponhamos que não seja permitido
usar ε nas setas no diagrama de estados. Vamos mostrar que é possı́vel construir
um AFD equivalente a esse AFN. A ideia da construção é que cada estado no
AFD simula um conjunto de estados no AFN. Conforme consumimos a string
nesse AFD o estado atual representa o conjunto de todos os estados possı́veis
no AFN ao consumir os mesmos sı́mbolos.
Seja N um AFN em que não é permitido mudar de estados sem consumir
sı́mbolos, então existe um AFD M tal que N ∼ M . Não faremos a
demonstração completa, apenas apresentaremos a construção e posteriormente
mostraremos alguns exemplos.
Seja N = ⟨Q, Σ, ∆, q0 , F ⟩, construiremos M = ⟨Q′ , Σ′ , δ, q0′ , F ′ ⟩ da seguinte
forma:
12
1. Q′ = 2Q
2. Σ′ = Σ
3. q0′ = {q0 }
4. F ′ = {R ∈ Q′ : R ∩ F ̸= ∅}
S
5. δ(R, a) = r∈R ∆(r, a)
∆ a b
1 ∅ {2}
2 {1, 2} {1}
M1 = ⟨{∅, {1}, {2}, {1, 2}}, {a, b}, δ, {1}, {{1}, {1, 2}}⟩
δ a b
∅ ∅ ∅
{1} ∅ {2}
{2} {1, 2} {1}
{1, 2} {1, 2} {1, 2}
13
Para completar nossa prova precisamos lidar com as setas rotuladas por ε.
O que faremos nesse caso será incluir no estado atual todos os estados que
conseguimos alcançar sem precisar consumir sı́mbolos.
Para todo AFN N existe um AFD M tal que N ∼ M . Sejam N e M
como definidos na demonstração do lema anterior Considere a seguinte função
E : Q′ → Q′ :
E(R) = {q ∈ Q : ∃q ′ ∈ R(q ′ ε q)}
Ou seja, existe um caminho de algum q ′ ∈ R até q passando apenas por setas
com etiqueta ε.
Vamos agora atualizar a definição de M em dois pontos:
3’. q0 = E({q0 })
S
5’. δ(R, a) = r∈R E(∆(r, a))
14
[state] (0) at (9,0)∅; [-¿] (1) edge node 1 (23); [-¿] (23) edge node 0 (3); [-¿] (3)
edge node 1 (0); [-¿] (1) edge[loop above] node 0 (1); [-¿] (23) edge[loop above]
node 1 (23); [-¿] (3) edge[loop above] node 0 (3); [-¿] (0) edge[loop above] node
0, 1 (0);
Removendo os estados supérfluos é fácil ver que:
L(M2 ) = L(N2 ) = L(0⋆ 11⋆ 0⋆ )
Portanto M2 ∼ N2 .
N1 = ⟨Q1 , Σ, ∆1 , q1 , F1 ⟩
N2 = ⟨Q2 , Σ, ∆2 , q1′ , F2 ⟩
Vamos construir N = ⟨Q, Σ, ∆, q0 , F ⟩:
Q = Q1 ∪ Q2 ∪ {q0 }
F = F1 ∪ F2
∆1 (q, a) se q ∈ Q1
∆2 (q, a) se q ∈ Q2
∆(q, a) =
{q1 , q1′ } se q = q0 e a = ε
∅ se q = q0 e a ̸= ε
2 N1
[node distance=2cm,auto,¿=latex,initial text=,color=blue] coil/.style=
decorate, decoration= snake=coil , [state, initial] (1) q1 ; [state, accepting,
minimum size=0pt] (2) at (3,1); [state, accepting, minimum size=0pt] (3) at
(3,0); [state, accepting, minimum size=0pt] (4) at (3,-1); [-¿] (1) edge[coil] (2);
[-¿] (1) edge[coil] (3); [-¿] (1) edge[coil] (4);
15
N2
[node distance=2cm,auto,¿=latex,initial text=,color=red] coil/.style=
decorate, decoration= snake=coil , [state, initial] (1) q1′ ; [state, accepting,
minimum size=0pt] (2) at (3,1); [state, accepting, minimum size=0pt] (4) at
(3,-1); [-¿] (1) edge[coil] (2); [-¿] (1) edge[coil] (4);
N
[node distance=2cm,auto,¿=latex,initial text=] coil/.style= decorate,
decoration= snake=coil , [state, initial] (0) q0 ; [state, color=blue] (1) at (2,1)
q1 ; [state, color=red] (2) at (2,-1) q1′ ; [state, accepting, minimum size=0pt,
color=blue] (f1) at (5,2); [state, accepting, minimum size=0pt, color=blue]
(f2) at (5,1); [state, accepting, minimum size=0pt, color=blue] (f3) at (5,0);
[state, accepting, minimum size=0pt, color=red] (f4) at (5,-1); [state,
accepting, minimum size=0pt, color=red] (f5) at (5,-2); [-¿] (0) edge node ε
(1); [-¿] (0) edge node ε (2); [-¿, color=blue] (1) edge[coil] (f1); [-¿, color=blue]
(1) edge[coil] (f2); [-¿, color=blue] (1) edge[coil] (f3); [-¿, color=red] (2)
edge[coil] (f4); [-¿, color=red] (2) edge[coil] (f5);
2 N1
[node distance=2cm,auto,¿=latex,initial text=] [state, initial, accepting] (1)
q1 ; [-¿] (1) edge[loop above] node 0 (1);
L(N1 ) = L(0⋆ )
N2
[node distance=2cm,auto,¿=latex,initial text=] [state, initial] (2) q2 ; [state,
accepting] (3) at (3,0)q3 ; [-¿] (3) edge[loop above] node 0 (3); [-¿] (2) edge
node1 (3);
L(N2 ) = L(10⋆ )
N
[node distance=2cm,auto,¿=latex,initial text=] [state, initial] (0) q0 ; [state,
accepting] (1) at (2, 1)q1 ; [state] (2) at (2, -1)q2 ; [state, accepting] (3) at (5,
-1)q3 ; [-¿] (1) edge[loop above] node 0 (1); [-¿] (3) edge[loop above] node 0 (3);
[-¿] (2) edge node1 (3); [-¿] (0) edge nodeε (1); [-¿] (0) edge nodeε (2);
16
hipótese garante que existem AFNs N1 e N2 tal que L(N1 ) = A e L(N2 ) = B.
Vamos construir a partir de N1 e N2 um AFN N tal que L(N ) = L(N1 ) ◦ L(N2 )
Sejam:
N1 = ⟨Q1 , Σ, ∆1 , q1 , F1 ⟩
N2 = ⟨Q2 , Σ, ∆2 , q1′ , F2 ⟩
Q = Q1 ∪ Q2
q0 = q1
F = F2
∆1 (q, a) se q ∈ Q1 e q ∈/ F1
∆1 (q, a) se q ∈ F1 e a ̸= ε
∆(q, a) =
1 a) ∪ {q1′ }
∆ (q, se q ∈ F1 e a = ε
∆2 (q, a) se q ∈ Q2
2 N1
[node distance=2cm,auto,¿=latex,initial text=,color=blue] coil/.style=
decorate, decoration= snake=coil , [state, initial] (1) q1 ; [state, accepting,
minimum size=0pt] (2) at (3,1); [state, accepting, minimum size=0pt] (3) at
(3,0); [state, accepting, minimum size=0pt] (4) at (3,-1); [-¿] (1) edge[coil] (2);
[-¿] (1) edge[coil] (3); [-¿] (1) edge[coil] (4);
N2
[node distance=2cm,auto,¿=latex,initial text=,color=red] coil/.style=
decorate, decoration= snake=coil , [state, initial] (1) q2 ; [state, accepting,
minimum size=0pt] (2) at (3,1); [state, accepting, minimum size=0pt] (4) at
(3,-1); [-¿] (1) edge[coil] (2); [-¿] (1) edge[coil] (4);
N
[node distance=2cm,auto,¿=latex,initial text=] coil/.style= decorate,
decoration= snake=coil , [state, initial, color=blue] (1) q1 ; [state, minimum
size=0pt, color=blue] (f1) at (3,1); [state, minimum size=0pt, color=blue] (f2)
at (3,0); [state, minimum size=0pt, color=blue] (f3) at (3,-1); [state,
color=red] (2) at (5,0) q2 ; [state, accepting, minimum size=0pt, color=red]
(f4) at (8,1); [state, accepting, minimum size=0pt, color=red] (f5) at (8,-1);
[-¿] (f1) edge node ε (2); [-¿] (f2) edge node ε (2); [-¿] (f3) edge node ε (2); [-¿,
color=blue] (1) edge[coil] (f1); [-¿, color=blue] (1) edge[coil] (f2); [-¿,
color=blue] (1) edge[coil] (f3); [-¿, color=red] (2) edge[coil] (f4); [-¿, color=red]
(2) edge[coil] (f5);
2 N1
17
[node distance=2cm,auto,¿=latex,initial text=] [state, initial, accepting] (1)
q1 ; [-¿] (1) edge[loop above] node 0 (1);
L(N1 ) = L(0⋆ )
N2
L(N2 ) = L(10⋆ )
N1 = ⟨Q1 , Σ, ∆1 , q1 , F1 ⟩
Q = Q1 ∪ {q0 }
F = F1 ∪ {q0 }
∆1 (q, a) se q ∈ Q1 e q ∈/ F1
∆1 (q, a) se q ∈ F1 e a ̸= ε
∆(q, a) = ∆1 (q, a) ∪ {q1 } se q ∈ F1 e a = ε
{q1 } se q = q0 e a = ε
∅ se q = q0 e a ̸= ε
N1
18
[node distance=2cm,auto,¿=latex,initial text=,color=blue] coil/.style=
decorate, decoration= snake=coil , [state, initial] (1) q1 ; [state, accepting,
minimum size=0pt] (2) at (3,1); [state, accepting, minimum size=0pt] (3) at
(3,0); [state, accepting, minimum size=0pt] (4) at (3,-1); [-¿] (1) edge[coil] (2);
[-¿] (1) edge[coil] (3); [-¿] (1) edge[coil] (4);
N
[node distance=2cm,auto,¿=latex,initial text=] coil/.style= decorate,
decoration= snake=coil , [state, initial, accepting] (0) q0 ; [state, color=blue]
(1) at (2,0) q1 ; [state, accepting, minimum size=0pt, color=blue] (f1) at (5,2);
[state, accepting, minimum size=0pt, color=blue] (f2) at (5,0); [state,
accepting, minimum size=0pt, color=blue] (f3) at (5,-2); [-¿] (0) edge node ε
(1); [-¿, color=blue] (1) edge[coil] (f1); [-¿, color=blue] (1) edge[coil] (f2); [-¿,
color=blue] (1) edge[coil] (f3); [-¿, bend right = 30] (f1) edge node[above]ε (1);
[-¿, bend right = 30] (f2) edge node[above]ε (1); [-¿, bend left = 30] (f3) edge
node ε (1);
N1
[node distance=2cm,auto,¿=latex,initial text=] [state, initial] (1) q1 ; [state] (2)
at (3,1)q2 ; [state, accepting] (3) at (6,1)q3 ; [state] (4) at (3,-1)q4 ; [state,
accepting] (5) at (6,-1)q5 ; [-¿] (1) edge node0 (2); [-¿] (1) edge node1 (4); [-¿]
(2) edge node1 (3); [-¿] (4) edge node0 (5);
L(N1 ) = L(0110)
N
[node distance=2cm,auto,¿=latex,initial text=] [state,initial, accepting] (1) q1 ;
[state] (1) at (3,0) q1 ; [state] (2) at (6,1)q2 ; [state, accepting] (3) at (9,1)q3 ;
[state] (4) at (6,-1)q4 ; [state, accepting] (5) at (9,-1)q5 ; [-¿] (0) edge nodeε (1);
[-¿] (1) edge node0 (2); [-¿] (1) edge node1 (4); [-¿] (2) edge node1 (3); [-¿] (4)
edge node0 (5); [-¿, bend right = 45] (3) edge node[above]ε (1); [-¿, bend left
= 45] (5) edge node ε (1);
19
Nε
[node distance=2cm,auto,¿=latex,initial text=] [state,initial,accepting] (1) q1 ;
N∅
[node distance=2cm,auto,¿=latex,initial text=] [state,initial] (1) q1 ;
Construiremos o autômato que reconhece L((aba)⋆ ) usando o método visto
neste capı́tulo:
a
[node distance=2cm,auto,¿=latex,initial text=] [state, initial, minimum
size=0pt] (1) ; [state, accepting, minimum size=0pt] (2) at (2,0) ; [-¿] (1) edge
nodea (2);
b
[node distance=2cm,auto,¿=latex,initial text=] [state, initial, minimum
size=0pt] (1) ; [state, accepting, minimum size=0pt] (2) at (2,0) ; [-¿] (1) edge
nodeb (2);
ab
aba
(aba)⋆
[node distance=2cm,auto,¿=latex,initial text=] [state, initial, accepting,
minimum size=0pt] (1) ; [state, minimum size=0pt] (2) at (1,0) ; [state,
minimum size=0pt] (3) at (2,0) ; [state, minimum size=0pt] (4) at (4,0) ;
[state, minimum size=0pt] (5) at (5,0) ; [state, accepting,minimum size=0pt]
(6) at (7,0) ; [state, minimum size=0pt] (7) at (2,-1); [state, accepting,
minimum size=0pt] (8) at (5,-1) ; [-¿] (1) edge nodeε (2); [-¿] (2) edge nodeε
(3); [-¿] (2) edge nodeε (7); [-¿] (3) edge nodea (4); [-¿] (4) edge nodeε (5); [-¿]
(5) edge nodeb (6); [-¿] (7) edge nodea (8); [-¿, bend left = 60] (8) edge nodeε
(2); [-¿, bend right = 45] (6) edge node[above]ε (2);
20
Para concluir, construiremos o autômato que reconhece L((ab)⋆ aba) usando
o método visto neste capı́tulo:
ab
(ab)⋆
aba
(ab)⋆ aba
21
6 Linguagens Reconhecı́veis por AFNs são Reg-
ulares
Na última seção vimos que toda linguagem regular pode ser reconhecida por
um autômato finito. Veremos agora a relação recı́proca, a saber, que toda
linguagem reconhecı́vel por um autômato é regular. Para isso comecemos com
a seguinte definição. Um Autômato Finito Generalizado (AFG) é uma 5-upla
⟨Q, Σ, δ, qi , qf ⟩ em que:
Q é um conjunto de estados,
Σ é um alfabeto,
qi ∈ Q é um estado chamado de inicial,
1. q0 = qi
2. qk = qf
3. ωj ∈ L(Rj ) onde Rj = δ(qj−1 , qj ) para 0 < j ≤ k
δ qi q1 q2 qf
qi × ø ab⋆ b
q1 × ab a⋆ b⋆
q2 × (aa)⋆ aa abba
qf × × × ×
22
aba, aab, abbbab, aaab, b ∈ L(G)
δ a b
1 1 2
2 2 2
δ′ s 1 2 f
s × ϵ ø ø
1 × a b ø
2 × ø ab ϵ
f × × × ×
Q′ = Q − {qr }
δ ′ (qj , qk ) = R1 R2⋆ R3 R4 aonde:
R1 = δ(qj , qr )
23
R2 = δ(qr , qr )
R3 = δ(qr , qk )
R4 = δ(qj , qk )
δ′ s 1 f
s × ϵ ø
1 × a b(ab)⋆
f × × ×
24
[node distance=2cm,auto,¿=latex,initial text=] [state, initial] (s) s; [state,
accepting] (f) at (6,0) f ;
[-¿] (s) edge nodea⋆ b(ab)⋆ (f);
7 Linguagens Não-Regulares
Neste capı́tulo vimos dois modelos computacionais: AFDs e AFNs. Ambos
reconhecem a mesma classe de linguagens, a saber, as linguagens regulares. Para
completar este capı́tulo veremos exemplos de linguagens que não são regulares.
[Lema do Bombeamento] Se A é uma linguagem regular então exite um
número p (chamado comprimento do bombeamento) tal que se ω ∈ A e |ω| ≥ p
então ω = x · y · z onde:
1. x · y i · z ∈ A para todo i ≤ 0,
2. |y| > 0 e
25
3. |x · y| ≤ p
Como A é regular, existe AFD M = ⟨Q, Σ, δ, q0 , F ⟩ tal que L(M ) = A. Seja
p = |Q| − 1 e seja ω ∈ A uma string tal que |ω| ≥ p.
Como ω = a1 a2 . . . an ∈ A = L(M ) existe uma sequência de estados q0 , . . . , qn
onde qn ∈ F e qi+1 = δ(qi , ai+1 ). Como |ω| = n ≥ p, pelo princı́pio da casa dos
pombos1 existe pelo menos um estado que se repete na sequência.
Seja qi o primeiro estado que se repete na sequência. Temos então a seguinte
situação:
26
eles reconhecem coincide com a classe das linguagens regulares. Terminamos o
capı́tulo vendo exemplos de linguagens que não são regulares.regulares.
27