Из вопроса и комментария Велбога кажется, что вы не знаете, как работают грамматики.Как вы, наверное, догадались, это нечто большее, чем просто записать те же математические обозначения, что и в постановке задачи.Вот супер-краткое руководство о том, как работают грамматики.
Грамматики имеют терминальные символы и нетерминальные символы.Терминальные символы являются символами в алфавите языка, в то время как нетерминалы являются просто вымышленными заполнителями пользователей грамматики.Нетерминалы связаны со строками нетерминалов и терминалов тем, что называется продукцией.Продукция описывает, чем нетерминальный символ (слева) можно заменить (справа).Грамматики имеют начальный нетерминальный символ (часто 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
. Мгновенное размышление должно убедить вас, что это, вероятно, грамматика, которая генерирует нужный нам язык.