我被要求显示DFA图和RegEx作为RegEx (00 + 1)*
的补充。在之前的问题中,我必须证明DFA的补充是封闭的并且也是正则表达式,所以我知道要将DFA,M转换为补码,M`,我只需要交换初始接受状态和最终接受国家。
但是,似乎RegEx的初始接受状态为{00, 1, ^}
,最终接受状态也为{00, 1, ^}
。因此,交换它们只会产生完全相同的RegEx和DFA,这似乎是相互矛盾的。
我做错了什么还是这个RegEx应该没有真正的补充?
谢谢
答案 0 :(得分:31)
正如你所说的那样:
我知道要将DFA,M转换为补码,M`,我只需要交换初始接受状态和最终接受状态。
它的不是补充,但你正在做类似语言的反向和regular languages are closure under reversal.
什么是反转语言?
语言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必须是一个完整的意味着应该从每个状态(或换句话说δ
should be a complete function)出现所有可能的边缘。
Complement: reference with example
下面的补充正则表达式的DFA
(00+1)*
是名为 A 的DFA:
但是这个DFA不是完整的DFA。转换函数δ
已部分定义,但不适用于完整域Q×Σ
(错过了q1的lable 1
的前沿)。
其完整的DFA可以如下( A ):
在上面的DFA中,定义了所有可能的事务(*对于每对Q,Σ
*),δ
在这种情况下是完整的函数。
Reff: to learn what is Partial Function.
新补码DFA D 可以通过将所有最终状态q0
更改为非最终状态来构建,反之亦然。
因此补码q0
变为非最终状态,q1, q2
是最终状态。
现在,您可以使用我给出的ARDEN'S THEOREM and DFA为补充语言编写正则表达式。
我在这里直接写补充正则表达式:
(00 + 1)*
0
(^ + 1(1 + 0)*)
其中^
为空符号。
一些有用的链接:
从here开始,通过我的个人资料,您可以在FA上找到更多有用的答案。此外,有关常规语言属性的两个很好的链接:one,second
答案 1 :(得分:0)
我没有花时间阅读Grijesh的所有答案,但这是让DFA接受语言补充的简单方法,因为DFA接受该语言:使用相同的DFA,但更改接受状态为不接受,反之亦然。
之前接受的字符串将被拒绝,之前被拒绝的字符串将被接受。由于所有转换必须在任何有效的DFA中定义,并且由于所有输入字符串都只能导致一种状态,因此总是有效。
要获得反转的DFA,您可以首先通过添加一个新的初始状态来构建NFA,该状态非确定地分支到原始DFA的所有接受状态。反转原始DFA的所有过渡,并使唯一接受状态为原始DFA的初始状态。