这是一个研究项目的 DFA。我们手动创建了 DFA。我们对什么是与 DFA 对应的正则表达式感兴趣。当然,可以有多个正则表达式与之对应;我们更喜欢更简单的。
4 回答
您在 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
此正则表达式是否生成字符串:
首先检查它是否被 DFA 接受:
A--0--> E--1---> F--1---> A---1---> B--0---> B---1--->C ---0--- ->B---0---> B--1-->C---1---> D---0--->D</p>
是的字符串被 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
杰克,这个 DFA 基本上可以有两个正则表达式。第一个可以是 AB*CD*A,第二个可以是 AE*F*
10*110*
用于从 ABCD 转换而没有 cB 中的循环
1(0*(10)*)*110*
我认为也涵盖了 C 和 B 之间的循环
0+10*1
是来自 AEF 的循环。所以你可以在这两个表达式前面加上前缀
你得到(0+10*1)*10*110*
没有循环和(0+10*1)*1(0*(10)*)*110*
它
因此最终的表达式是
(0+10*1)*1(0*(10)*)*110*
用于从 A 到 D 的过渡
最后到达状态 D 你可以得到 a 1
,达到A
并重复整个事情
((0+10*1)*1(0*(10)*)*110*)(1((0+10*1)*1(0*(10)*)*110*))*
查看此 DFA 的一些有效和无效字符串的实际操作
澄清- 此正则表达式基于 PCRE 接受的正则表达式。So+
表示字符串出现 1 次或多次,*
表示出现 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*))*