目前我正在努力学习和理解正式语言和语法。 我理解乔姆斯基的等级制度,但我找到了一个我不知道如何得到解决方案的任务。 任务是:
G=({S},{a,b},S,P)
P={S->epsilon, S->aS, S->Sb}
L(G)
的最大类型是什么?我知道语法是类型2,但在答案中写的是L(G)
3型。
似乎还有一种描述这种语言的3型语法,但是你怎么知道哪种是正式语言的最大类型?有一些技巧吗?
答案 0 :(得分:0)
我不认为有一种简单的算法方法可以总是说出L(G)
的语言类别;我的意思是说,总的来说,我认为有些情况根本无法以某种方式证明。鉴于不受限制的语法可以编码算术,这来自不完整性/不可判定性。这是非常手工制作的。
启发式地,您可以尝试了解您的语言是什么,您可以转换语法以尝试强制语法更简单等,但这些并不能保证成功。
在这种特殊情况下,弄清楚语言是什么,识别它是常规的,并为它写下语法也不算太糟糕。
S -> e
S -> aS
S -> Sb
从S
派生的任何字符串都可以a
开头,任意数量的S -> aS
,并且可以b
以任意数量的S -> Sb
结尾。我们可能假设语言为a*b*
,然后通过显示(1)L(G)是 b 的子集和(2)a b 是L(G)的子集。
(1)证据是通过归纳S -> aS
和S -> Sb
的申请数量。基本情况:如果这两个都没有应用,只有字符串e
是可派生的。 e
位于a*b*
,因此确认了基本情况。归纳假设:假设由k
和S -> aS
的{{1}}个S -> Sb
个应用程序派生的任何字符串都在a*b*
中。归纳步骤:我们显示使用这些产品的k+1
应用程序派生的任何字符串也在a*b*
中。在k+1
作品中派生的任何字符串都有一个在k
作品中派生的字符串,即跳过k+1
作品。这是因为制作使非终结组保持不变。我们已经知道k
应用程序中派生的这个较短的字符串在a*b*
中。我们有两个案例需要考虑:
S -> aS
:这会在a
中的较短字符串的前面添加一个a*b*
,并将其保留在a*b*
。S -> Sb
:这会在b
中的较短字符串的末尾添加一个a*b*
,并将其保留在a*b*
。由于两种情况都将字符串保留在a*b*
中,因此在产品的k+1
应用程序中派生的所有字符串都在a*b*
中,并且通过归纳,语法生成的所有字符串都是。< / p>
(2)考虑a^n b^m
中的任何字符串a*b*
。它由语法生成如下:n
A -> aS
m
B -> Sb
应用程序S -> e
和a*b*
应用程序。因此size()
中的所有字符串都是由语法生成的。