与此DFA相对应的正则表达式是什么?

时间:2013-03-29 05:22:54

标签: regex regular-language fsm dfa

以下是研究项目的DFA。我们手动创建了DFA。我们感兴趣的是与DFA相对应的什么是正则表达式。当然,可能有多个 正则表达式对应;我们更喜欢简单的。

enter image description here

4 个答案:

答案 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)*

简要说明:

  1. 您只有一个D的最终状态。因此,如果字符串在D结束,则可以接受。 您是否注意到D上的传入边缘标记为1,而D的自我循环标记为0

  2. 开始状态为A,因此字符串可以以01开头。实际上A上有两个循环。一个以0开头并经过上图 上部循环的RE是:00* 10*1

    要理解这一点:

      0     0*           1      0*            1  
    
     A-E   loop on E     E-F    loop on F     F-A
    
  3. 从下方图表中的A转到D。 RE是1 (0 + 10)* 1 1
    要理解这一点:

     1        (0 + 10)*    1     1
     A - B    loop on B    B-C   C-D      
    
  4. 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                                
    
  5. 编辑,因为@RedBaron注释了此正则表达式生成字符串01110100110

    好的拳头检查是否被DFA接受:

      

    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)

杰克,基本上这个DFA可以有两个正则表达式。 首先可以是AB * CD * A, 第二个可以是AE * F *

答案 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*