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
5sub
1A−>BCBCAN[1,6]
N[1,n]