首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >正则表达式之间的等价性

正则表达式之间的等价性
EN

Stack Overflow用户
提问于 2019-03-03 19:08:03
回答 2查看 529关注 0票数 1

我有两个不同的正则表达式:

(1) ($ + b)a*(b + bba*)*

($是空语言)

(2) b*(a + bb + bbb)*b*

我想证明这两个表达式是等价的,但我不知道如何做到。我有两个想法,但我不知道如何实现它们。

DFA

  • 将这两个表达式转换为。然后最小化这两个DFA,并检查它们是否相同。我认为这个选项是最正式的,但我不知道如何获得它。我知道如何使用Arden's引理从DFA转换到它的正则表达式,但不知道如何使用inverse.
  1. Simplify来使它们相等。例如,我试图用公因子来简化它们,但我不能使它们相等。
EN

回答 2

Stack Overflow用户

发布于 2019-03-03 19:22:00

(2)在一般情况下,需要大量的重写和等价规则来保证这一点。当然,如果您只是尝试为这两个特定的正则表达式执行此操作,那么您可以即席工作。

然而,(1)是“真正”的方法。我很惊讶你知道如何使用Arden引理,但不知道相反的方向,这是更常见的(在教科书和实践中),也更容易。从字面上讲,任何正式的语言书籍或编译器书籍都会为您提供至少一种将正则表达式映射到DFA并最小化DFA的算法。如果您无法访问这类书籍,请参阅我多年前写的两篇文章,每篇文章都提供了算法的分类(当时是全面的),一篇用于将正则表达式映射到DFA,另一篇用于最小化DFA:http://www.kornai.com/EFS/OnlineSupportMaterial/Watson/Papers/constax.600dpi.ps https://www.researchgate.net/publication/2247379_A_Taxonomy_of_Finite_Automata_Minimization_Algorithms

最后,更全面的工作是我自己的博士学位,名为“分类法和常规语言算法工具包”,从1995年开始。

顺便说一句,我还应该提到,有许多工具包以各种语言实现了这些算法。

致以最好的问候,布鲁斯

票数 0
EN

Stack Overflow用户

发布于 2019-03-04 17:58:14

选项1对我来说似乎更好,可能是因为我不知道如何可行地完成选项2。我建议这样做:

构造一个DFA M1使得L(M1) = ($ + b)a*(b + bba*)*

  • construct a DFA M2使得L( M12 ) = b*(a + bb +a DFA M21使得L(M12) = L(M1) \ bbb)b
  1. construct a DFA M21使得L(M21) = L(M2) \L(M1)
  2. 正则表达式描述相同的语言当且仅当L(M12)和L()都为空

要查看DFA M是否接受空语言,您可以:

通过最小化M来构造M‘

  • 通过检查初始状态是否为空来查看M’是否接受空语言,并且在初始状态中发起的所有转换都终止于初始状态

要最小化DFA,可以从列出DFA的每一对状态开始。然后,划掉其中一个状态正在接受而另一个状态不接受的任何对。然后,迭代地划掉任意对(q,q'),其中q在符号s上到达某个状态p,q‘在符号s上到达某个状态p’,并且(q,q')已经被划掉。继续,直到不能再划掉更多的状态对。在这一点上,任何没有被划掉的对表示输入自动机中的等价状态,并且可以被组合在最小自动机中。这只是一种方法。其他方法也是可用的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
q    s    q'
q0   a    q1
q0   b    q2
q1   a    q1
q1   b    q3
q2   a    q2
q2   b    q3
q3   a    q3
q3   b    q0

这里,q0是初始的,q3是接受的。我们尝试第一种算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    q0    q0    q0    q1    q1    q2
    q1    q2    q3    q2    q3    q3
#   --    --    --    --    --    --
1               XX          XX    XX   // q0,q1,q2 are not accepting; q3 is
2   XX    XX                           // on input b these go to q2,q3
3                                      // can't cross out q1,q2 by any rule

我们发现q1和q2是等价的,可以组合起来得到以下等价的DFA:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
q    s    q'
q0   a    q12
q0   b    q12
q12  a    q12
q12  b    q3
q3   a    q3
q3   b    q0

从正则表达式构造自动机的方法如下:

  1. 如果r= x,其中x是语言字母表上的某个字符串,则可以通过为x的每个符号添加一个初始状态和一个附加状态来构造r的NFA;然后,使这些状态中的最后一个状态可接受;
  2. 如果r= st,并且M和M‘是s和t的NFA,则r的NFA可以通过将M的所有接受状态改变为非接受,同时向不再是初始的M’的以前的初始状态添加λ转换来构造。
  3. 如果r= s+t并且M和M‘是s和t的NFA,则可以通过将具有λ转换的新的初始状态添加到不再是初始的M和M’的以前的初始状态来构造r的NFA;
  4. 如果r= s*并且M是s的NFA,则可以通过将具有λ转换的新的接受初始状态添加到M的以前的初始状态,同时添加从M的以前的接受状态到这个新的初始状态的λ转换,来构造r的NFA。

一旦有了正则表达式的NFA,就可以使用powerset或subset构造来确定它。为此,创建一个DFA,它为NFA的状态集的每个子集创建一个状态。然后,如果输入符号s将NFA从状态x带到状态y,则添加从子集X到子集Y的转换。注意:如果它有助于您思考,则可以首先删除λ转换,或者使用以下约定:如果s将NFA从Q带到q‘,并且存在从q’到Q‘的λ转换,则s也将NFA从Q带到Q’。初始状态是只包含NFA的初始状态的状态;所有包含接受状态的状态都是接受状态。

这将引导您完成步骤1和2。在这一点上,根据步骤5给出的建议进行最小化可能会有所帮助。接下来,使用笛卡尔乘积机构造来查找差异的DFA(或者只构造一台用于对称差异的机器,并节省一个步骤)。产品机器中的每个状态将对应于一对状态,一个状态取自第一个输入机,另一个取自第二个输入机。然后,在产品机器中添加转换,将DFA从状态(x,y)转换到状态( x‘,y'),在第一台机器中同时存在从x到x’的转换,在第二台机器中从y转换到y‘。初始状态是与输入机中的初始状态对相对应的状态;接受状态是那些(对于差异)具有x接受和y不接受的状态(对于对称差异,它们是具有x接受或y接受但不是两者的状态)。

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

https://stackoverflow.com/questions/54972626

复制
相关文章
警告!别再使用 TIMESTAMP 作为日期字段~
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 来源:JAVA日知录 在日常数据库设计中,几乎每张业务表都带有一个日期列,用于记录每条记录产生和变更的时间。比如用户表会有一个日期列记录用户注册的时间、用户最后登录的时间。又比如,电商行业中的订单表(核心业务表)会有一个订单产生的时间列,当支付时间超过订单产生的时间,这个订单可能会被系统自动取消。 日期类型虽然常见,但在表结构设计中也容易犯错,比如很多开发同学都倾向使用整型存储日期类型,同时也会忽略不同日期类型对于性能可能存在的潜在影响。
猿天地
2022/03/24
1.1K0
pandas使用技巧-分组统计数据
因为数据是随机生成的,我们需要检查是否有出现这种情况:name、subject、time、grade4个字段相同,但是score出现了两次,防止数据不规范。写了一个循环来进行判断:
皮大大
2021/03/07
2.2K0
使用awk打印文件中的字段和列
Awk 自动将提供给它的输入行划分为字段,一个字段可以定义为一组字符,这些字符通过内部字段分隔符与其他字段分开。 如果你熟悉 Unix/Linux 或者做bash shell 编程,那么你应该知道什么是内部字段分隔符 (IFS) 变量是。Awk 中的默认 IFS 是制表符和空格。 Awk: 遇到输入行时,根据定义的IFS,第一组字符为field one,访问时使用 1,第二组字符是字段二,使用访问 2,第三组字符是字段三,使用访问 为了更好地理解这个 awk 字段编辑,让我们看看下面的例子: Exampl
入门笔记
2022/06/02
10K0
使用关键字作为字段名称
在Oracle 中只能用双引号"包围关键字。但由于Oracle中双引号内的字符串是区分大小写的,而不管创建表还是查询时,Oracle都会把字段名转成全部大写,所以,除非创建表时双引号内的字段名就是全大写的,否则以后查询时SQL语句都必须加双引号,若不加则Oracle内部会把字段名转成全大写从而提示“无效的标识符”。同理,查询普通字段也可以通过加双引号查询得出,但双引号内的字段名必须是全大写,例如SELECT "ANY_FIELD_NAME" FROM TableName 在SQL Server 中可以用方括号[]或双引号"包围关键字。字段名任何情况下都不区分大小写。 在MySQL 中用`(backticks)把表和列名名字围起来。字段名也不区分大小写。 在Hibernate 中必须在定义映射关系时用backticks(`)包围字段名,具体参考这里 或这里 。
用户2657851
2020/03/04
1.6K0
一场pandas与SQL的巅峰大战(二)
上一篇文章一场pandas与SQL的巅峰大战中,我们对比了pandas与SQL常见的一些操作,我们的例子虽然是以MySQL为基础的,但换作其他的数据库软件,也一样适用。工作中除了MySQL,也经常会使用Hive SQL,相比之下,后者有更为强大和丰富的函数。本文将延续上一篇文章的风格和思路,继续对比Pandas与SQL,一方面是对上文的补充,另一方面也继续深入学习一下两种工具。方便起见,本文采用hive环境运行SQL,使用jupyter lab运行pandas。关于hive的安装和配置,我在之前的文章MacOS 下hive的安装与配置提到过,不过仅限于mac版本,供参考,如果你觉得比较困难,可以考虑使用postgreSQL,它比MySQL支持更多的函数(不过代码可能需要进行一定的改动)。而jupyter lab和jupyter notebook功能相同,界面相似,完全可以用notebook代替,我在Jupyter notebook使用技巧大全一文的最后有提到过二者的差别,感兴趣可以点击蓝字阅读。希望本文可以帮助各位读者在工作中进行pandas和Hive SQL的快速转换。本文涉及的部分hive 函数我在之前也有总结过,可以参考常用Hive函数的学习和总结。
超哥的杂货铺
2019/12/18
2.3K0
一场pandas与SQL的巅峰大战(二)
GridView添加新列并绑定控件
4、创建控件事件(不能是click事件,关联字段触发的事件要创建Command事件)
用针戳左手中指指头
2021/01/29
1.1K0
GridView添加新列并绑定控件
Oracle列转行函数LISTAGG() WITHIN GROUP ()的使用方法
前言:最近在写一些比较复杂的SQL,是一些统计分析类的,动不动就三四百行,也是首次写那么长的SQL,有用到一些奇形怪状的SQL函数,在这里结合网上的例子做一些笔记,以后用到不记得用法可以翻出来看!
全栈程序员站长
2022/11/01
5.4K0
Oracle列转行函数LISTAGG() WITHIN GROUP ()的使用方法
pandas’_pandas 删除列
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/02
2.7K0
pandas’_pandas 删除列
第11课 使用子查询使用计算字段作为子查询
我们考虑一个问题,列出订购物品‘RGAN01’的所有顾客的信息,那我们应该用怎样的信息检索?
desperate633
2018/08/22
1.4K0
从Excel到Python:最常用的36个Pandas函数
本文涉及pandas最常用的36个函数,通过这些函数介绍如何完成数据生成和导入、数据清洗、预处理,以及最常见的数据分类,数据筛选,分类汇总,透视等最常见的操作。
统计学家
2019/12/05
11.5K0
从Excel到Python:最常用的36个Pandas函数
Excel与pandas:使用applymap()创建复杂的计算列
我们之前讨论了如何在pandas中创建计算列,并讲解了一些简单的示例。通过将表达式赋值给一个新列(例如df['new column']=expression),可以在大多数情况下轻松创建计算列。然而,有时我们需要创建相当复杂的计算列,这就是本文要讲解的内容。
fanjy
2022/11/16
3.9K0
Excel与pandas:使用applymap()创建复杂的计算列
MySQL存储日志并使用Loganalyzer作为前端展示
为什么要使用日志 在生产环境中我们可能需要一个较为完整的日志系统来查看运行中主机服务的状态和所作出的操作,我们可以在较大型的网络架构中使用ELK来实现对日志的收集、检索、前端显示,但是中小型架构中使用rsyslog足以对所有服务器的日志进行收集和检索来达到实时分析数据流量的目的。 本文目标 使用rsyslog将两台主机的日志信息存储到MySQL数据库中,并且编译安装Loganalyzer对MySQL中的日志信息使用httpd+php在前端进行展示。 实验拓扑图 实验环境 主机名
小小科
2018/05/04
1K0
Excel: 对单元格区域中不重复的数字计数
文章背景: 工作中,有时需要计算某一单元区域内不重复数字的个数。可以借助COUNTA和UNIQUE函数完成这一需求。下面介绍两种场景。
Exploring
2023/08/17
2.9K0
Excel:  对单元格区域中不重复的数字计数
pandas用法-全网最详细教程
各位读者朋友们,由于更新blog不易,如果觉得这篇blog对你有用的话,麻烦关注,点赞,收藏一下哈,十分感谢。
全栈程序员站长
2022/07/01
7.4K1
pandas用法-全网最详细教程
python 使用pandas对csv文件进行排序
背景:使用jmeter的插件PerfMon生成的结果数据,需要获取到cpu的TOP 10.
小白will
2019/01/28
8K0
python df 列替换_如何用Python做数据分析,没有比这篇文章更详细的了(图文详情)...
如果你平常做数据分析用 Excel,想要用 Python 做还不太会?那这篇系统的文章一定能帮到你!建议先收藏后食用
用户7886150
2020/12/26
4.5K0
group by 多个字段
众所周知,group by 一个字段是根据这个字段进行分组,那么group by 多个字段的结果是什么呢?由前面的结论类比可以得到,group by 后跟多个子段就是根据多个字段进行分组 注:下面的例子是在网上找到的,仅供参考:
lin_zone
2018/10/10
7.3K0
mysql虚拟列(Generated Columns)及JSON字段类型的使用
mysql 5.7中有很多新的特性,但平时可能很少用到,这里列举2个实用的功能:虚拟列及json字段类型
菩提树下的杨过
2020/04/01
4.6K0
mysql虚拟列(Generated Columns)及JSON字段类型的使用
"Python替代Excel Vba"系列(三):pandas处理不规范数据
本系列前2篇已经稍微展示了 python 在数据处理方面的强大能力,这主要得益于 pandas 包的各种灵活处理方式。
咋咋
2021/09/01
5K0
"Python替代Excel Vba"系列(三):pandas处理不规范数据
点击加载更多

相似问题

pandas对多个列进行分组,并选择新数据帧中group by使用的所有列

112

Pandas计数器作为新列

115

Pandas:获取列值的计数并创建新列

12

如何使用python pandas对列进行分组并对条件值进行计数?

31

使用现有列和字典作为Pandas新列

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文