我使用的语言是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}
。
然后我声称L
是L = 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
答案 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中提到的其他数学属性的语法。