2正则语言练习.docx
《2正则语言练习.docx》由会员分享,可在线阅读,更多相关《2正则语言练习.docx(38页珍藏版)》请在冰豆网上搜索。
2正则语言练习
第2章、正则语言习题解答-练习
2.1、图给出两台DFAM1和M2的状态图.回答下述有关问题.
a.M1的起始状态是q1
b.M1的接受状态集是{q2}
c.M2的起始状态是q1
d.M2的接受状态集是{q1,q4}
e.对输入aabb,M1经过的状态序列是q1,q2,q3,q1,q1
f.M1接受字符串aabb吗?
否
g.M2接受字符串ε吗?
是
2.2、给出练习2.1中画出的机器M1和M2的形式描述.
M1=(Q1,∑,δ1,q1,F1)其中Q1={q1,q2,q3,};Σ={a,b};q1是起始状态;F1={q2};δ1为:
ab
q1
q2
q3
q2q1
q3q3
q2q1
M2=(Q2,Σ,δ2,q2,F2)其中Q2={q1,q2,q3,q4};Σ={a,b};q2是起始状态;F2={q1,q4};δ2为:
ab
q1
q2
q3
q4
q1q2
q3q4
q2q1
q3q4
2.3、DFAM的形式描述为({q1,q2,q3,q4,q5},{u,d},δ,q3,{q3}),其中δ在表2-3中给出。
试画出此机器的状态图。
2.4、画出识别下述语言的DFA的状态图。
a){w|w从1开始以0结束}
b){w|w至少有3个1}
c){w|w含有子串0101}
d){w|w的长度不小于3,且第三个符号为0}
e){w|w从0开始且为奇长度,或从1开始且为偶长度}
或
f){w|w不含子串110}
g){w|w的长度不超过5}
h){w|w是除11和111以外的任何字符串}
i){w|w的奇位置均为1}
j){w|w至少含有2个0,且至多含有1个1}
k){ε,0}
l){w|w含有偶数个0,或恰好两个1},和下一题c)作一比较。
m)空集
n)除空串外的所有字符串
2.5、给出识别下述语言的NFA,且要求符合规定的状态数。
a.{w|w以00结束},三个状态
b.语言{w|w含有子串0101,即对某个x和y,w=x0101y},5个状态.
c.语言{w|w含有偶数个0或恰好两个1},6个状态。
d.语言{0},2个状态。
e.语言0*1*0*0,3个状态。
f.语言{ε},1个状态。
g.语言0*,1个状态。
2.9、证明每一台NFA都能够转换成等价的只有一个接受状态的NFA。
证明:
设NFAM={Q,Σ,δ,q0,F},其中
F={r1,……,rk}
添加一个状态E。
原来的接受状态r1,……,rk向E分别引ε箭头,然后将r1,……,rk变为非接受状态,E变为接受状态。
因为添加ε箭头不影响NFA识别语言,所以命题成立。
2.10、
a.证明:
设M是一台语言B的DFA,交换M的接受状态与非接受状态得到一台新的DFA,则这台新的DFA识别B的补集,因此,正则语言类在补运算下封闭。
证明:
设DFAM={Q,∑,δ,q0,F}
DFAN={Q,∑,δ,q0,Q-F}
假设w=w1w2…wn是字母表上任意字符串,因为M与N均为DFA,所以必然存在Q中状态序列r0,r1,…,rn,使得:
r0=q0,δ(ri,ωi+1)=ri+1i=0,…,n-1
1)若rnÎF,则wÎB;即M接受w。
2)若rnÏF,则wÏB;即M不接受w,即wÎB的补集。
但是rnÎQ-F,即N接受w,所以N识别B的补集。
即B的补集是正则语言。
因此正则语言类在补运算下封闭。
b.举例说明:
设M是一台识别语言B的NFA,交换M的接受状态与非接受状态得到一台新的NFA,这台新的NFA不一定识别B的补集。
NFA识别的语言类在补集下封闭吗?
解释你的回答。
解:
设B为{0}。
下图所示的NFAM可以识别它。
依题对它作变换,得到N:
则N识别的语言{ε}不是B的补集。
所以交换M的接受状态与非接受状态得到的新的NFA不一定识别B的补集。
但是由于NFA识别的语言类与DFA识别的语言类相同,即正则语言类。
由a的证明,正则语言类在补运算封闭,可知,NFA识别的语言类,即正则语言类在补运算下封闭。
若NFA识别语言A,必有等价的DFA识别A,从而由a知,可交换DFA的接受与非接受状态构造识别A的补集的DFA,则必有等价的NFA识别A的补集。
只是,该NFA未必由原NFA交换接受与非接受状态构造而成。
2.11给出一个反例,说明下述构造不能证明定理2.24,即正则语言类在星号运算下封闭。
设N1=(Q1,Σ,δ1,q1,F1)识别A1。
如下构造N=(Q1,Σ,δ,q1,F)。
N应该识别A1*。
a.N的状态集是N1的状态集。
b.N的起始状态与N1的起始状态相同。
c.F={q1}∪F1。
F的接受状态是原来的接受状态加上它的起始状态。
d.
定义δ如下:
对每一个q属于Q1和每一个a属于
。
解:
设N1识别语言A={至少含有一个1},其中输入字母表为{0,1},可知A*={ε或至少含有一个1}。
N1:
N:
按上述规定构造N的状态图如上。
可以看出N确实把ε加进被识别的语言中,但是它也把字符0加进被识别的语言中。
所以L(N)≠A*。
如此构造不能证明定理2.24。
2.12使用定理2.19中给出的构造,把下图中的两台非确定型有穷自动机转换成等价的确定型有穷自动机。
a)、
这一台NFA有两个状态1、2,所以DFA有四个状态{,{1},{2},{1,2}}。
起始状态是{1},它等于从1出发沿着ε箭头能到达的所有状态加上{1}本身。
接受状态是所有包含接受状态的状态子集,即{{{1},{1,2}}}。
确定转移函数。
每一个状态遇到输入a到一个地方,输入b到一个地方。
b)、
D的状态集为:
{Φ,{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}}
D的起始状态为:
{1,2}
D的接受状态为:
{2},{1,2},{2,3},{1,2,3}
D的状态图如下:
没有箭头射入状态{1}和{1,3},所以可以把它们删掉。
没有箭头射入状态{3},所以可以删掉。
删除{3}后,没有箭头射入状态{2},所以也可删掉。
2.13给出生成练习2.4中语言的正则表达式。
(注:
答案不唯一)
a.{w|w从1开始以0结束}1Σ*0.
b.{w|w至少有3个1}Σ*1Σ*1Σ*1Σ*.
c.{w|w含有子串0101}Σ*0101Σ*.
d.{w|w的长度不小于3,且第三个符号为0}ΣΣ0Σ*.
e.{w|w从0开始且为奇长度,或从1开始且为偶长度}0(ΣΣ)*∪1Σ(ΣΣ)*.
f.{w|w不含子串110}.
1)识别该语言的确定型有穷自动机如下,按照定理2.28证明中使用的算法进行转换:
1、加新的开始状态和新的结束状态
2、删除红色状态1,经过状态1的转换有:
s→1→a、s→1→2、2→1→a、2→1→2。
3、删除绿色状态2,经过状态2的转换有:
s→2→a、s→2→3。
4、删除蓝色状态3,经过状态3的转换有:
s→3→a、s→3→。
等价的正则表达式为:
0*∪{0*1(00*1)*(00*∪ε)}∪0*1(00*1)*11*=0*∪{0*1(00*1)*(00*∪ε∪11*)}
0*:
只由0组成的字符串,或为ε。
0*1(00*1)*(00*∪11*∪ε):
1和1之间至少有一个0,如果出现子串11,那么子串11的后面一定是1或者字符串结束。
g.{w|w的长度不超过5}e∪Σ∪ΣΣ∪ΣΣΣ∪ΣΣΣΣ∪ΣΣΣΣΣ.
h.{w|w是除11和111以外的任何字符}
1、说明:
可能的值有
0:
0Σ*,以0开头的字符串。
1:
一个字符1。
11:
100:
100Σ*:
以110开头的所有字符串
101:
100Σ*:
以110开头的所有字符串
110:
110Σ*:
以110开头的所有字符串
111:
1000:
111ΣΣ*:
以111Σ开头的所有字符串
因为100Σ*和101Σ*可以合并为10Σ*,所以除11和111以外的任何字符可以表示为:
e∪0Σ*∪1∪10Σ*∪110Σ*∪111ΣΣ*.
2、说明:
Σ*0Σ*:
至少包含一个0的字符串。
1:
一个字符1。
11111*:
至少包含四个1的全1字符串。
所以除11和111以外的任何字符可以表示为:
e∪Σ*0Σ*∪1∪11111*.
i.{w|w的奇位置均为1}1Σ(1Σ)*∪1(Σ1)*
j.{w|w至少含有2个0,且至多含有1个1}0*(00∪010∪001∪100)0*.
k.{ε,0}.ε∪0.
l.{w|w含有偶数个0,或恰好两个1}(1*01*0)*1*∪0*10*10*.
m.空集.Æ.
n.除空串外的所有字符串ΣΣ*.
2.14使用引理2.29中叙述的过程,把下述正则表达式转换成非确定型自动机。
a.
(0∪1)*000(0∪1)*
b.(((00)*(11))∪01)*
c.φ*
2.15对下述每一个语言,给出4个字符串,2个是这个语言的成员,2个不是这个语言的成员。
这里假设字母表Σ={a,b}.
a.a*b*成员:
ab,aab非成员:
aba,ba
b.a(ba)*b成员:
ab,abab非成员:
abb,aa
c.a*∪b*成员:
aaa,bbb非成员:
ab,ba
d.(aaa)*成员:
aaa,aaaaaa非成员:
a,aa
e.Σ*aΣ*bΣ*aΣ*成员:
aba,aaba非成员:
aa,abb
f.aba∪bab成员:
aba,bab非成员:
a,b
g.(e∪a)b成员:
b,ab非成员:
a,bb
h.(a∪ba∪bb)Σ*成员:
a,bb非成员:
e,b
2.16使用引理2.32中叙述的过程,把图2-38中的有穷自动机转换成正则表达式。
a),
解:
1、加新的开始状态和新的结束状态
2、删除状态1,通过状态1的转换有s→1→2、2→1→2
3、删除状态2
b)
1、加新的开始状态和新的结束状态
2、删除状态1,通过状态1的转换有s→1→2、s→1→a、3→1→a、3→1→2
3、删除状态2,通过状态2的转换有s→2→3、3→2→3
3、删除状态3
2.17利用泵引理证明下述语言不是正则的。
a.A1={0n1n2n|n0}。
证明:
假设A1是正则的。
设p是泵引理给出的关于A1的泵长度。
令S=0p1p2p,
∵S是A1的一个成员且S的长度大于p,所以泵引理保证S可被分成3段S=xyz且满足泵引理的3个条件。
根据条件3,|xy|≤p,所以y中只包含0。
在字符串xyyz中,0比1、2多,所以xyyz不可能是A1的成员。
违反泵引理的条件1,矛盾。
∴A1不是正则的。
b.A2={www|w{a,b}*}.
证明:
假设A2是正则的。
设p是泵引理给出的关于A2的泵长度。
令S=apbapbapb,
∵S是A2的一个成员且S的长度大于p,所以泵引理保证S可被分成3段S=xyz且满足泵引理的3个条件。
根据条件3,y中只含a,所以xyyz中第一个a的个数将比后两个a的个数多,故xyyz不是A2的成员。
违反泵引理的条件1,矛盾。
∴A2不是正则的。
c.A3={a2n|n0}.(在这里,a2n表示一串2n个a.)
证明:
假设A3是正则的。
设p是泵引理给出的关于A3的泵长度。
令S=a2p,
∵S是A2的一个成员且S的长度大于p,所以泵引理保证S可被分成3段S=xyz且满足泵引理的3个条件。
考虑一下2n序列。
1,2,4,8,16,……
注意到序列中相邻的两个数之间的间隔在增大,序列中大的数不可能彼此靠近。
考虑字符串xyiz与xyi+1z,它们之间的长度相差y的长度。
如果选择很大的i,则xyiz与xyi+1z的长度靠得太近,不可能都是2的幂。
设m=2n,那么它和更大的2的幂之间的差为:
2n+1-2n=2n=m,令|xyiz|为上述m。
如果|y|<|xyiz|=m,xyiz与xyi+1z就不可能都是2的幂。
计算i值。
∵|y|≤|xyz|=|S|=|a2p|=2p,令i=2p+1
有|y|≤2p<2p+1≤|xy2p+1z|=|xyiz|=m
∴A3不是正则的。
2.18下面“证明”0*1*不是正则语言,指出这个“证明”中的错误。
(因为0*1*是正则的,所以一定错误。
)
采用反证法证明。
假设0*1*是正则的。
令p是泵引理给出的关于0*1*的泵长度。
取S为字符串0p1p。
S是0*1*的一个成员,但是例2.38已证明S不能被抽取。
于是得到矛盾,所以0*1*不是正则的。
解:
在例2.38中的语言是{0n1n|n³0},取S为字符串0p1p,S确实不能被抽取。
但针对语言0*1*,S是能被抽取的。
将S分成三段S=xyz,由泵引理的条件3,y仅包含0,而xyiz属于语言0*1*,即S能被抽取,故题设中的“证明”不正确。
2.19有穷状态转换器(FST)是确定性有穷自动机的一种类型。
它的输出是一个字符串,而不仅仅是接受或拒绝。
图2—39是两台有穷状态状态转换器T1和T2的状态图。
T1T2
FST的每一个转移用两个符号标记,一个指明该转移的输入符号,另一个指明输出符号。
两个符号之间用斜杠“/”把它们分开。
在T1中,从q1到q2的转移有输入符号2和输出符号1。
某些转移可能有多对输入-输出,比如T1中从q1到它自身的转移。
FST在对输入串w计算时,从起始状态开始,一个接一个地取输入符号w1wn,并且比照输入标记和符号序列w1wn=w进行转移。
每一次沿一个转移走一步,输出对应的输出符号。
例如,对输入2212011,机器T1依次进入状态q1,q2,q2,q2,q2,q1,q1,q1和输出1111000。
对输入abbb,T2输出1011。
给出在下述每一小题中机器进入的状态序列和产生的输出。
a.T1对输入串011,输出:
000,状态序列:
q1,q1,q1,q1.
b.T1对输入串211,输出:
111,状态序列:
q1,q2,q2,q2.
c.T1对输入串0202,输出:
0101,状态序列:
q1,q1,q2,q1,q2.
d.T2对输入串b,输出:
1,状态序列:
q1,q3.
e.T2对输入串bbab,输出:
1111,状态序列:
q1,q3,q2,q3,q2.
f.T2对输入串bbbbbb,输出:
110110,状态序列:
q1,q3,q2,q1,q3,q2,q1.
g.T2对输入串e,输出:
e,状态序列:
q1。
2.20给出有穷状态转换器的形式定义。
解:
有穷状态转换器FST是一个五元组(Q,Σ,Г,δ,q0)
1)Q是一个有穷集合,叫做状态集
2)Σ是一个有穷集合,叫做输入字母表
3)Г是一个有穷集合,叫做输出字母表
4)δ:
Q×ΣàQ×Г是转移函数
5)q0是起始状态
FST计算的形式定义:
M=(Q,Σ,Г,δ,q0)是一台有穷状态转换器,w=w1w2¼wn是输入字母表上的一个字符串。
若存在Q中的状态序列:
r0,r1,¼rn和输出字母表上的一个字符串s=s1…sn,满足下述条件:
1)r0=q0;
2)δ(ri,wi+1)=(ri+1,si+1)i=0,1,¼,n-1
则M在输入w时输出s.
2.21利用你给练习2.20的答案,给出练习2.19中画出的机器T1和T2的形式描述。
解:
有穷状态转换器T1的形式描述为:
T1=({q1,q2},{0,1,2},{0,1},δ,q1)
其中转移函数δ为:
0
1
2
q1
q1/0
q1/0
q2/1
q2
q1/0
q2/1
q2/1
有穷状态转换器T2的形式描述为:
T2={{q1,q2,q3},{a,b},{0,1},δ,q1)
其中转移函数为:
a
b
q1
q2/1
q3/1
q2
q3/1
q1/0
q3
q1/0
q2/1
mnm2.22给出一台具有下述行为的FST的状态图。
它的输入、输出字母表都是{0,1}。
它输出的字符串与输入的字符串偶数位相同、奇数位相反。
例如,对于输入0000111,它应该输出1010010。
解:
第3章、上下文无关语言习题解答-练习
3.1回忆一下例3.3中给出的CFGG4。
为方便起见,用一个字母重新命名它的变元如下:
E→E+T|T
T→T×E|F
F→(E)|a
给出下述字符串的语法分析树和派生。
a.a
b.a+a
c.a+a+a
d.((a))
答:
a.
b.
c.
d.
3.2a.利用语言A={ambncn|m,n0}和B={anbncm|m,n0}以及例3.20(语言B={anbncn|n0}不是上下文无关的),证明上下文无关语言在交的运算下不封闭。
b.利用(a)和DeMorgan律(定理1.10),证明上下文无关语言在补运算下不封闭。
证明:
a.先说明A,B均为上下文无关文法,对A构造CFGC1
S®aS|T|e
T®bTc|e//生成bncn
对B,构造CFGC2
S®Sc|R|e
R®aRb|e//生成anbn
由此知A,B均为上下文无关语言。
由例3.20,A∩B={anbncn|n³0}(假设m≤n)不是上下文无关语言,所以上下文无关语言在交的运算下不封闭。
b.用反证法。
假设CFL在补运算下封闭,则对于(a)中上下文无关语言A,B,
也为CFL。
因为CFL对并运算封闭,所以
也为CFL,进而知道
为CFL。
由DeMorgan定律
,得出
是CFL。
这与(a)的结论矛盾,所以CFL对补运算不封闭。
3.3设上下文无关文法G:
R→XRX|S
S→aTb|bTa
T→XTX|X|ε
X→a|b
回答下述问题:
a.G的变元和终结符是什么?
起始变元是哪个?
答:
变元是:
R,X,S,T;起始变元是R。
终结符是:
a,b,ε
b.给出L(G)中的三个字符串。
答:
ab,ba,aab。
c.给出不在L(G)中的三个字符串。
答:
a,b,ε。
d.是真是假:
。
答:
假
e.是真是假:
。
答:
真
f.是真是假:
。
答:
假
g.是真是假:
。
答:
假
h.是真是假:
。
答:
真
i.是真是假:
。
答:
假
j.是真是假:
。
答:
真
k.是真是假:
。
答:
真
l.是真是假:
。
答:
假
m.用普通的语言描述L(G):
3.4和3.5给出产生下述语言的上下文无关文法和PDA,其中字母表={0,1}。
a.{w|w至少含有3个1}
S→A1A1A1A
A→0A|1A|e
读输入中的符号。
每读一个1,把一个1推入栈,每读1个0,不读栈也不写栈。
同时非确定性地转移,并把1个1弹出栈。
如果能转移三次,共弹出三个1,则接受这个输入,并继续读输入符号直至结束。
否则拒绝这个输入。
b.{w|w以相同的符号开始和结束,w的长大于1}
S→0A0|1A1
A→0A|1A|e
读输入中的第一个符号并将其推入栈。
继续读后面的符号,同时非确定性地猜想输入符号和栈符号是否相同,如果相同则转移到接受状态,如果此时输入结束,则接受这个输入,否则继续输入。
c.{w|w的长度为奇数}
S→ASA|0|1
A→0|1
读输入中的1个符号,转移到接受状态,再读一个符号,转移到非接受状态,如此循环。
可见接受长度为奇数的字符串。
d.{w|w的长度为奇数且正中间的符号为0}
S→ASA|0
A→0|1
读输入中的1个符号,推入1个0。
每当读到0时就非确定性地猜想已经到达字符串的中点,然后变成读输入中的1个符号,就把栈中的0弹出。
当输入结束的同时栈被排空,则接受,否则拒绝。
e.{w|w中1比0多}
答:
S→T1T|T1S//T1T可以产生1比0多1个的所有字符串。
//T1S可以产生1比0多2个以上的所有字符串。
T→0T1T|1T0T|ε//T可以产生0和1数目相等的所有字符串。
如果输入0时,栈顶元素是1,则弹出1;否则将0推入堆栈。
如果输入1时,栈顶元素是0,则弹出0;否则将1推入堆栈。
非确定地猜想栈顶元素是1,且栈中都是1,如果是,则接受;否则拒绝。
f.{w|w=wR,即w是一个回文,回文是顺读和倒读都一样的字符串}
S→0S0|1S1|1|0|ε
如果W是回文,那么它的中点有三种可能:
1)字符个数是奇数,中点的字符是1。
2)字符个数是奇数,中点的字符是0。
3)字符个数是偶数,中点的字符是e。
开始时,把读到的字符推入栈中,在每一步非确定性地猜想已经到达字符串的中点。
然后变成把读到的每一个字符弹出栈,检查在输入中和在栈顶读到的字符是否一样。
如果它们总是一样的,并且当输入结束时栈是空的,则接受;否则拒绝。
g.空集
S→S
3.6给出产生下述语言的上下文无关文法:
a.字母表{a,b}上a的个数是b的个数的两倍的所有字符串组成的集合。
答:
S→bSaSaS|aSbSaS|aSaSbS|e
b.语言{anbn|n0}的补集。
见问题3.25中的CFG:
答:
分析问题:
{anbn|n³0}语言的CFG为:
S→aSb|e。
违反条件的情况可能有两种:
1.一种是在连续的a中间插入了字符b,或者在连续的b中间插入了字符a。
2.a和b的数目不相等。
所以可以设计文法如下:
S→aSb|bT|Ta//只能生成错序的或者a和b个数不相等的字符串。
T→aT|bT|e//生成所有由a,b组成的字符串。
c.{w#x|w,x{0,1}*且wR是x的子串}。
答:
分析问题:
根据题义,语言w#x可以分解成为:
其中T是所有由0,1组成的字符串。
所以可以设计文法如下:
S→UT
U→0U0|1U1|#T//生成w#TwR
T→0T|1T|e//生成所有由0,1组成的字符串
d.{x1#x2##xk|k1,每一个xi{a,b}*,且存在i和j使得xi=xjR}。
答:
分析问题:
根据题义,语言x1#x2#¼#xk可以分解成为:
所以可以设计文法如下:
S→UVW
U→A#U|e
W→#AW|e
A→aA|bA|e//生成所有由a,b组成的字符串xi
V→aVa|bVb|#U
3.7略。
3.8证明在3.1节开始部分给出的文法G2中,字符串thegirltouchestheboywiththeflowe