识别最大类型的正式语言

时间:2017-02-01 13:54:07

标签: grammar context-free-grammar regular-language formal-languages chomsky-hierarchy

目前我正在努力学习和理解正式语言和语法。 我理解乔姆斯基的等级制度,但我找到了一个我不知道如何得到解决方案的任务。 任务是:

G=({S},{a,b},S,P)
P={S->epsilon, S->aS, S->Sb}
  1. 这个语法的最大类型是什么?
  2. L(G)的最大类型是什么?
  3. 我知道语法是类型2,但在答案中写的是L(G) 3型。

    似乎还有一种描述这种语言的3型语法,但是你怎么知道哪种是正式语言的最大类型?有一些技巧吗?

1 个答案:

答案 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 -> aSS -> Sb的申请数量。基本情况:如果这两个都没有应用,只有字符串e是可派生的。 e位于a*b*,因此确认了基本情况。归纳假设:假设由kS -> aS的{​​{1}}个S -> Sb个应用程序派生的任何字符串都在a*b*中。归纳步骤:我们显示使用这些产品的k+1应用程序派生的任何字符串也在a*b*中。在k+1作品中派生的任何字符串都有一个在k作品中派生的字符串,即跳过k+1作品。这是因为制作使非终结组保持不变。我们已经知道k应用程序中派生的这个较短的字符串在a*b*中。我们有两个案例需要考虑:

  1. S -> aS:这会在a中的较短字符串的前面添加一个a*b*,并将其保留在a*b*
  2. S -> Sb:这会在b中的较短字符串的末尾添加一个a*b*,并将其保留在a*b*
  3. 由于两种情况都将字符串保留在a*b*中,因此在产品的k+1应用程序中派生的所有字符串都在a*b*中,并且通过归纳,语法生成的所有字符串都是。< / p>

    (2)考虑a^n b^m中的任何字符串a*b*。它由语法生成如下:n A -> aS m B -> Sb应用程序S -> ea*b*应用程序。因此size()中的所有字符串都是由语法生成的。