语言L = {a ^(n)b ^(m)c ^(k)的无上下文语法:m = | i-k |}

时间:2018-11-10 23:28:14

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

我使用的语言是L = {a^n b^m c^k: m = |n - k|}

我知道m = |n - k|可以用两种方式表示 1) m = n - k for n >= k or n = m + k 2) m = k - n for k >= n or k = m + n
因此,我得到两种语言,其中
L1 = {a^n b^m c^k: n = m + k}L2 = {a^n b^m c^k: k = m + n}
然后我声称LL = L1 U L2两者的并集。

我不太了解如何生成语法,其中一个终端的一个指数是其他两个终端的总和。也就是说,在L1中,您有n = m + k
L1也可以进一步简化为
a^n => a^(m+k) => a^(m)a^(k)使得L1成为
L1 = {a^m a^k b^m c^k: m, k >= 0}

尝试回答 L1 = {a^m a^k b^m c^k: m, k >= 0}
语法G1
S -> A|B
A -> aAb|lambda
B -> aBc|lambda

2 个答案:

答案 0 :(得分:0)

对于L1,您可以使用

S -> aSc
S -> T
T -> aTb
T -> 

与L2类似。

答案 1 :(得分:0)

a^n b^n

考虑CFG:

S ::= aSb | <empty string>

这将生成所有带有正确匹配指数的字符串a^n b^n。这样做的原因是,使用此语法添加a时还需要添加一个额外的b。通过确保每个产品都保留期望的属性(a的数量与b的数量相同),我们已经确保(通过归纳,因为该属性最初拥有,并且每个产品都会保留它),它将保存在我们从语法生成的每个句子中。

a^n b^m c^(n+m)

如果我们想制作一个语法以生成稍微复杂一点的a^n b^m c^(n+m),则可以应用类似的推理:我们在语法结构中进行编码,即添加一个a或一个{{1} }需要添加b

c

同样,由于每个产品都保留了我们想要的属性(S ::= aSc | T | <empty string> T ::= bTc | <empty string> 的数量是c的数量加上a的数量),因此对于任何我们在语法中生成的句子。

您可以应用类似的推理来找出保留OP中提到的其他数学属性的语法。