Альтернативный ответ: грамматика может давать только конечное число строк, а именно 6.
S -> aabbbaab | aabbb | bbaab | bb | abbaab | abb.
Теперь вы можете сжать это обратно в нормальную форму Хомского вручную.
Подстановкой мы можем найти множество всех произведенных строк. Ваши начальные правила:
S -> AB | aB.
A -> aab | lambda.
B -> bbA.
Сначала разделите правило S
:
S -> AB.
S -> aB.
Теперь подставим то, во что А и В расширяются:
S -> AB
-> (aab | lambda) bbA
-> (aab | lambda) bb (aab | lambda).
S -> aB
-> abbA
-> abb (aab | lambda).
Разверните их снова, чтобы получить:
S -> aabbbaab.
S -> aabbb.
S -> bbaab.
S -> bb.
S -> abbaab.
S -> abb.
Чтобы изменить этот конечный набор на нормальную форму Хомского, достаточно сделать это грубой силой без какого-либо разумного факторинга. Сначала мы вводим два терминальных правила:
X -> a.
Y -> b.
Теперь для каждой строки мы используем первую букву с терминальной переменной, а остальные буквы с новой переменной. Например, вот так:
S -> aabbb. (initial rule, not in Chomsky Normal Form)
S -> XC, where X->a and C->abbb.
C -> XD, where X->a and D->bbb.
D -> YE, where Y->b and E->bb.
E -> YY, where Y->b and Y->b.
Мы просто проходим этот процесс для всех 6 строк, генерируя много новых промежуточных переменных.