寻找 DFA 的补码?
Posted
技术标签:
【中文标题】寻找 DFA 的补码?【英文标题】:Finding the complement of a DFA? 【发布时间】:2013-01-25 23:59:01 【问题描述】:我被要求展示 DFA 图和 RegEx 以作为 RegEx (00 + 1)*
的补充。在上一个问题中,我必须证明 DFA 的补码是封闭的并且也是一个正则表达式,所以我知道要将 DFA M 转换为补码 M`,我只需要交换初始接受状态和最终接受状态。
但是,RegEx 的初始接受状态似乎是00, 1, ^
,最终接受状态也是00, 1, ^
。因此,交换它们只会导致完全相同的 RegEx 和 DFA,这似乎是矛盾的。
我做错了什么还是这个 RegEx 应该没有真正的补充?
谢谢
【问题讨论】:
一个 DFA 只有一个初始状态,所以你可能在这里犯了一个错误。编写 DFA 本身并在尝试补充之前对其进行验证。 另外,为了补充 DFA,您只需为每个状态交换“final-ness”——也就是说,使每个非最终状态为最终状态,而每个最终状态都为非最终状态。 那么初始状态不能是 00 或 1 吗? 并非如此——请记住,初始状态是它开始读取字符串的位置,因此到目前为止它还没有读取任何内容。不过,它有 00 和 1 的转换。也许您应该查找一些有关 DFA 的信息? 我明白这一点。从技术上讲,它以空字符串开头,然后可以读取 00 或 1。但这不会改变我的困境 【参考方案1】:正如你所说的:
我知道要将 DFA M 转换为补码 M`,我只需要交换初始接受状态和最终接受状态。
它的不是补充,但你正在做的事情类似语言的反向和regular languages are closure under reversal.
DFA 的反转
什么是反转语言?
语言 L(表示为 LR)的反转是由以下组成的语言 L中所有字符串的反转。
假设对于某个 FA A,L 是 L(A),我们可以为 LR 构造一个自动机:
反转转换图中的所有边(弧)
LR 自动机的接受状态是 A 的开始状态
为新自动机创建一个新的开始状态,并将 epsilon 转换为 A 的每个接受状态
注意:通过颠倒所有箭头并交换 DFA 的初始状态和接受状态的角色,您可能会得到 NFA。这就是我写 FA(而不是 DFA)的原因)
补充 DFA
找到 DFA 的补集?
Defination:
语言的补码是根据与 Σ*(sigma 星)的集差来定义的。即 L' = Σ* - L.
而 L 的补码语言 (L') 包含来自 Σ*(sigma 星)的所有字符串,除了 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×Σ
定义(缺少标签 1
的 q1 的边缘)。
其完整的DFA可以如下(A):
在上面的 DFA 中,定义了所有可能的事务(*对于每对 Q,Σ
*),δ
在这种情况下是一个完整的函数。
Reff: to learn what is Partial Function.
可以通过将所有最终状态 q0
更改为非最终状态来构造新的补码 DFA D,反之亦然。
所以补充q0
成为非最终状态,q1, q2
是最终状态。
现在您可以使用我给出的ARDEN'S THEOREM and DFA 为补语编写正则表达式。
这里我直接写正则表达式补码:
(00 + 1)*
0
(^ + 1(1 + 0)*)
^
是空符号。
一些有用的链接: 通过here 和我的个人资料,您可以在 FA 上找到更多有用的答案。另外,关于常规语言属性的两个很好的链接:one、second
【讨论】:
也检查一下HOW TO WRITE REGULAR EXPRESSION FOR A DFA 死状态怎么样??如果语言 L 的 DFA 包含死状态,那么如何解决它..??我是否必须将死状态也设为接受状态?跨度> @Coffee_lover 'Dead state' 表示字符串未被接受。假设在处理一个字符串时你达到了一个死状态,那么字符串不属于 DFA 的语言。例如在上面的答案状态q2
是死状态的图表2 现在假设你有一个字符串10110
然后处理这个字符串你需要这个移动q0--1-->q0--0-->q1--1-->q2--1-->q2--0-->q2
注意一旦你到达一个死q2
然后你可以'不要改变所有语言符号的状态。 -----通常我们可以忽略在 DFA 中绘制死状态。
我的问题是关于例如补充。 L=10110 现在如何为它绘制补充 DFA。你说将接受变为不接受,反之亦然,但是死状态呢……我是否认为它是不接受状态并在绘制补充 DFA 时转换为接受状态
这是互联网上为数不多的几个地方之一,它真正解释了构成 DFA 补全部分的部分,这使每个人都感到困惑:“完整的 DFA”以上是关于寻找 DFA 的补码?的主要内容,如果未能解决你的问题,请参考以下文章