[英]Context free grammar for {a*b*c*} - {a^n b^n c^n | n >=0}
我遇到了這個問題。 我相信它告訴我,不能生成甚至包含 # 個 a 的 b 和 c 的字符串。 這是由於減去了第二組。
來自新形成的 CFG 的好字符串應該是類似 aaabbc 或 abbbcc 之類的東西。
所以我試着把問題分成三個部分......
單一狀態
a.) S(1) -> aS(1) | a | ^ b.) S(2) -> bS(2) | b | ^ c.) S(3) -> cS(2) | b | ^
兩個國家
a.) S(4) -> aS(4)b | S(1) | S(2) b.) S(5) -> bS(5)c | S(2) c.) S(6) -> aS(6)c | S(3) | S(1)
帶 AB 狀態的狀態
a.) S(7) -> S(1) | S(4)S(6) b.) S(8) -> S(2) | S(5)S(6) c.) S(9) -> S(3) | S(6)S(3)
原始開始狀態為...
S -> S(7) | S(8) | S(9)
但是我在構建像 aaaabbbcc 這樣的字符串時遇到了問題......
我是否錯誤地形成了 CFG? 我覺得我在正確的軌道上,但現在我很迷茫。
可以使用給定的產生式構造 a^nb^nc^n 語言的上下文無關語法。
S -> aSc | X
X -> BX
X -> null
使用上面的產生式你可以生成一個^nb^nc^n。 假設我們正在生成 a^2 b^2 c^2。 我們將從 S 開始。
= aSc
= aaScc ; aSc
= aaXcc ; S -> X
= aabXcc ; X -> bX
= aabbXcc ; X -> bX
= aabb(null)cc ; X -> null
= aabbcc
這種語言的一個更簡單的表達是:
{a n b m c * | n ≠ m } ∪ {a * b n c m | n ≠ m }
(使用上面的Kleene星可能是濫用符號。最初,我用第三個整數變量來寫它。但我認為星更清晰。)
現在,{a n b m | n ≠ m } 只是一個n (a + |b + )b n
所以完整的表達式可以寫成n (a + |b + )b n c * | a * b n (b + |c + )c n
將所有這些放在一個 CFG 中有點乏味,所以我把它留給了讀者。 但這完全是機械的。
從中制作 DFA(或更恰當地說確定性下推自動機)可能會更棘手,因為 CFG 是模棱兩可的。 事實上,該語言的每個CFG 都是模棱兩可的。 但是制定 NDPA 沒有問題。
所以我把問題分成2個子問題
a 的數量與 b 的數量不同。 因此,a 和 c 或 b 和 c 可以相同。
b 的數量與 c 的數量不同。 因此,a 和 b 或 a 和 c 可以相同。
編輯:更正式的如 Rici {a n b m c * | 所述 n ≠ m } ∪ {a * b n c m | n ≠ m }
//a and b is different
S-->XR
//b and c is different
S-->DY
//Genarates a string where a is more than b
X--> aXb | A
A --> aA | a
//Genarates a string where b is more than a
X--> bXa | B
B --> bB | b
//Genarates a string where b is more than c
Y--> bYc | B
B --> bB | b
//Genarates a string where c is more than b
Y--> cYb | C
C --> cC | c
R-->Rc|c|^
D-->Da|a|^
Murdock 上面的答案非常接近,但在某些情況下失敗了。 例如,它可以生成 a、b 和 aabcc,但不能生成 c、abbcc 或 bc,即使它應該能夠生成。 (JFlap 是一個很棒的軟件,我用來在我構建的語法上快速測試不同的字符串,它對形式語言和計算理論中的許多其他概念也很有幫助。)使用 Murdock 的 CFG,字母也可以出現在不同的順序,但問題陳述強制所有 a 先出現,然后是所有 b,最后是 c。
丹麥人艾哈邁德似乎誤解了這個問題,並試圖為 a、b 和 c 的數量相等的語言構建一個 CFG。 我的講師突然說不可能為此構建 CFG。 對於 a = b = c,丹麥語的 CFG 是不正確的,因為它可以通過 S -> X 自行生成一個 'b'; X -> BX; X -> null(還假設大寫 B 是終端 b。)
這是我的答案,它添加並調整了 Murdock 的 CFG 的一些組件,使其對問題有效。
S=XR|DY|WR|DZ
X=aXb|A
A=aA|a
W=aWb|B
B=bB|b
Y=bYc|B
Z=bZc|C
C=cC|c
R=Rc|c|epsilon
D=Da|a|epsilon
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.