Bentuk normal Chomsky memungkinkan algoritma waktu polinomial untuk memutuskan apakah suatu string dapat dihasilkan oleh tata bahasa. Algoritma ini cukup apik jika Anda tahu pemrograman dinamis ...
Jika panjang input Anda ( ) adalah maka Anda mengambil array 2d ( ) dari redup x .n A n nInAnn
G I ( i , j )A[i,j] menunjukkan semua simbol dalam tata bahasa yang dapat menurunkan sub-string .GI(i,j)
Jadi akhirnya jika berisi simbol awal ( ) maka itu berarti string saya dapat diturunkan oleh yang ingin kami periksa.S SA[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.
Saya tahu bahwa indeksnya terlihat cukup gila. Tapi pada dasarnya inilah yang terjadi.
Kasus dasarnya cukup jelas.
Pada langkah induktif kita membangun solusi untuk panjang substring dari semua solusi dengan panjang kurang dari .sss
Katakanlah, Anda menemukan solusi untuk panjang substring ( ) mulai dari indeks . Kemudian Anda memulai loop (bagian lain) ..... yang memeriksa apakah ada aturan ( ) sehingga dan mendapatkan dua substring yang berdekatan dan terpisah dari sub dan jika demikian tambahkan semua seperti itu ke .1 A - > B C B C A N [ 1 , 6 ]5sub
1A−>BCBCAN[1,6]
Akhirnya, jika Anda memiliki simbol awal dalam maka Anda menerima!N[1,n]