Конструирайте граматика на следния език {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
Няма ли да е по-добре да попитате вашия TA или професор?   -  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 всъщност въпросът ви е много добър, но попитахте в грешен формуляр stack-overflow с още един сайт, където можете да задавате своите теоретични въпроси. Тази форма е по-свързана с програмирането. Въпреки това, добавих отговора си, надявам се, че ще ви бъде полезен.   -  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 като низ не е възможно.

  • бележка: null ^ низ също е разрешен, защото в ^ , 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

Още един за низ нечлен:

според езика 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 | ^

Пробвам!!

РЕДАКТИРАНЕ:
както @us2012 коментира: Струва ми се, че тогава S -> ^ | ab | aaSb | Sb би било по-просто описание. Чувствам, че този въпрос би бил добър за OP и други също.

Език на ОП:

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

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

S -> ^ | ab | aaSb | Sb    

Въпрос на @us2012:

Дали тази граматика също генерира език L?

Отговорът е Да!

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

Можем да разбираме и като:

 n =< 2m

 that is 

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

И в граматиката, дори когато добавим един или две a, ние също добавяме един b. Така че в крайна сметка броят на a не може да бъде повече от два пъти по-голям от броя на b.

Граматиката също има правила за генериране. произволни числа на b и null ^ низове.

Така че опростената граматика, предоставена от @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 Да, граматиката ви е правилна. прочетете актуализирания отговор. - person Grijesh Chauhan; 23.03.2013
comment
Благодаря много за този отговор Grijesh - невероятно обяснение! - person guipy; 21.10.2013
comment
@guipy Радвам се, че можах да ти помогна. :) - person Grijesh Chauhan; 21.10.2013