基础回顾
- 根据Chomsky文法体系划分为四类,0,1,2,3型。
- 由文法G产生的语言记为L(G)
- L(G)中的一个字符串,必是由终结符组成的,并且是从起始符S推导出来的
- 0型文法:无限制文法
- 1型文法,也称上下文有关文法。
- 2型文法,也称上下文无关文法。
- 3型文法,也称正则文法。
- 不含A→ε的2型、3型属于1型,1型、2型、3型均属于0型。
- 1型 ,不允许A→ε形式。
思考
那么如何利用这四种类型设置好简单语言的文法是值得考虑的事情。
首先一个例题看看:
分析: 首先明白证明两个集合相等是需要双向证明的。L是上述生成式生成的语言的集合,而等号右边是一般形式的生成句子的集合。
- 切入点有两个S->aSBC;S->aBC;要获得右边n个字符的连接,很明显带入n次即可。
- 可以分别尝试两个,如S->aBC;进行自身的代入整合可得S->an(BC)n。
- 获得a的n次方了,可能是正确的做法。我们后面就考虑(BC)n的处理问题。
- an(BC)n,在提供的生成式中肯定会先找aB->ab,因为只有这一个才能带入使用,其他都不能。
- 进行一下处理,得到an-1aB(BC)n-1C,代入可得anb(BC)n-1C,那么很明显,我们获得了b,那么刚好式子bB->bb发挥作用,依次拆解得到anbnCn
- 那么C的处理一样,带入bC->bc,再代入cC->cc即可得到anbncn,即证L包含于L(G)。
同理,再证L(G)->L的关系。
从S开始只能用①和②得到含a,B,C的字符串,且字符串中这3个字母的个数相同。而b和c分别只能用B和C换取,因此L(G)的字符串中a,b,c的个数相同。又a始终出现在其他符号的左边,B只有紧挨在a或b的右边时才能被替换成b,C只有紧挨在b或c的右边时才能被替换成c,因此b必在a的右边,又必在b的右边,得证L(G)->CL。
- 构造右线性文法,识别语言L={a3n+1|n >=0}。那么这是基本定义,但是要是3的倍数并且余1,说明每次都增加三个字符,要么是开始时只有一个,要么到最后结束时增加一个即可,全程都是每次增加三个字符,所以就是
S->aaaS|a
或者
- 构造上下文无关文法,能够产生L= {wl w属于{a,b}*且w中a的个数是b的两倍}。
那么构造a的数目是b的两倍,说明每次增加的时候都是至少按照你加2我加1的形式增加,
那么简单一个式子就是S->aabS,S->aab,这样子就差不多了,但是要考虑所有的组合情况,那么排列顺序是一个值得考虑的问题,S->aab,S->aba,S->baa都是存在的排列方式,所以在这三者中的任意位置插入新增位置都是可以的
S->aSab|aaSb|aabS|Saab,
S->Saba|aSba|abSa|abaS,
S->Sbaa|bSaa|baSa|baaS,
这样子写有点繁琐,那么我们可以采用动态规划的思想,就是增加
那么我们借助这个,进行动态拆分,即S->SaSaSbS|SaSbSaS|SbSaSaS就可满足上述要求。 - 还比如写一个以1开始以01结尾的串的生成式
那么确定以1开始,得到S->1A,然后1的后面可以跟0或者1,即A->0A|1A|0,并且也完成了以1结束的目的,所以,做这些题的时候学会一步一步根据特点拆解很重要。可能有的解不唯一。
最后举一个作业里面的典型习题
找出右线性文法,能构成具有奇数个a和奇数个b组成的字符串。
分析: 当时做这个题的时候,我们会思考如何保证一定是奇数个呢?按照常规思路来说,在1个的基础上每次增加的时候都增加两个或者进行两次增加同一类型元素的操作,那么就一定能保证结果是奇数个。
那么先确定最开始的字符要么是a要么是b,那么
所以综合来看的结果是
示意图