Regex 将NFA转换为正则表达式

Regex 将NFA转换为正则表达式,regex,nfa,Regex,Nfa,我在这个网站上发现了一个相同的问题,答案是a。但这不起作用,因为这种方法有一些条件: 存在从初始状态到所有其他状态的转换,并且没有 转换到初始状态 有一个单一的接受状态,只有进入它的转换(没有传出) 过渡) 接受状态与初始状态不同 除初始状态和接受状态外,所有其他状态都连接到所有其他状态 国家通过过渡。特别是,每个国家都有向自身的过渡 在我的示例中,开始状态只是进入下一个状态,而不是所有状态(例如,q0进入q1,但不是q2,q3),并且有过渡到开始状态 那么,将NFA转换为正则表达式的最简单方法

我在这个网站上发现了一个相同的问题,答案是a。但这不起作用,因为这种方法有一些条件:

  • 存在从初始状态到所有其他状态的转换,并且没有 转换到初始状态
  • 有一个单一的接受状态,只有进入它的转换(没有传出) 过渡)
  • 接受状态与初始状态不同
  • 除初始状态和接受状态外,所有其他状态都连接到所有其他状态 国家通过过渡。特别是,每个国家都有向自身的过渡
  • 在我的示例中,开始状态只是进入下一个状态,而不是所有状态(例如,q0进入q1,但不是q2,q3),并且有过渡到开始状态

    那么,将NFA转换为正则表达式的最简单方法是什么?我没有给出一个NFA的例子,因为我没有一个特殊的例子,这只是一个一般性的问题,因为我遇到了这种DFA,在这种DFA中,开始状态与所有状态都不相关,并且是到开始状态的转换


    我想要一个通用算法来转换这种NFA。

    答案是假设这些条件,因为任何NFA都可以修改以满足这些要求

    对于任何类型的NFA,您都可以添加一个新的初始状态q0,该状态具有到原始初始状态的ε转换,并且还可以使用一个名为∅ (他们称之为空集符号,假设它与原始NFA中的任何符号都不匹配)从它到任何其他状态,然后使用此新状态作为新的初始状态。请注意,这不会改变原始NFA接受的语言。这将使您的NFA满足第一个条件

    对于任何类型的NFA,您都可以添加一个新的接受状态qa,该状态从原始NFA中的所有接受状态进行ε转换。然后将其标记为唯一接受状态。请注意,这不会改变原始NFA接受的语言。这将使您的NFA满足第二个条件

    通过上述构造,通过设置q0!=qa,它满足第三个条件

    在您提供的链接中,第四个条件是通过一个名为∅ (空集符号),原始NFA中的实际字母表无法匹配。因此,您可以使用此新符号添加从每个状态到任何其他状态的转换。请注意,这不会改变原始NFA接受的语言

    现在NFA已经被修改以满足四个要求,您可以应用算法将NFA转换为正则表达式,正则表达式将接受与原始NFA相同的语言

    编辑以回答进一步的问题:

    在评论中回答你的问题,考虑NFA有两个状态,QA和QB。qA是初始状态,也是唯一的验收状态。我们有一个从qA到其自身的转换,符号为0,1。我们也有从qA到qB的转换,符号为1。最后,我们用符号0从qB转换到qA

    可视化:

    0,1 | 1 ->qA----->qB ^ | |-------| 0 0,1 | 1 ->质量保证------>qB ^ | |-------| 0 第二步。当我们规范化NFA时,只需将指向qA的新init状态(qinit)放入,并从qA放入一个新的接受状态(qacc)

    第三步。我们想删除qA。因此,qA是算法中的qrip(见第3页)。现在我们需要考虑进入QA的每个州和退出QA的每个州。在本例中,有两个状态指向qA,即qinit和qB。qA指出了两种状态,即qB和qacc。通过该算法,我们将转换qin->qrip->qout替换为转换qin->qout,具有转换符号Rdir+Rin(Rrip)*Rout,其中:

  • Rdir是从秦国到库特的原始过渡
  • Rin是从秦到qrip的原始过渡
  • Rrip是qrip的原始回路
  • Rout是从qrip到qout的原始转换
  • 因此,在这种情况下,我们将转换qinit->qA->qB替换为带有转换符号(0+1)*1的qinit->qB。继续此过程,我们将总共创建4个新的过渡:

  • qinit->qB:(0+1)*1
  • qinit->qacc:(0+1)*
  • qB->qB:0(0+1)*1
  • qB->qacc:0(0+1)*
  • 然后我们可以删除qA

    第四步。我们想删除qB。我们再次确认秦和库特。这里只有一个州来到qB,那就是qinit,只有一个州离开qB,那就是qacc。因此,我们:

  • Rdir=(0+1)*
  • Rin=(0+1)*1
  • Rrip=0(0+1)*1
  • 路由=0(0+1)*
  • 因此,新的过渡qinit->qacc将是:

    Rdir+Rin(Rrip)*路由

    (0+1)*+(0+1)*1(0(0+1)*1)*0(0+1)*

    我们可以删除qB

    第五步。既然原始NFA中的每个州都被删除了,我们就完蛋了。最后的正则表达式如上图所示

    请注意,最终的正则表达式可能不是最优的(在大多数情况下也不是最优的),这是算法所期望的。一般来说,为NFA(甚至DFA)找到最短的正则表达式是非常困难的(尽管在本例中很容易看到第一个组件已经覆盖了所有可能的字符串)

    为完整起见,接受相同语言的最短正则表达式为:

    (0+1)*


    很好,谢谢你的回复。在我提供的站点上,在2.1示例中:在8个简单的数字中从GNFA到regex,第一步删除状态A,但是示例中的这个状态在状态A上没有循环转换,如果我的状态A上有循环转换呢?我必须把这个转换到q0(新的初始状态)?此外,如果一个状态将数据发送到旧的初始状态呢?例如,如果原始初始状态qA具有0和1的循环箭头,发送到qB 1并从qB 0接收数据,这将是什么样子?循环箭头为(0+1)*,发送和接收箭头为(01)*?两人都派去了