正则表达式的补充如何找到

时间:2014-04-04 17:16:47

标签: regex automata complement

为字母{0,1}提供正则表达式,其补码由正则表达式0 *

表示

我认为答案是1 ^ +,但我不能证明它请帮助

3 个答案:

答案 0 :(得分:1)

首先,丹尼尔是正确的,答案是"所有包含至少一个1"的单词。但你怎么能证明这一点呢?

使用有限自动化表示最容易构建正则表达式的补码。见下图:

DFA for 0* and complement

左侧框显示0*的DFA。要构建它的补充,你需要做的就是让所有不接受状态接受状态,反之亦然。这是在右图中完成的。

现在,你已经到了一半,但现在你需要从中构建一个正则表达式。这肯定会在您的教科书或同等教科书中解释,但如果您找不到,here是一个描述算法的pdf。

使用提供的算法,(A =状态1)和(F =状态2),您得到:

R_11^0 = ɛ|0
R_12^0 = 1
R_21^0 = (empty set)
R_22^0 = ɛ|0|1

转到R_ij ^ 1,你得到:

R_11^1 = (ɛ|0) | (ɛ|0)(ɛ|0)*(ɛ|0) = (ɛ|0)* = 0*
R_12^1 = 1 | (ɛ|0)(ɛ|0)*1 = 1 | 0+1 = 0*1
R_21^1 = (empty set) | (empty set)(ɛ|0)*(ɛ|0) = (empty set)
R_22^1 = (ɛ|0|1) | (empty set)(ɛ|0)*1 = (ɛ|0|1)

最后阶段:

R_11^2 = 0* | (0*1)(0|1)*(empty set) = 0*
R_12^2 = 0*1 | (0*1)(ɛ|0|1)*(ɛ|0|1) = (0*1)(0|1)* = 0*1(0|1)*   <------- !!! HERE !!!
R_21^2 = (empty set) | (ɛ|0|1)(ɛ|0|1)*(empty set) = (empty set)
R_22^2 = (ɛ|0|1) | (ɛ|0|1)(ɛ|0|1)*(ɛ|0|1) = (ɛ|0|1)

现在,您可以通过查看将起始状态作为其第一个索引并将接受状态作为其最后一个索引的所有结果来查找正则表达式。在我们的示例中,状态1(A)是唯一的开始状态,状态2(F)是唯一的接受状态,因此您的结果是R_12^2

0*1(0|1)*

用简单的英语表示:

  • 尽可能多的零
  • 一个人(!)
  • 和你一样多的零或者

换句话说,它包含至少包含一个的所有单词。

答案 1 :(得分:0)

语言的补充(^0*$)包含空字和所有仅由零组成的单词。因此,该语言包含的所有单词不仅包含零,而是包含至少一个单词。因此,该语言的正则表达式为^.*1.*$。考虑到字母表并将正则表达式中的字母表作为第一个,这相当于^0*1(0|1)*$

答案 2 :(得分:0)

正则表达式的补码可以通过从正则表达式中取出NFA,然后将其转换为DFA(如果可能使其成为最小DFA)来确定。使用Arden定理找到非最终状态的正则表达式,这是你的语言补充。