首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式的补码如何查找

正则表达式的补码如何查找
EN

Stack Overflow用户
提问于 2014-04-05 01:16:47
回答 3查看 2.3K关注 0票数 0

给出字母表{0,1}上语言L的正则表达式,其补码由正则表达式0*表示

我认为答案是1^+,但我无法证明,请帮帮忙

EN

回答 3

Stack Overflow用户

发布于 2014-04-05 03:45:49

首先,Daniel是正确的,答案是“所有至少包含一个1的单词”。但是你怎么证明呢?

使用有限自动机表示法可以最容易地构建正则表达式的补集。如下图所示:

左边的框显示了0*的DFA。要构建它的补充,您需要做的就是使所有非接受状态都接受状态,反之亦然。这是在正确的图像中完成的。

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

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

代码语言:javascript
运行
复制
R_11^0 = ɛ|0
R_12^0 = 1
R_21^0 = (empty set)
R_22^0 = ɛ|0|1

转到R_ij^1,您将获得以下内容:

代码语言:javascript
运行
复制
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)

最后一个阶段:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
0*1(0|1)*

简单地说,就是:

  • 任意多个0
  • 一(!)
  • 和任意多个0或1

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

票数 1
EN

Stack Overflow用户

发布于 2014-04-05 01:46:21

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

票数 0
EN

Stack Overflow用户

发布于 2014-08-29 19:22:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22869058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档