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个小时了,而且一无所获。
答案 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
这与本答案顶部的括号平衡示例方式基本相同。