Преобразование грамматики в нормальную форму Хомского?
преобразовать грамматику ниже в нормальную форму Хомского. Дайте все промежуточные шаги.
S -> AB | aB
A -> aab|lambda
B -> bbA
Ok, поэтому первое, что я сделал, это добавил новую переменную start S0
Итак, теперь у меня
S0 -> S
S -> AB | aB
A -> aab|lambda
B -> bbA
затем я удалил все правила лямда:
S0 -> S
S -> AB | aB | B
A -> aab
B -> bbA | bb
затем я проверил для S->S
и A->B
введите правила, которых не существовало. И это был ответ, который я придумал, нужно ли мне что-то делать дальше или я сделал что-то неправильно?
3 ответов
в Википедии написано:
в информатике говорят, что контекстно-свободная грамматика находится в нормальной форме Хомского, если все ее производственные правила имеют форму:
- A ->BC или
- A -> α и
- S -> ε
здесь A, B, C являются нетерминальными символами, α - символ терминала,S - начальный символ, а ε-пустая строка. Кроме того, ни B, ни C может быть символом начала.
продолжение вашей работы:
S0 -> S S -> AB | aB | B A -> aab B -> bbA | bb
вместо |
чтобы обозначить различные варианты, разделите правило на несколько правил.
S0 -> S S -> AB S -> aB S -> B A -> aab B -> bbA B -> bb
создать новые правила Y -> a
и Z -> b
потому что они нам нужны скоро.
S0 -> S S -> AB S -> aB S -> B A -> aab B -> bbA B -> bb Y -> a Z -> b
S -> aB
не имеет формы S -> BC
, потому что a
терминал. Так измени a
на Y
:
S0 -> S S -> AB S -> YB S -> B A -> aab B -> bbA B -> bb Y -> a Z -> b
сделать то же самое для B -> bb
правила:
S0 -> S S -> AB S -> YB S -> B A -> aab B -> bbA B -> ZZ Y -> a Z -> b
на A -> aab
создать C -> YY
; for B -> bbA
создать D -> ZZ
:
S0 -> S S -> AB S -> YB S -> B A -> CZ C -> YY B -> DA D -> ZZ B -> ZZ Y -> a Z -> b
на S -> B
, дублируйте одно правило, где S
происходит с правой стороны и встроить правило:
S0 -> B S0 -> S S -> AB S -> YB A -> CZ C -> YY B -> DA D -> ZZ B -> ZZ Y -> a Z -> b
разобраться с правилами S0 -> B
и S0 -> S
путем присоединения правой стороны к левой стороне других правил. Кроме того, удалите осиротевшие правила (где символ LHS никогда не используется на RHS):
S0 -> DA S0 -> ZZ S0 -> AB S0 -> YB A -> CZ C -> YY B -> DA D -> ZZ B -> ZZ Y -> a Z -> b
и мы закончили. Фу!
Не вдаваясь в слишком много теории и доказательств(вы можете посмотреть на это в Википедии), есть несколько вещей, которые вы должны сделать при преобразовании контекстной свободной грамматики в нормальную форму Хомского, вам обычно нужно выполнить четыре преобразования нормальной формы. Во - первых, вам нужно определить все переменные, которые могут дать пустую строку(лямбда/Эпсилон), прямо или косвенно-(лямбда-свободная форма). Во-вторых, вам нужно удалить unit productions - (Unit-Free form). В-третьих, вам нужно найти все переменные, которые являются живыми / полезными (полезность). Четыре, вам нужно найти все доступные символы (возможно). На каждом шагу вы можете иметь или не иметь новую грамматику. Вот что я придумал для твоей проблемы...
Контекстно-Свободная Грамматика
G(Variables = { A B S }
Start = S
Alphabet = { a b lamda}
Production Rules = {
S -> | AB | aB |
A -> | aab | lamda |
B -> | bbA | } )
удалить лямбда / Эпсилон
ERRASABLE(G) = { A }
G(Variables = { A S B }
Start = S
Alphabet = { a b }
Production Rules = {
S -> | AB | aB | B |
B -> | bbA | bb | } )
удалить блок produtions
UNIT(A) { A }
UNIT(B) { B }
UNIT(S) { B S }
G (Variables = { A B S }
Start = S
Alphabet = { a b }
Production Rules = {
S -> | AB | aB | bb | bbA |
A -> | aab |
B -> | bbA | bb | })
определить живые символы
LIVE(G) = { b A B S a }
G(Variables = { A B S }
Start = S
Alphabet = { a b }
Production Rules = {
S -> | AB | aB | bb | bbA |
A -> | aab |
B -> | bbA | bb | })
удалить недостижимые
REACHABLE (G) = { b A B S a }
G(Variables = { A B S }
Start = S
Alphabet = { a b }
Production Rules = {
S -> | AB | aB | bb | bbA |
A -> | aab |
B -> | bbA | bb | })
заменить все смешанные строки с твердыми нетерминалами
G( Variables = { A S B R I }
Start = S
Alphabet = { a b }
Production Rules = {
S -> | AB | RB | II | IIA |
A -> | RRI |
B -> | IIA | II |
R -> | a |
I -> | b | })
Хомский Нормальной Формы
G( Variables = { V A B S R L I Z }
Start = S
Alphabet = { a b }
Production Rules = {
S -> | AB | RB | II | IV |
A -> | RL |
B -> | IZ | II |
R -> | a |
I -> | b |
L -> | RI |
Z -> | IA |
V -> | IA | })
альтернативный ответ: грамматика может производить только конечное число строк, а именно 6.
S -> aabbbaab | aabbb | bbaab | bb | abbaab | abb.
теперь вы можете сконденсировать это обратно в нормальную форму Хомского вручную.
путем подстановки мы можем найти набор всех произведенных строк. Ваши первоначальные правила:
S -> AB | aB.
A -> aab | lambda.
B -> bbA.
сначала разделить S
правила:
S -> AB.
S -> aB.
теперь замените то, что A и B расширяются в:
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 строк, генерируя много новых промежуточных переменная.