字母 E = {a, b, c}
我知道我们必须在外面有两个 a,但为什么我们有[]
-*
这些对这个特定的表达有什么作用?除此之外,我不太确定这意味着什么http://d.pr/i/uff7 -{ w | |W|}
它只是将语言放入的变量吗?
任何帮助是极大的赞赏!
字母 E = {a, b, c}
我知道我们必须在外面有两个 a,但为什么我们有[]
-*
这些对这个特定的表达有什么作用?除此之外,我不太确定这意味着什么http://d.pr/i/uff7 -{ w | |W|}
它只是将语言放入的变量吗?
任何帮助是极大的赞赏!
我在 Bash 中写这个的方式是 aa[abc]([abc][abc][abc])* 这意味着令牌应该以“aa”开头,后跟'a'
or'b'
或'c'
因此( aa[abc] )
[abc]
等价于(a + b + c)
在正式表示中表示'a'
或'b'
或'c
'
x*
表示'x'
任意次数,包括零
所以([abc][abc][abc])*
意味着(('a' or 'b' or 'c')
三次)发生任意次数。
正式的表达方式是[(a+b+c)(a+b+c)(a+b+c)]*
方括号就像普通的括号(例如,不像 Bash 或 Javascript 正则表达式),但我们通常在封闭的部分内部已经有括号时使用它们以增强可读性。星号适用于它前面的方括号中的孔块。
要首先回答您的后半部分问题,该表达式可以描述如下:
语言L a由一组单词w组成,其中 w 的长度是3 的倍数,w以aa开头。
竖线介绍了w要包含在集合中必须满足的条件。
第二个w两侧的条表示长度。
然后看答案,你有aa,因为这是单词必须以它开头,后跟另一个字母(a、b或c),给你一个匹配的 3 个字母的单词。
之后,任何其他单词都需要额外添加 3 个字母,每个字母可以是a、b或c。所以星号 (*) 表示这可能发生 0 次或多次,而括号 [] 仅表示星号适用于表达式的哪一部分。
在这种情况下[...]
,是对三个字母系列进行分组,*
表示出现 0 次或多次。
你有“aa”,然后你必须有一个字母,所以有(a+b+c),其余的都是可选的。