语言和正则表达式的制定

Formulation of language and regular expressions

我搞不懂什么是正式语言和正则表达式 这个自动机的数量:

DFA 自动机

我知道 'b' 或 'a' 的实例必须是偶数。 一开始我以为语言是:

L = {(a^i)(b^j) | i(mod2) = j(mod2) = 0, i,j>=0}

但是自动机可以从'b'开始,所以语言不正确。 另外,我发现的正则表达式也不匹配 ((aa)* + (bb)) -

例如无法获得 abab。

我通过逐步删除节点(顺序:3,1,2,0)得到的正则表达式是:

(aa|bb|(ab|ba)(bb|aa)*(ab|ba))*

据我所知,这是最简单的方法。 (我很想知道是否有人有更简单的还原——实际上我这周正在测试这个东西!)

分步过程

我们首先添加一个新的开始和接受状态。每个旧的接受状态(在这种情况下,只有一个)通过 ε 转换链接到新的接受状态:

接下来,我们删除状态 3。我们需要保留所有 运行 通过状态 3 的路径。在这种情况下,我们添加了一条从状态 0 回到自身的路径,即从状态 0 到状态 2,状态 2 回到自身:

我们对状态 1 做同样的事情:

我们可以稍微简化一下:我们将用逗号连接环回转换。 (最后,这将变成联合运算符(| 等,具体取决于您的表示法。)

接下来我们将删除状态 2,并将所有内容压缩到一个大循环中:

循环变成星星;我们删除了最后一个状态,所以我们只有一个从开始状态到结束状态的转换,与一个大的正则表达式相关联:

这就是我们的正则表达式!

语言定义

您已经非常接近语言定义了。如果你可以允许一些更宽松的东西,那就是:

L = { w | w contains an even number of 'a's and 'b's }

您定义的问题是您每次都以 a 开始字符串 w,而唯一的限制是 a 的奇偶性和 b 的。