Construct grammar given the following language {a^n b^m | n,m = 0,1,2,...,n <= 2m}
computation-theory, context-free-grammar, context-sensitive-grammar, grammar
Solution
How to write grammar for formal language?
Before read my this answer you should read first: Tips for creating Context free grammars.
Grammar for {an bm | n,m = 0,1,2,..., n <= 2m }
What is you language L = {an bm | n,m = 0,1,2,..., n <= 2m } description?
Language description: The language L is consist of set of all strings in which symbols `a` followed by symbols `b`, where number of symbol `b` are more than or equals to half of number of `a`'s.
To understand more clearly:
In pattern an bm, first symbols `a` come then symbol `b`. total number of `a` 's is `n` and number of `b`'s is `m`. The inequality equation says about relation between `n` and `m`. To understand the equation:
given: n <= 2m
=> n/2 <= m means `m` should be = or > then n/2
=> numberOf(b) >= numberOf(a)/2 ...eq-1
So inequality of n and m says:
numberOf(b) must be more than or equals to half of numberOf(a)
Some example strings in 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
So in language string any number of `b` are possible without `a`'s. (any string of b) because any number is greater then zero (0/2 = 0).
Other examples:
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
Points to be note:
all above strings are possible because number of `b`'s are either equal(=) to half of the number of `a` or more (>).
and interesting point to notice is that total `a`'s can also be more then number of `b`'s, but not too much. Whereas number of `b`'s can be more then number of `a`'s by any number of times.
Two more important case are:
only `a` as a string not possible.
note: null `^` string is also allowed because in `^` , `numberOf(a) = numberOf(b) = 0` that satisfy equation.
At once, it look that writing grammar is tough but really not...
According to language description, we need following kinds of rules:
rule 1: To generate `^` null string.
N --> ^
rule 2: To generate any number of `b`
B --> bB | b
Rule 3: to generate `a`'s: (1) Remember you can't generate too many `a`'s without generating `b`'s. (2) Because `b`'s are more then = to half of `a`'s; you need to generate one `b` for every alternate `a` (3) Only `a` as a string not possible so for first (odd) alternative you need to add `b` with an `a` (4) Whereas for even alternative you can discard to add `b` (but not compulsory)
So you overall grammar:
S --> ^ | A | B
B --> bB | b
A --> aCB | aAB | ^
C --> aA | ^
here `S` is start Variable.
In the above grammar rules you may have confusion in `A --> aCB | aAB | ^`, so below is my explanation:
A --> aCB | aAB | ^
^_____^
for second alternative a
C --> aA <== to discard `b`
and aAB to keep b
let us we generate some strings in language using this grammar rules, I am writing Left most derivation to avoid explanation.
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
One more for non-member string:
according to language a5 b2 = `aaaaabb` is not possible. because 2 >= 5/2 = 2.5 ==> 2 >= 2.5 inequality fails. So we can't generate this string using grammar too. I try to show below:
In our grammar to generate extra `a`'s we have to use C variable.
S --> A
--> aCB
--> aaAB
--> aa aCB B
--> aaa aA BB
--> aaaa aCB BB
---
^
here with first `a` I have to put a `b` too
While my answer is done but I think you can change `A`'s rules like:
A --> aCB | A | ^
Give it a Try!!
EDIT: as @us2012 commented: It would seem to me that then, `S -> ^ | ab | aaSb | Sb` would be a simpler description. I feel this question would be good for OP and other also.
OP's language:
L = {an bm | n,m = 0,1,2,..., n <= 2m}.
@us2012's Grammar:
S -> ^ | ab | aaSb | Sb
@us2012's question:
Whether this grammar also generates language L?
Answer is Yes!
The inequality in language between number of `a`'s = `n` and number of `b` = m is `n =< 2m`
We can also understand as:
n =< 2m
that is
numberOf(a) = < twice of numberOf(b)
And In grammar, when even we add one or two `a`'s we also add one `b` . So ultimately number of `a` can't be more then twice of number of `b`.
Grammar also have rules to generate. any numbers of `b`'s and null `^` strings.
So the simplified Grammar provided by @us2012 is CORRECT and also generates language L exactly.
Notice: The first solution came from derivation as I written in am linked answer, I started with language description then tried to write some basic rules and progressively I could write complete grammar.
Whereas @us2012's answer came by aptitude, you can gain the aptitude to write grammar by reading others' solutions and writing your own for some - just like how you learn programming.
Problem
I just took my midterm but couldn't answer this question. Can someone please give a couple of examples of the language and construct a grammar for the language or at least show me how i will go about it? Also how to write grammar for `L`: L = {an bm | n,m = 0,1,2,..., n <= 2m } ? Thanks in advance.