给出Σ= {a,b}的正则表达式

问题描述 投票:0回答:1

这个问题要求我在Σ= {a,b}上给出正则表达式,该表达式精确定义了以下语言。

这些是;

((a)L1,正好有一个b,但有任意数量的as。

我的尝试是:L1 =(a + b)* b

[(b)L2,其as为偶数,bs为偶数。

我对此的尝试是:L2 =(aa + bb)*

((c)L3包含正好两个as或正好两个bs,尽管不一定相邻。

[(d)L4,所有b出现在所有b之前,或所有b出现在as之前。

(e)L5,其中可以有任意数量的bs,但是as的数量必须是偶数,尽管as不必相邻。

我正在努力寻找答案。如果您能帮助我,我将不胜感激。谢谢

math computer-science discrete-mathematics regular-language formal-languages
1个回答
1
投票

(a)我们恰好需要一个b,它可以出现在字符串的任何位置;我们可以有任意数量的其他符号,其中只有一个;因此,我们的正则表达式为(a *)b(a *)(注意:括号仅是为了清楚起见而添加的,可以省略)。

(b)稍微复杂一点。见下文。

(c)我们可以为每种情况编写正则表达式,然后将它们合并以获得一个正则表达式;情况就像上面的(a):(a *)b(a *)b(a *)+(b *)a(b *)a(b *)

(d)再一次,我们可以分别处理每种情况并合并答案:(a *)(b *)+(b *)(a *)

(e)稍微复杂一点,但比(b)容易。见下文。

对于(b)和(e),我建议先写下一个有限的自动机,然后写下一个正则语法,然后求解隐含方程组以找到正则表达式。我将以(e)为例,以(b)做练习。

(e)的有限自动机是这个:

  +---a-----+
  |         |
  V         |
(q0)--a-->(q1)
|  ^      |  ^
+-b|      +-b|

常规语法是这样:

(q0) -> e | a(q1) | b(q0)
(q1) -> a(q0) | b(q1)

隐式方程组:

(q0) = e + a(q1) + b(q0)
(q1) = a(q0) + b(q1)

我们可以使用规则q = rq + s => q = r*s简化每一行:

(q0) = (b*)[a(q1) + e] = (b*)a(q1) + (b*)
(q1) = (b*)a(q0)

现在我们替换并简化:

(q0) = (b*)a(b*)a(q0) + (b*)
     = [(b*)a(b*)a]*(b*)

您有答案:(e)的正则表达式为[(b*)a(b*)a]*(b*)。现在我们有一个合理的答案了:方括号中的部分恰好包含两个a,将其加星号给出任何偶数,然后以b *结尾意味着我们不需要最后一个a(但如果需要的话,我们可以有一个)。

对于(b):要么做我们对(e)所做的事情(请注意,您将拥有一个四态DFA,四个非终端和四个方程,但是您可以使用与以前相同的方式来求解系统),或者使用我们制作的其他表达式以及您收集的所有见解,以查看是否有更简单的方法来组合事物以获得所需的表达式。

© www.soinside.com 2019 - 2024. All rights reserved.