Dạng bình thường Chomsky cho phép thuật toán thời gian đa thức quyết định xem một chuỗi có thể được tạo bởi một ngữ pháp hay không. Thuật toán khá lắt léo nếu bạn biết lập trình động ...
Nếu độ dài của đầu vào ( ) của bạn là n thì bạn lấy một mảng 2d ( A ) 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.
Tôi biết rằng các chỉ số có vẻ khá điên rồ. Nhưng về cơ bản đây là những gì đang xảy ra.
Các trường hợp cơ bản là khá rõ ràng tôi nghĩ.
ss
5sub
1A−>BCBCAN[1,6]
Cuối cùng, nếu bạn có biểu tượng bắt đầu trong N[1,n]