1. Faculdade de Engenharia de Computação
Teoria da Computação:
Linguagens Formais e Autômatos
Aula 9 – Conversão de AF para
gramática regular
Professor Ronaldo Luiz Alonso
2. Problema
Construa uma gramática regular G gere a linguagem L:
L = { w | w contém um número par de 0’s ou um número par de de 1’s }
Solução:
Para resolver esse problema, iremos construir um autômato finito que
reconheça cadeias com essa propriedade.
Em seguida, a partir deste autômato, iremos criar uma linguagem
regular que gera o mesmo tipo de cadeias que o autômato reconhece.
3. Solução
Podemos dividir as cadeias em quatro categorias:
A – número par de zeros e número par de uns.
B – número par de zeros e número ímpar de uns.
C – número ímpar de zeros e numero par de uns.
D – número ímpar de zeros e numero ímpar de uns.
Para cada uma destas categorias, criamos um estado no AF que
estamos construindo.
Notamos inicialmente que a cadeia vazia tem um número par de zeros
e um número par de uns.
4. Solução
A
B
C
D
A – número par de zeros e número par de uns.
B – número par de zeros e número ímpar de uns.
C – número ímpar de zeros e numero par de uns.
D – número ímpar de zeros e numero ímpar de uns.
1
1
0
0
0
0
1
1
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
M = { {A,B,C,D}, {A}, A, Σ, δ }
Σ ={0,1}
5. Solução
Para criar uma gramática G que gere as mesmas cadeias que o
autômato M reconhece, primeiramente, fazemos:
1) Com que o símbolo inicial de G seja o estado inicial de M.
2) Para cada estado Ai de M crie um não terminal Ai em G.
3) Para cada transição δ (Ai,x) = Aj adicionamos a regra de
produção Ai → xAj
4) Para cada estado final Ai adicionamos a produção Ai → ε
6. Solução
Aplicando as regras anteriores no
autômato M construído, temos que
a gramática G é dada por:
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
Σ ={0,1}
M = { {A,B,C,D}, {A}, A, Σ, δ }
G = { {A,B,C,D}, Σ, A, P}
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
7. Para ver por que este mapeamento é feito desta maneira,
vamos gerar a cadeia 010010 pela gramática e reconhece-
la também pelo autômato. Essa cadeia pode ser gerada
pela gramática reconhecida pelo autômato, porque tem 4
zeros e 2 uns.
Geração e reconhecimento de cadeias
8. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
A
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
9. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
A
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A
10. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
C
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A 0C
11. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
D
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A 0C 01D
12. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
B
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A 0C 01D 010B
13. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
D
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A 0C 01D 010B 0100D
14. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
C
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A 0C 01D 010B 0100D
01001C
15. A
B
C
D
1
1
0
0
0
0
1
1
0 1 0 0 1 0
A
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
A 0C 01D 010B 0100D
01001C 010010A
16. A
B
C
D
1
1
0
0
0
0
1
1
δ (A,0) = C
δ (A,1) = B
δ (B,0) = D
δ (B,1) = A
δ (C,0) = A
δ (C,1) = D
δ (D,0) = B
δ (D,1) = C
P = { A → 0C,
A → 1B,
B → 0D,
B → 1A,
C → 0A,
C → 1D,
D → 0B,
D → 1C,
A →ε }
0 1 0 0 1 0
A
A 0C 01D 010B 0100D
01001C 010010A 010010
17. Verificando uma Gramática
• A prova que uma gramática G gera uma linguagem L tem duas partes:
• Mostrar que toda cadeia gerada por G está em L.
• Mostrar que toda cadeia em L pode ser de fato gerada por G.
18. Exemplo
• Considere a seguinte gramática:
S → ( S ) S | ɛ
Pode não ser aparente, mas esta gramática simples gera todas as
cadeias de parênteses balanceados e apenas tais cadeias.
Para ver isso devemos inicialmente mostrar que toda sentença derivável de S
é balanceada, e então que toda cadeia balanceada é derivável de S.
19. Prova: Usando Indução
Base: A base é n=1. A única string de terminais derivável
de S em um único passo é a cadeia vazia, que é
trivialmente balanceada.
Indução: Assumimos que todas as derivações com menos
que n passos produzem sentenças balanceadas e
consideramos uma derivação mais à esquerda de
exatamente n passos. Tal derivação precisa ser da
forma:
S lm ( S ) S *
lm (x) S *
lm (x) y
As derivações de x e y a partir de S tiveram menos que n
passos, então pela hipótese indutiva x e y estão
balanceados. No último passo o S presente em x e em y
será trocado por ɛ que é balanceado.
20. Prova: (cont)
• Devemos agora provar que toda string balanceada é derivável de S. Usamos agora
indução no tamanho da string:
Base: Se a cadeia tiver tamanho 0 ela precisa ser ɛ, a qual é balanceada.
Indução: Inicialmente observe que toda cadeia balanceada de tamanho menor que
2n é derivável de S e considere uma cadeia balanceada w de tamanho 2n, n≥1.
Claramente w começa com um parêntese esquerdo. Seja (x) o prefixo mais curto
de w tendo um número igual de parênteses à direita e à esquerda. Então w pode
ser escrito como w = (x)y onde ambos x e y são balanceados. Desde que x e y são
de tamanho menor que 2n, eles são deriváveis de S por hipótese indutiva. Assim
podemos encontrar uma derivação da forma:
S lm ( S ) S *
lm (x) S *
lm (x) y
Provando que w = (x)y é também derivável de S.