![](/img/trans.png)
[英]Context-free grammar for the language L = {a^(n)b^(m)c^(k): m = |i - k|}
[英]L={a^i b^j c^k d^l | i=k and j=l} i couldn't find the grammar of the given language
我試過了
S-A|B
A-aCcD|aAc|ac
B-bBd|bd
C-b
D-d
這僅適用於 output ac 和 bd,但我不能將 b 放在 a 和 c 之間。
考慮字符串 a^pb^pc^pd^p。 這個字符串肯定是在語言中。 如果語言是正則的,並且存在正則語法,那么它將滿足正則語言的泵引理的要求:即,上面給出的字符串可以寫成 uvx,其中 |uv| <= p, |v| > 0 並且對於所有自然數 n,u(v^n)x 也在該語言中。 v 包含的內容有七種情況:just a; 一個和乙; 只是 b; b和c; 只是 c; c 和 d; 或者只是d。 在任何情況下,抽取 v 都會改變一種符號的實例數,但不會改變相應符號的實例數(語言要求的頻率完全相同)。 所以,語言不能是正則的。
類似地,上下文無關語言的泵引理要求將上面給出的字符串寫為 uvxyz,其中 |vxy| <= p, |維| > 0 並且對於所有自然數 n,u(v^n)x(y^n)z 也是語言的字符串。 我們在這里得到與上面完全相同的情況,並得出完全相同的結論:語言不能是上下文無關的。
考慮到所有這些,我們還不如只針對不受限制的語法(可能會為這種語言獲得上下文相關的語法,但這不是要求的)。 我們希望 a 和 c 的數量相同,b 和 d 的數量相同,並且我們希望它們按字母順序排列。 我們可以這樣開始:
S -> ACS | BDS | T
這讓我們得到的字符串中,A 的個數與 C 相同,B 的個數與 D 相同,以 T 結尾。接下來,我們需要一些規則來允許以正確的順序放置符號 A、B、C 和 D:
BA -> AB
CA -> AC
DA -> AD
CB -> BC
DB -> BD
DC -> CD
最后,我們需要一種將非終端 A、B、C 和 D 轉換為終端 a、b、c 和 d 的方法,除非它們都按順序排列,否則它無法工作。 我們可以使用 T(以及即將介紹的其他一些符號)從右向左掃描,轉換為 go:
DT -> Td
CT -> Uc
BT -> Vb
AT -> Wa
T -> e
CU -> Uc
BU -> Vb
AU -> Wa
U -> e
BV -> Vb
AV -> Wa
V -> e
AW -> Wa
W -> e
非終結符 T、U、V 和 W 允許將 AD、AC、AB 和 A 分別轉換為 ad、ac、ab 和 a。 我們也可以隨時去掉這個標記符號。 消除所有非終結符得到一串終結符(即按照這個文法生成一個字符串)的唯一方法是從右向左掃,將遇到的所有符號轉換,最后使用 X -> e 規則中的一個需要消除標記。 這僅在符號按從右到左的降序轉換時才有效,因此它們必須按要求從左到右按升序排列。 因為 S 的產生式引入了 A、C 和 B、D 成對出現,所以該要求也得到滿足。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.