我必须创建一个生成
的CFG {a^n (ab)^n c^m d^l e^k | n>0, k, l, m>=0, k<m, m=l+k}
第一部分很容易,我想出了
S -> aS2abS3
S2 -> aS2ab | epsilon
然而,第二部分非常令人困惑。到目前为止我已经
了 S3 -> S4 | epsilon
我遇到的问题是如何跟踪所有这些变量? K必须小于m,m必须等于l + k,并且l必须至少为1。有人可以给我一些关于接近这些CFG的一般提示吗?
答案 0 :(得分:0)
从内到外思考(因为这就是CFG的工作方式),不要被无关的细节弄糊涂。
这里有一个提示:CFG是下推式自动机(PDA),这意味着它们有一个堆栈。 PDA具有良好的对称性,但不能进行反对称。所以他们可以做回文,但不能重复。这就是堆栈的本质。
所以你总是需要寻找镜像。例如,ambm
是一种简单的镜像形式,镜像将a
转换为b
s。
这个稍微复杂一点,但如果你专注于寻找对称性,你会发现它。
话虽如此,这是解决方案:
自m > l
以来,
cmdlek
可以改写为:
cm-lcldlek
从k = m - l
起,这与:
ckcldlek
从那里它是微不足道的:
Sinner → cd | c Sinner d Souter → Sinner | c Souter e