[英]Techniques for creating CFG's
我必須創建一個CFG
{a^n (ab)^nc^md^le^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的一般提示嗎?
由內而外思考(因為這是CFG的工作方式),不要被無關的細節弄糊塗。
提示:CFG是下推自動機(PDA),這意味着它們具有堆棧。 PDA擅長對稱性,但不能反對稱。 因此他們可以做回文,但不能重復。 這就是堆棧的本質。
因此,您始終需要查找鏡像。 例如, a m b m
是鏡像iamge的平凡形式,其中鏡子將a
s變成b
s。
這只是稍微復雜一點,但是如果您專注於尋找對稱性,就會發現它。
話雖如此,以下是解決方案:
由於m > l
,
cmdlek
可以重寫為:
cm-lcldlek
由於k = m - l
,因此與:
ckcldlek
從那里是微不足道的:
Sinner → cd | c Sinner d Souter → Sinner | c Souter e
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.