[英]Finding the complement of a DFA?
我被要求显示DFA图和RegEx作为RegEx (00 + 1)*
的补充。 在之前的问题中,我必须证明DFA的补充是封闭的并且也是正则表达式,所以我知道要将DFA,M转换为补码,M`,我只需要交换初始接受状态和最终接受国家。
但是,似乎RegEx的初始接受状态是{00, 1, ^}
00,1 {00, 1, ^}
,最终接受状态也是{00, 1, ^}
。 因此,交换它们只会产生完全相同的RegEx和DFA,这似乎是相互矛盾的。
我做错了什么,或者这个RegEx应该没有真正的补充?
谢谢
正如你所说的那样:
我知道要将DFA,M转换为补码,M`,我只需要交换初始接受状态和最终接受状态。
它不是补充 ,但你正在做一些像 语言的逆转和常规语言的逆转 。
什么是逆转语言?
语言L(表示为L R )的逆转是由L中所有字符串的反转组成的语言。
鉴于某些FA A的L是L(A),我们可以为L R构造一个自动机:
反转转换图中的所有边(弧)
L R自动机的接受状态是A的开始状态
为新自动机创建一个新的开始状态,epsilon转换为A的每个接受状态
注意 :通过反转其所有箭头并交换DFA的初始和接受状态的角色,您可能会获得NFA。
这就是我写FA(不是DFA)的原因
找到DFA的补充?
Defination:
语言的补语是根据与Σ*(sigma star)的集合差异来定义的。 那是L ' =Σ * - L.
并且L的补语(L ' )具有来自Σ*(sigma star)的所有字符串,除了L.Σ*中的字符串是字母表Σ上的所有可能的字符串。
Σ=语言符号集
要构造接受L的补码的DFA D,只需将A中的每个接受状态转换为D中的非接受状态,并将A中的每个非接受状态转换为D中的接受状态。
( 警告!对于NFA来说不是这样 )
A是L的DFA,D是补体
注意 :要构建补充DFA,旧的DFA必须是一个完整的手段,应该从每个状态都可能出现边缘(或者换句话说, δ
应该是一个完整的函数 )。
正则表达式的补充DFA
(00+1)*
以下是名为A的 DFA:
但是这个DFA不是完整的DFA。 过渡函数δ
是部分定义的,但不适用于全域Q×Σ
( 从标签1
q1中错过了边缘 )。
其完整的DFA可以如下( A ):
在上面的DFA中,定义了所有可能的事务(*对于每对Q,Σ
*),在这种情况下δ
是一个完整的函数。
可以通过将所有最终状态q0
改变为非最终状态来构造新补码DFA D,反之亦然。
因此在补充q0
变为非最终和q1, q2
是最终状态。
现在,您可以使用ARDEN'S THEOREM和我给出的DFA为补充语言编写正则表达式。
在这里,我直接写补充正则表达式:
(00 + 1)*
0
(^ + 1(1 + 0)*)
其中^
是空符号。
一些有用的链接 :
从这里开始 ,通过我的个人资料,您可以在FA上找到更多有用的答案。 另外,关于常规语言属性的两个很好的链接: 一 , 二
我没有花时间阅读Grijesh的所有答案,但这是让DFA接受语言补充的简单方法,因为DFA接受语言:使用相同的DFA,但将接受状态更改为不接受,反之亦然。
之前接受的字符串将被拒绝,之前拒绝的字符串将被接受。 由于必须在任何有效的DFA中定义所有转换,并且由于所有输入字符串都只导致一个状态,因此这始终有效。
要获得反转的DFA,您可以首先通过添加一个新的初始状态来构造NFA,该状态非确定性地分支到原始DFA的所有接受状态。 反转原始DFA的所有转换,并使唯一的接受状态为原始DFA的初始状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.