Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何证明(或发现)两个正则表达式是否相同或等价?_Regex_Finite Automata_Regular Language_Equivalence - Fatal编程技术网

Regex 如何证明(或发现)两个正则表达式是否相同或等价?

Regex 如何证明(或发现)两个正则表达式是否相同或等价?,regex,finite-automata,regular-language,equivalence,Regex,Finite Automata,Regular Language,Equivalence,例如,在给我的一个作业中,我们被要求找出两个正则表达式是否相等 (a+b+c)* and ((ab)**c*)* 我的问题是一个人应该怎么做?如果我为两个TG绘制转换图,然后通过它运行几个字符串,并显示两个TG都能够接受它,这是一个充分的证据吗?如果没有,我该怎么做?有没有一种数学/公理化的方法 提前谢谢 编辑:还有一件事我想澄清,这与这个问题有关。下图所示的两个FAs是否相同 i、 e.上图中的(1)和(2)是否相同 假设 插入空格以进行说明 ((ab)**c*)*实际上是((ab)**

例如,在给我的一个作业中,我们被要求找出两个正则表达式是否相等

(a+b+c)*  and ((ab)**c*)*
我的问题是一个人应该怎么做?如果我为两个TG绘制转换图,然后通过它运行几个字符串,并显示两个TG都能够接受它,这是一个充分的证据吗?如果没有,我该怎么做?有没有一种数学/公理化的方法

提前谢谢

编辑:还有一件事我想澄清,这与这个问题有关。下图所示的两个FAs是否相同

i、 e.上图中的(1)和(2)是否相同

假设

  • 插入空格以进行说明
  • ((ab)**c*)*
    实际上是
    ((ab)**c*)*
    *
  • 每个模式都由
    ^
    $
    包装
  • 那些正则表达式不一样。

    abccabcc
    将不匹配
    (a+b+c)*
    但将匹配
    ((ab)*c*)*

    我是怎么找到这个的

    当我仔细观察这些模式时,我发现了两件事

  • 第一个接受a和b中的多个
    {1,}
    。所以总是有a序列和b序列并排出现。与aaaabb、aabbbbb等类似,但在第二种模式中,a和be将与单个实例并排出现。像ab,阿巴巴,阿巴巴,等等
  • 在a和b序列之后,c仅出现1次。但在第二种模式中,c可以出现尽可能多的次数

  • 它们是不同的,这很容易用量词来区分。要使第一个表达式匹配任何内容,它必须包含
    c
    。第二种方法显然不需要
    c
    。(还有很多不同之处,但这应该让你开始了)

    如果语言 由R(即正则表达式生成的字符串集)定义 R) 等于T.定义的语言,以证明 正则表达式,我们使用集合论的包含证明。那个 是,如果S1是由正则表达式R生成的字符串集,并且 S2是正则表达式T生成的字符串集,我们必须 证明S1⊆ S2和S2⊆ S1。两个方向都需要证明 集合的相等性


    --从CSc 4340 GSU Fall 09(Raj Sunderraman博士)的课堂讲稿中,有一种算法可以确定它们是否相等:

  • 利用Kleene定理构造对应于每个RE的NFA lambda
  • 使用子集/功率集构造为每个组件构造DFA
  • (可选)使用标准DFA最小化算法最小化DFA
  • 使用笛卡尔积机器构造为L(M1)\L(M2)和L(M2)\L(M1)构造DFA
  • (可选)最小化这些CPM
  • 通过测试大小不大于| Q |的字母E上的所有字符串,确定每个字符串是否接受任何字符串(由于正则语言的泵引理而起作用)
  • 不需要新奇或天才;您可以编写一个程序来实现这一点(不过,在实践中,使用powerset结构可能会很麻烦,而且在这两个步骤中都无法最小化可能代价高昂)


    编辑:是的,这些DFA是相同的。第一个只是第二个的简写符号。

    因为这是家庭作业,我不会给你完整的答案,但我会告诉你一个你需要知道的关键事实:对于给定的有限状态语言,用最少状态数识别它的DFA是唯一的


    顺便说一句,我不相信你的教授会在不教你怎么做的情况下布置家庭作业。离开互联网,阅读你的课堂讲稿和/或课本。

    ((ab)^^c^)^=(a^b^c^)^=(a+b+c)^

    为什么表达式中有空格?我想是手工的吧?如何通过编程实现这一点是众所周知的,但我认为(我不太了解相关算法)手工完成整个过程相当复杂。
    ((a b)**c*)*
    是错误的@谢谢你的回复。是的,空间是多余的。我已经编辑了这个问题。是的,但由于这两种语言的大小都是无限的,这无助于证明任何事情。请尽量避免将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能不明显。如果最小DFA是唯一的,为什么我们需要步骤4-6?构建最小DFA并对其进行比较是否不够?