Regex 将NFA转换为正则表达式
我在这个网站上发现了一个相同的问题,答案是a。但这不起作用,因为这种方法有一些条件:Regex 将NFA转换为正则表达式,regex,nfa,Regex,Nfa,我在这个网站上发现了一个相同的问题,答案是a。但这不起作用,因为这种方法有一些条件: 存在从初始状态到所有其他状态的转换,并且没有 转换到初始状态 有一个单一的接受状态,只有进入它的转换(没有传出) 过渡) 接受状态与初始状态不同 除初始状态和接受状态外,所有其他状态都连接到所有其他状态 国家通过过渡。特别是,每个国家都有向自身的过渡 在我的示例中,开始状态只是进入下一个状态,而不是所有状态(例如,q0进入q1,但不是q2,q3),并且有过渡到开始状态 那么,将NFA转换为正则表达式的最简单方法
我想要一个通用算法来转换这种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,其中:
很好,谢谢你的回复。在我提供的站点上,在2.1示例中:在8个简单的数字中从GNFA到regex,第一步删除状态A,但是示例中的这个状态在状态A上没有循环转换,如果我的状态A上有循环转换呢?我必须把这个转换到q0(新的初始状态)?此外,如果一个状态将数据发送到旧的初始状态呢?例如,如果原始初始状态qA具有0和1的循环箭头,发送到qB 1并从qB 0接收数据,这将是什么样子?循环箭头为(0+1)*,发送和接收箭头为(01)*?两人都派去了