簡體   English   中英

{a*b*c*} 的上下文無關文法 - {a^nb^nc^n | n >=0}

[英]Context free grammar for {a*b*c*} - {a^n b^n c^n | n >=0}

我遇到了這個問題。 我相信它告訴我,不能生成甚至包含 # 個 a 的 b 和 c 的字符串。 這是由於減去了第二組。

來自新形成的 CFG 的好字符串應該是類似 aaabbc 或 abbbcc 之類的東西。

所以我試着把問題分成三個部分......

  1. 單一狀態

    a.) S(1) -> aS(1) | a | ^ b.) S(2) -> bS(2) | b | ^ c.) S(3) -> cS(2) | b | ^
  2. 兩個國家

    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)
  3. 帶 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 * | nm } ∪ {a * b n c m | nm }

(使用上面的Kleene星可能是濫用符號。最初,我用第三個整數變量來寫它。但我認為星更清晰。)

現在,{a n b m | nm } 只是一個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 * | 所述 nm } ∪ {a * b n c m | nm }

//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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM