Постройте грамматику для следующего языка {a^n b^m | n,m = 0,1,2,,n ‹= 2m}

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

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

Также как написать грамматику для L:

L = {an bm | n,m = 0,1,2,..., n ‹= 2m } ?

Заранее спасибо.


person user2197126    schedule 21.03.2013    source источник
comment
Не лучше ли спросить у вашего ТА или профессора?   -  person Matt Ball    schedule 22.03.2013
comment
Нет, в эти дни мы обращаемся к StackOverflow за всем, включая домашние задания.   -  person Jonathon Reinhart    schedule 22.03.2013
comment
в нем четко указано, что это был вопрос на промежуточном этапе. У меня сейчас весенние каникулы, поэтому я не могу спросить своего профессора. Спасибо хоть.   -  person user2197126    schedule 22.03.2013
comment
@user2197126 user2197126 на самом деле ваш вопрос очень хороший, но вы задали неверную форму переполнения стека, имея еще один сайт, где Вы можете задать свои теоретические вопросы. Эта форма больше связана с программированием. Хотя, я добавил свой ответ, надеюсь, вы найдете его полезным.   -  person Grijesh Chauhan    schedule 22.03.2013


Ответы (1)


Как написать грамматику формального языка?

Прежде чем читать этот ответ, вы должны сначала прочитать: Советы по созданию Контекстно-независимые грамматики.

Грамматика для {an bm | n,m = 0,1,2,..., n ‹= 2m }

Какой у вас язык L = {an bm | n,m = 0,1,2,..., n ‹= 2m } описание?

Описание языка: язык L состоит из набора всех строк, в которых за символами a следуют символы b, где количество символов b больше или равно половине количества символов a.

Чтобы понять яснее:

В шаблоне an bm сначала идут символы a, затем символ b. общее количество элементов a равно n, а количество элементов b равно m. Уравнение неравенства говорит о связи между n и m. Чтобы понять уравнение:

given:   n <= 2m   
=>       n/2 <= m       means `m` should be = or > then n/2

=>       numberOf(b) >= numberOf(a)/2    ...eq-1

Таким образом, неравенство n и m говорит:

numberOf(b) должно быть больше или равно половине от numberOf(a)

Некоторые примеры строк в L:

b   numberOf(a)=0 and numberOf(b)=1  this satisfy eq-1        
bb  numberOf(a)=0 and numberOf(b)=2  this satisfy eq-1 

Таким образом, в языковой строке возможно любое количество b без a. (любая строка b), потому что любое число больше нуля (0/2 = 0).

Другие примеры:

                                     m   n
                                 --------------  
ab     numberOf(a)=1 and numberOf(b)=1 > 1/2   
abb    numberOf(a)=1 and numberOf(b)=2 > 1/2  
abbb   numberOf(a)=1 and numberOf(b)=3 > 1/2  
aabb   numberOf(a)=2 and numberOf(b)=2 > 2/2 = 1  
aaabb  numberOf(a)=3 and numberOf(b)=2 > 3/2 = 1.5
aaaabb numberOf(a)=4 and numberOf(b)=2 = 4/2 = 2  

Обратите внимание:

  • все приведенные выше строки возможны, поскольку количество строк b равно (=) половине числа a или больше (>) .

  • и интересно отметить, что общее количество a также может быть больше, чем число b, но не слишком много. Принимая во внимание, что количество b может быть больше количества a в любое количество раз.

Еще два важных случая:

  • только a в виде строки невозможно.

  • Примечание: нулевая строка ^ также разрешена, потому что в ^ , numberOf(a) = numberOf(b) = 0 это удовлетворяет уравнению.

Сразу кажется, что писать грамматику сложно, но на самом деле это не так...

Согласно описанию языка, нам нужны следующие виды правил:

правило 1: генерировать ^ нулевую строку.

 N --> ^  

правило 2: создание любого количества b

 B --> bB | b  

Правило 3: чтобы сгенерировать a:
(1) Помните, что вы не можете сгенерировать слишком много a, не сгенерировав < em>b.
(2) Поскольку b больше, чем = половина a; вам нужно сгенерировать один b для каждого альтернативного a
(3) Только a в виде строки невозможно, поэтому для первого (нечетного) альтернативного варианта вам нужно добавить b с a
(4) В то время как для четного варианта вы можете отказаться от добавления b ( но не обязательно)

Итак, ваша общая грамматика:

   S --> ^ | A | B
   B --> bB | b

   A --> aCB | aAB | ^
   C --> aA | ^

здесь S - начальная переменная.

В приведенных выше правилах грамматики у вас может возникнуть путаница в A --> aCB | aAB | ^, поэтому ниже мое объяснение:

A --> aCB | aAB | ^   
       ^_____^
       for second alternative a 

C --> aA    <== to discard `b`    

and  aAB  to keep b

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

  ab     S --> A --> aCB --> aB --> ab                        
  abb    S --> A --> aCB --> aB --> abB --> abb
  abbb   S --> A --> aCB --> aB --> abB --> abB --> abbB --> abbb 
  aabb   S --> A --> aAB --> aaABB --> aaBB --> aabB --> aabb
  aaabb  S --> A --> aCB --> aaAB -->  aaaABB --> aaaBB --> aaabB --> aaabb
  aaaabb S --> A --> aCB --> aaAB --> aaaCBB --> aaaaABB --> aaaaBB 
                                                         --> aaaabB 
                                                         --> aaaabb

Еще один для строки non-member:

согласно языку a5 b2 = aaaaabb не возможно. потому что 2 >= 5/2 = 2,5 ==> 2 >= 2,5 неравенство не выполняется. Таким образом, мы не можем сгенерировать эту строку, используя грамматику. Я пытаюсь показать ниже:

В нашей грамматике для создания дополнительных a мы должны использовать переменную C.

S --> A 
  --> aCB 
  --> aaAB 
  --> aa aCB B 
  --> aaa aA BB 
  --> aaaa aCB BB  
           ---              
            ^
           here with firth `a` I have to put a `b` too

Пока мой ответ готов, но я думаю, вы можете изменить правила A, например:

A --> aCB | A | ^

Попробуйте!

EDIT:
как прокомментировал @us2012: Мне кажется, что тогда S -> ^ | ab | aaSb | Sb будет более простым описанием. Я чувствую, что этот вопрос будет полезен для OP и других.

Язык ОП:

L = {an bm | n,m = 0,1,2,..., n ‹= 2m}.

Грамматика @us2012:

S -> ^ | ab | aaSb | Sb    

Вопрос @us2012:

Порождает ли эта грамматика и язык L?

Ответ: Да!

Неравенство в языке между количеством a's = n и количеством b = m составляет n =< 2m

Мы также можем понимать как:

 n =< 2m

 that is 

 numberOf(a) = <  twice of numberOf(b) 

И в грамматике, даже когда мы добавляем один или два a, мы также добавляем один b . Таким образом, в конечном итоге количество a не может быть более чем в два раза больше количества b.

Грамматика также имеет правила для генерации. любое количество строк b и пустых строк ^.

Таким образом, упрощенная грамматика, предоставленная @us2012, является ПРАВИЛЬНОЙ и также точно генерирует язык L.

Примечание: Первое решение пришло из вывода, как я написал в связанном ответе, я начал с описания языка, затем попытался написать некоторые основные правила, и постепенно я мог написать полную грамматику.

В то время как ответ @ us2012 пришел благодаря способностям, вы можете получить способность писать грамматику, читая чужое решение и записывая свое для того же ... как вы изучаете программирование.

person Grijesh Chauhan    schedule 22.03.2013
comment
дайте мне знать, если у вас возникнут дополнительные вопросы/сомнения по этому поводу или я допустил какую-то ошибку в своем ответе, надеюсь, нет - person Grijesh Chauhan; 22.03.2013
comment
Хм, когда я впервые прочитал определение языка, я подумал, что оно включает m = 0,1,2,...,n , то есть m <= n, но, возможно, я неправильно его прочитал. - person us2012; 23.03.2013
comment
В любом случае, допустим, вы правы: мне кажется, что тогда S -> ^ | ab | aaSb | Sb было бы более простым описанием - я что-то упустил? - person us2012; 23.03.2013
comment
@us2012 us2012 Да, ваша грамматика верна. прочитать обновленный ответ. - person Grijesh Chauhan; 23.03.2013
comment
Большое спасибо за этот ответ Grijesh - потрясающее объяснение! - person guipy; 21.10.2013
comment
@guipy Я рад, что смог тебе помочь. :) - person Grijesh Chauhan; 21.10.2013