我正在审查正则表达式,并一直停留在以下问题上:
提供正则表达式来描述以下NFA的语言: NFA Diagram
我不知道如何回答以下问题,也不希望有人给我答案。如果可能的话,我将非常感谢您提供有关如何解决此类问题或如何解决特定问题的指南。谢谢!
非常感谢您的帮助!
答案 0 :(得分:0)
基本的转换,您知道的。
{q0, x, q0} becomes x*
{q0, x, q1} becomes x
{q0, x, q1}, {q0, y, q1} becomes x+y
您的图表为DFA。
您最右边的状态不应为q1
。您有双q1
。从现在起将最正确的状态命名为q3
。
我认为最困难的部分是因为从q3
到q1
和q2
的传出过渡。
我们将从左侧开始。
{q0, x, q0},{q0, y, q1} => x*y
q0
是开始状态,q1
是结束状态。然后x*y
必须总是发生。其余的事情可能发生与否,因为从q1
返回到q3
。因此,我们可以这样写:
RE = x*y( ... )*
我们现在正在研究括号内的内容。
{q1, x, q2}, {q1, y, q2} => (x+y)
由于从q2
回到了q3
,我们可以这样写:
RE = x*y((x+y)( ... ))*
因为只有一种过渡才能达到最终状态,即{q3, y, q1}
,所以我们将y
放在最后。
RE = x*y((x+y)( ... )y)*
最后一部分和令人困惑的部分是{q2, y, q2}, {q2, x, q3}, {q3, x, q2} => (y+xx)*x
说明:
我们在q2
上,我们有y*
或(xx)*
一个或多个时间返回q2
。我们可以写(y*+(xx)*)*
或简单地写(y+xx)*
。请记住,我们必须处于q3
状态,才能通过读取y
进入最终状态,然后从q2
开始,我们需要读取x
,以便(y+xx)*x
。
因此,完整的正则表达式:x*y((x+y)(y+xx)*xy)*
答案 1 :(得分:0)
ipramusinto 的回答不正确。 x*y((x+y)(y+xx)*xy)*
接受不是解决方案的字符串 yxxyxy。
查看有关如何完成的相关主题(评论)。
正则表达式是:x*y((x|y)y*x(xy*x)*y)*