以下是研究项目的DFA。我们手动创建了DFA。我们感兴趣的是与DFA相对应的什么是正则表达式。当然,可能有多个 正则表达式对应;我们更喜欢简单的。
答案 0 :(得分:1)
你在B和E的自我循环中错过了DFA中的标签。但是因为你说给定DFA ,所以在两个循环中只有0
的标签选择。
DFA的正确正则表达式为:
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
简要说明:
您只有一个D
的最终状态。因此,如果字符串在D
结束,则可以接受。
您是否注意到D
上的传入边缘标记为1
,而D
的自我循环标记为0
。
开始状态为A
,因此字符串可以以0
或1
开头。实际上A上有两个循环。一个以0
开头并经过上图
上部循环的RE是:00* 10*1
要理解这一点:
0 0* 1 0* 1
A-E loop on E E-F loop on F F-A
从下方图表中的A
转到D
。 RE是1 (0 + 10)* 1 1
要理解这一点:
1 (0 + 10)* 1 1
A - B loop on B B-C C-D
DFA的完整RE是:(回答)
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
要理解这一点:
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
^ ^ ^
upper loop A to D loop on D * for loop on D
( 0 + 1 (00* 10*1)* 1 (0 + 10)* 1 1 )*
^ D-A A-A A-B loop on B, B-c c-D
self loop on D
编辑,因为@RedBaron注释了此正则表达式生成字符串01110100110
:
A - 0 - > ë - 1 --->的F - 1 ---> A --- 1 --->乙 - 0 --->乙--- 1 ---&以及c --- 0 --- - >乙--- 0 --->乙 - 1 - &以及c --- 1 ---> d --- 0 ---> d
是DFA接受的字符串。
如何从RE中生成我在答案中给出,下面我已经对齐了RE和字符串。
(00* 10*1)* (1(0 + 10)* 1 1) ( 0 + 1 (00* 10*1)* 1 ( 0 + 10)* 1 1)*
0^ 1^ 1 1 0100 1 1 0
只有您可能需要了解的难度:(0 + 10)*
如何生成0100
?对于以下检查:
(0 + 10)*
重复三次:
(0 + 10)(0 + 10)(0 + 10)
0 10 0
答案 1 :(得分:0)
答案 2 :(得分:0)
10*110*
用于从A-B-C-D转换而没有c-B中的循环
1(0*(10)*)*110*
我认为还涵盖了C和B之间的循环
0+10*1
是来自A-E-F的循环。因此,您可以将它作为两个表达式的前缀
您获得(0+10*1)*10*110*
没有循环,(0+10*1)*1(0*(10)*)*110*
没有循环
因此最后的表达是
(0+10*1)*1(0*(10)*)*110*
从A转换为D
最后,在达到州D后,您可以获得1
,到达A
并重复整个事情
((0+10*1)*1(0*(10)*)*110*)(1((0+10*1)*1(0*(10)*)*110*))*
See it in action表示此DFA的某些有效和无效字符串
澄清 - 此正则表达式基于PCRE接受的正则表达式。因此+
表示一个或多个字符串出现,*
表示出现0或更多,而|
表示OR
编辑 (0*(10)*)*
可以更好地编写为(0|(10))*
(感谢@ grijesh-chauhan将我指向该方向)。所以RE(基于PCRE)将是
((0+10*1)*1(0|(10))*110*)(1((0+10*1)*1(0|(10))*110*))*
答案 3 :(得分:0)
您需要使用的算法是here。如果您对该主题更感兴趣,我强烈建议您阅读Michael Sipser的Introduction to the Theory of Computation。
对于您的特定DFA,请按照此算法获得此正则表达式:
[(010*1)*1(10*)110*1]*(010*1)*1(10)*110*