Нормальная форма Хомского позволяет алгоритму полиномиального времени решать, может ли строка быть сгенерирована грамматикой. Алгоритм довольно ловкий, если вы знаете динамическое программирование ...
Если длина вашего ввода ( ) равна тогда вы берете двумерный массив ( ) dim x .н А н няNANN
G I ( i , j )A [ i , j ] обозначает все символы в грамматике которые могут выводить подстроку .граммя( я , j )
Итак, наконец, если содержит начальный символ ( ), то это означает, что строка I может быть получена с помощью что мы и хотели проверить.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.
Я знаю, что индексы кажутся довольно сумасшедшими. Но в основном вот что происходит.
Базовый случай довольно ясен, я думаю.
На индуктивном шаге мы строим решение для подстроки длины из всех решений с длиной меньше .sss
5sub
1A−>BCBCAN[1,6]
N[1,n]