我正在学习一门计算课程,该课程还教授正则表达式。有一个很难回答的问题。
找到接受最多包含两对连续 0 的单词的语言的正则表达式。字母表由 0 和 1 组成。
首先,我制作了该语言的 NFA,但无法将其转换为 GNFA(后来被转换为正则表达式)。我怎样才能找到这个正则表达式?是否将其转换为 GNFA?
(由于这是一个家庭作业问题,我假设您只需要足够的帮助来开始,而不是一个完整的解决方案?)
您的里程可能会有所不同,但我真的不建议尝试将 NFA 转换为正则表达式。两者在理论上是等价的,并且可以通过算法转换为另一个,但在我看来,这不是构造任何一个的最直观的方式。
相反,一种方法是从列举各种可能性开始:
根本没有成对的连续零;也就是说,每个零,除了字符串的末尾,必须跟一个一。1
因此,字符串由and的混合序列组成01
,可选地后跟0
:
(1|01)*(0|ε)
正好一对连续的零,在字符串的末尾。这与上一个非常相似:
(1|01)*00
恰好是一对连续的零,而不是在字符串的末尾——因此,后面必然跟着一个 1。这也与第一个非常相似:
(1|01)*001(1|01)*(0|ε)
要继续这种方法,您将扩展上述内容以支持两对连续零;最后,您会将所有这些合并到一个正则表达式中。
(0+1)*00(0+1)*00(0+1)* + (0+1)*000(0+1)*
最多包含两对连续的 0
(1|01)*(00|ε)(1|10)*(00|ε)(1|10)*