为以下语言提供无上下文语法:

时间:2015-10-17 03:06:59

标签: context-free-grammar formal-languages

a) L = {1^i - 1^j = 1^(i-j) | i-j>=0, i,j>=0}  
b) L = {a^i b^j c^k | k!=i+j, i,j,k>=0  

我似乎无法弄清楚如何实施这些程序。我理解这个概念,我似乎无法解决这个问题。任何帮助都会很棒!我已经盯着这东西大约6个小时了,而且一无所获。

1 个答案:

答案 0 :(得分:1)

解决这样的问题确实只有一些技巧,而且同样的问题一遍又一遍地出现。然而,真正让他们陷入困境的唯一方法是解决一些问题,所以这个答案实际上并不能解决OP中的家庭作业。我希望它能提供一些想法。

无上下文语言可以由其他上下文无关语言组成,一旦你知道组合是什么,就不需要太多考虑如何编写组合。在以下示例中,我不区分非终端语言和无上下文语言,因为非终端实际上​​定义了无上下文语言。例如,如果L 1 且L 2 是两个CFG,那么产生

L1 → …
L2 → …

那么联合L = L 1 ∪L 2 就是:

L → L1
L → L2
L1 → …
L2 → …

而串联语言M = L 1 L 2 是:

M → L1 L2
L1 → …
L2 → …

现在,这里有几个有用的组合。首先,括号平衡。无上下文的语言不能计算,除了它们可以计数然后倒计时。所以 n [ m ] m < kbd>) n 是一种无上下文的语言,很容易看出它可以通过以

开头来组成
L1 = [m]m

然后定义

L2 = (nL1)n

使用以下简单作品:

L1 → ε
L1 → ( L1 )
L2 → L1
L2 → [ L1 ]

我本来可以用 a b c d 代替括号和括号,但是我认为当你使用括号时,意图会更清晰。

这就是如何做平等计数。不平等呢?让我们从一个非常简单的语言开始:Kleene + a + 是“一个或多个 a s”,语言很简单:

L → a
L → L a

现在考虑{ a n b m | n≠m}。我们可以将其重写为联盟:

{ a n b m | n&gt; m}∪{ a n b m |米将N}

因为如果m≠n,则m> n和n> m中的一个必须为真。

现在看看{ a n b m | N'GT; M}。由于n严格大于m,我们可以将 a n b m 重写为 a MN b'/ KBD> 。但我们并不关心n-m是什么,只是它至少有一个。所以我们可以使用Kleene + 来生成 a mn a m b m 这显然是:

L1 → a
L1 → L1 a
L2 → ε
L2 → a L2 b
L → L1 L2 

m> n的情况非常相似,为了得到m≠n,我们只需要找到这两种语言的联合。

我希望一切都清楚。

通常用奇怪的小代数身份来提供这样的谜题。要解决它们,您只需要将公式减少到上面显示的少数情况,使用 a i + j = a 等分解 i a j ,这不完全是火箭科学。

例如,另一个SO问题询问语言{ a n b m c 2n + m | n,m> 0}。

解决它很简单。首先,我们想要括号匹配 b m ,所以我们需要将 c 2n + m 重写为 C C 2n个。这使我们将 a n c 2n 进行括号匹配;为了使两个重复计数相同,我们需要将 c 2n 更改为 cc n

将原文重写为 a n b m c m cc n ,很明显该语言是:

L1 → ε
L1 → b L1 c
L2 → L1
L2 → a L1 cc

这与本答案顶部的括号平衡示例方式基本相同。