Нормальна форма Хомського дозволяє алгоритму багаточленного часу вирішити, чи може породжуватися рядка граматикою. Алгоритм досить гладкий, якщо ви знаєте динамічне програмування ...
Якщо довжина вашого вводу ( ) дорівнює n, то ви берете 2d масив ( A ) dim n x n .ЯнАнн
позначає всі символи в граматиці G, які можуть виводити підрядок I ( i , j ) .A [ i , j ]ГЯ( i , j )
Отже, якщо містить символ початку ( S ), то це означає, що рядок I може бути отриманий S , що ми хотіли перевірити.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.
Я знаю, що показники здаються досить божевільними. Але в основному ось що відбувається.
Я думаю, базовий випадок досить зрозумілий.
сс
5sub
1A - > B CБСАN[ 1 , 6 ]
N[ 1 , n ]