DCC063
Linguagens Formais
e Autômatos
Formas Normais
As formas normais estabelecem restrições rígidas na definição das produções, sem reduzir o poder de geração das GLC.
Uma forma normal descreve um conjunto de condições que todas as regras da gramática deve satisfazer
GLC
Formas Normais
São usadas principalmente no desenvolvimento
de algoritmos (com destaque para
reconhecedores de linguagens) e na prova de teoremas. As formas normais estudadas serão:
Forma Normal de Chomsky
Forma Normal de Greibach
GLC
Forma Normal de Chomsky
Uma GLC G = (N, T, P, S) é dita na Forma Normal de Chomsky (FNC) se todas as suas produções são da forma:
A → BC ou
A → a
onde A, B e C N e a T
Linguagem não aceita palavra vazia
GLC
FNC (algoritmo GLC→FNC)
Etapa 1 – Simplificação da Gramática : Eliminação das -produções
Eliminação das produções da forma A → B (produções unitárias)
Eliminação dos símbolos inúteis (não geradores e inalcançáveis)
Gramática resultante: G1 = (N1, T1, P1, S)
GLC
FNC (algoritmo GLC→FNC)
Etapa 2 – Transformação do lado direito das produções de comprimento maior ou igual a dois:
Garante que o lado direito das produções com comprimento 2 é composto exclusivamente por variáveis.
exclusão de um terminal pode ser realizada colocando-se um não terminal intermediário. Por exemplo, é possível substituir a por Ca e incluir a produção Ca → a
GLC
FNC (algoritmo GLC→FNC)
Etapa 2 – Transformação do lado direito das produções de comprimento maior ou igual a dois:
Para todo terminal a que aparecer em uma forma sentencial de comprimento 2 ou mais, crie uma nova variável, digamos A. Essa variável terá apenas uma produção A → a. Agora usamos A no lugar de a
em todo lugar em que a aparecer em uma forma sentencial de comprimento 2 ou mais.
GLC
FNC (algoritmo GLC→FNC)
Etapa 3: Transformação do lado direito das produções de comprimento maior ou igual a três em produções com exatamente duas variaveis:
O lado direito da produção com comprimento > 1 é composto por exatamente duas variáveis.
Desmembrar as formas sentenciais de comprimento 3 ou mais em uma cascata de produções, cada uma com uma forma sentencial consistindo em 2 variáveis:
GLC
GLC
FNC (algoritmo GLC→FNC)
Exemplo 1. Transforme a gramática abaixo na Forma Normal de Chomsky
E → E+E | E*E | [E] | a
GLC
GLC
FNC (algoritmo GLC→FNC)
Exemplo 1.
1) a gramática já está simplificada
2)exceto a produção E → a, as demais produções devem ser substituídas:
E → EC+E | EC*E | C[EC] | a C+ → +
C* → * C[→ [ C] →]
GLC
FNC (algoritmo GLC→FNC)
Exemplo 1.
3) As produções de comprimento 3 devem ser substitudas por:
E → ED1 | ED2 | C[D3 D1 → C+E
D2 → C*E D3 → EC[
GLC
E → ED1 | ED2 | C[D3 | a D1 → C+E
D2 → C*E D3 → EC[
C+ → + C* → * C[→ [ C] →]
FNC (algoritmo GLC→FNC). Exemplo 1. GLC final na FNC:
FNC (algoritmo GLC→FNC)
Exemplo 2. Transforme a gramática abaixo na Forma Normal de Chomsky
S → SS | (S) |
GLC
GLC
FNC (algoritmo GLC→FNC)
Exemplo 2.
1) Simplificando a gramática
1.1 – Eliminação das -produções S → SS | (S) | S | ()
1.2 – Eliminação das produções unitárias S → SS | (S) | ()
GLC
FNC (algoritmo GLC→FNC)
Exemplo 2.
2) Subistituição dos terminais nas produções com comprimento 2:
S → SS | ASF | AF A → (
F → )
GLC
FNC (algoritmo GLC→FNC)
Exemplo 2.
3) Produção com comprimento 3:
S → SS | ASF | AF A → (
F → )
S → SS | AB | AF
B → SF A → ( F → )
Forma Normal de Greibach
Uma GLC G = (N, T, P, S) obedece a Forma Normal de Greibach (FNG) se todas as suas produções são da forma:
A → a
onde AN, aT e N* (palavra de variáveis).
O algoritmo de transformação é composto por 6 etapas, sendo que a primeira corresponde a primeira etapa da FNC (simplicação da GLC).
GLC
Forma Normal de Greibach
Algoritmo para transformar GLC → FNG.
Simplificação da gramática (-produção, unitárias e símbolos inúteis – não geradores e inalcançáveis).
Renomeação (reordenação) das variáveis em uma ordem crescente qualquer.
Transformação das produções para a forma
Ar→ As onde: r s e (NT)*.
Remoção da recursão a esquerda.
GLC
Forma Normal de Greibach
Algoritmo para transformar GLC → FNG.
Um terminal no início do lado direito de cada produção:
◼ Após a etapa anterior, todas as produções são da forma Ar→ As com r < s.
◼ Consequentemente, as produções da maior variável An só podem iniciar por um terminal no lado direito.
◼ Assim, se substituir An em An-1→ An por suas correspondentes produções, o lado direito de An-1 também começarão por um terminal.
◼ Repetindo-se esse passo para An-2, An-3, ... A1, todas as produções começarão por um terminal.
GLC
Forma Normal de Greibach
Algoritmo para transformar GLC → FNG.
Converter as produções para a forma A → a onde é composta por variáveis.
◼ Análogo a correspondente da FNC (substituir os terminais, se existirem, em por novas variáveis).
GLC
GLC
GLC → FNG.
Exemplo 1. Tranformar pra FNG a seguinte gramática:
S → AA | a A → SS | b
GLC
FNG (algoritmo GLC→FNG)
Exemplo 1.
1) Simplificação. Já está simplificada
2) Renomeação (reordenação) das variáveis. Convencionaremos a mesma ordem na qual elas aparecem na gramática (de cima p/ baixo):
(1) S → AA | a (2) A → SS | b
GLC
FNG (algoritmo GLC→FNG)
Exemplo 1.
3) Tornar Ar → As tal que r s e retirar a RE.
(1) S → AA | a (2) A → SS | b
Resultado
(1) S → AA | a
(2) A → AAS | aS | b
GLC
FNG (algoritmo GLC→FNG)
Exemplo 1.
3) Tornar Ar → As tal que r s e retirar a RE. Retirar a RE
(1) S → AA | a
(2) A → AAS | aS | b
Resultado
(1) S → AA | a
(2) A → aS | b | aSB | bB B → AS | ASB
GLC
FNG (algoritmo GLC→FNG)
Exemplo 1.
4) Terminal no início de cada lado direito.
(1) S → AA | a
(2) A → aS | b | aSB | bB B → AS | ASB
Substituindo as producões de A em S → AA (1) S → aSA | bA | aSBA | bBA | a (2) A → aS | b | aSB | bB
B → AS | ASB
GLC
FNG (algoritmo GLC→FNG)
Exemplo 1.
Substituindo as producões de A em B → AS | ASB (1) S → aSA | bA | aSBA | bBA | a
(2) A → aS | b | aSB | bB
B → aSS | bS | aSBS | bBS | aSSB | bSB | aSBSB | bBSB
5) A → a, onde aT e N*. As produções já estão nesta forma.
GLC
Exercícios
Transformar as seguintes GLC para a FNC e FNG.
1) E → E + T | T T → T * F | F
F → (E) | id
2) S → SS | a
3) S → aSa | bSb | c 4) S → aSb | aSc | d
5) S → aSbS | bSaS | ab | ba
GLC
Propriedades de fechamento
Teorema: As linguagens livres de contexto são
fechadas em relação as operações de:
União:
Se L1 e L2 são LLC L1L2 também é uma LLC.
Concatenação:
Se L1 e L2 são LLC L1L2 também é uma LLC.
Estrela de Kleene (*):
Se L é uma LLC L* também é uma LLC.
GLC
Propriedades de fechamento
Teorema: A classe de LLC não é fechada para as
operações de interseção ou complementação.
Demonstração. Sejam:
L1 = {anbncm | m, n 0} uma LLC L2 = {ambncn | m, n 0} uma LLC
Portanto, L1 L2
L = {anbncn | n 0}.
L não é uma LLC (fato que não foi provado. Deve-se usar o LB para LLC para provar que L não é uma LLC).
GLC
Propriedades de fechamento
Teorema: A interseção de LLC com uma LR é uma
LLC.
Exemplo. Sejam:
L1 = a*b* uma LR
L2 = {w | w {a, b}* e |w|a = |w|b} uma LLC
Portanto, L1 L2 é
L = {anbn| n 0}
Como se sabe, L é uma LLC (foi provado que L não é regular e foi desenvolvido um AP para L).