Контекстная бесплатная грамматика, диапазон чисел - PullRequest
0 голосов
/ 25 октября 2018

У меня есть домашнее задание, чтобы написать контекстно-свободную грамматику, которая соответствует требованиям, указанным на языке ниже.

Context Free Grammer

Я написал это

My solution

Но это похоже на то же самое, я не уверен, что это где-то близко к правильному.

Любые отзывы / предложенияДобро пожаловатьЯ очень запутался в том, как написать часть "n> = 1".

1 Ответ

0 голосов
/ 25 октября 2018

Из вопроса и комментария Велбога кажется, что вы не знаете, как работают грамматики.Как вы, наверное, догадались, это нечто большее, чем просто записать те же математические обозначения, что и в постановке задачи.Вот супер-краткое руководство о том, как работают грамматики.

Грамматики имеют терминальные символы и нетерминальные символы.Терминальные символы являются символами в алфавите языка, в то время как нетерминалы являются просто вымышленными заполнителями пользователей грамматики.Нетерминалы связаны со строками нетерминалов и терминалов тем, что называется продукцией.Продукция описывает, чем нетерминальный символ (слева) можно заменить (справа).Грамматики имеют начальный нетерминальный символ (часто S), и говорят, что они генерируют или описывают язык строк, который можно получить, начиная с начального нетерминала, и последовательно применяя произведения для замены всех нетерминальных символов на терминальные символы.Например, вот простая грамматика для языка a*b*:

1) S -> AB        Nonterminals: S, A, B
2) A -> e         Terminals: a, b
3) A -> aA        Special: e is the empty string
4) B -> e
5) B -> bB

Мы видим, что строка aaabb на языке выглядит следующим образом:

   S         start nonterminal
-> AB        production (1): S -> AB
-> aAB       production (3): A -> aA
-> aaAB      production (3): A -> aA
-> aaaAB     production (3): A -> aA
-> aaaB      production (2): A -> e
-> aaabB     production (5): B -> bB
-> aaabbB    production (5): B -> bB
-> aaabb     production (4): B -> e

Так что в вашем случае, мы хотим создать грамматику, которая генерирует вдвое больше 1 с на конце, чем 0 с на фронте, со всеми 0 с до 1 с.Чтобы сделать это, мы должны убедиться, что любое производство, которое добавляет 0, добавляет его впереди и добавляет ровно два 1 сзади.Такое производство:

S -> 0S11

Теперь, только с этим производством мы никогда не сможем избавиться от S.Нам нужно избавиться от S, добавив производство, которое заменяет S чем-то, что не ссылается на нетерминалы.Одним из вариантов является пустая строка e:

S -> 0S11
S -> e

Тем не менее, мы можем видеть, что это создает пустую строку с помощью производной S -> e, которая не является строкой на нужном языке (где n >= 1).Поэтому мы должны попробовать другое производство.Самая короткая строка в нашем языке - 011, поэтому мы можем попробовать

S -> 0S11
S -> 011

. Мгновенное размышление должно убедить вас, что это, вероятно, грамматика, которая генерирует нужный нам язык.

...