A importância de formas normais, como a forma normal de Chomsky, para CFGs

12

Entendo que gramáticas sem contexto podem ser usadas para representar linguagens sem contexto. Pode ter ambiguidades. Também temos formas normais, como a forma normal de Chomsky e Greibach . Eu não conseguia entender a necessidade disso.

Por que eles são importantes na teoria das línguas? Todos os livros que me referi relatam essas formas normais, mas não dizem nada sobre sua importância.

user5507
fonte
2
Formulários normais são úteis ao fornecer provas construtivas.
Karolis Juodelė

Respostas:

12

Existem pelo menos dois usos relevantes.

  1. Simplicidade de provas
    Existem muitas provas em torno de gramáticas sem contexto, incluindo redutibilidade e equivalência para automatizar. Essas são as mais simples, mais restrito é o conjunto de gramáticas com as quais você precisa lidar. Portanto, formas normais podem ser úteis lá.

    Como um exemplo concreto, forma normal Greibach é utilizado para mostrar (construtivamente), que existe um PDA livre--transition para cada CFL (que não contém ε ).εε

  2. Habilita a análise
    Embora os PDAs possam ser usados ​​para analisar palavras com qualquer gramática, isso geralmente é inconveniente. Formulários normais podem nos dar mais estrutura para trabalhar, resultando em algoritmos de análise mais fáceis.

    Como um exemplo concreto, o algoritmo CYK usa a forma normal de Chomsky. A forma normal de Greibach, por outro lado, permite a análise de descida recursiva; mesmo que o retorno seja necessário, a complexidade do espaço é linear.

Rafael
fonte
5

A forma normal de Chomsky permite que um algoritmo de tempo polinomial decida se uma sequência pode ser gerada por uma gramática. O algoritmo é bem liso se você conhece programação dinâmica ...

Se o comprimento da sua entrada ( ) for n , você terá um 2d array ( A ) de dim n x n .InAnn

A[i,j]GI(i,j)

A[1,n]SS

def decide (string s,grammar G):
    //base case
    for i=1 to n:
        N[i,i]=I[i]    //as the substring of length one can be generated by only a
                       terminal.
    //end base case

    //induction
    for s=1 to n:       //length of substring
        for i=1 to n-s-1: //start index of substring
            for j=i to i+s-1:   //something else
                 if there exists a rule A->BC such that B belongs to N[i,j] and C
                 belongs to N[j+1,i+s-1] then add A to N[i,i+s-1]
    //endInduction

    if S belongs to N[1,n] then accept else reject.

Eu sei que os índices parecem bem loucos. Mas basicamente aqui está o que está acontecendo.

  • O caso base é bem claro, eu acho.

  • ss

  • 5sub1A>BCBCAN[1,6]

  • N[1,n]

  • ishan3243
    fonte
    3
    Este é o algoritmo CYK que a) você deve nomear como tal eb) foi mencionado na minha resposta. Observe que o tempo de execução polinomial é impressionante apenas porque o algoritmo é uniforme sobre todos os CFGs, ou seja, é geral.
    Raphael
    @Raphael ok .... i não sabia o nome :)
    ishan3243
    4

    ϵ

    Dominik D. Freydenberger
    fonte