![](/img/trans.png)
[英]Why the following language cannot be defined using a Pushdown Automata (PDA)?
[英]Automata: CFG for following language
請查看以下語言:
(a, b, c)* − {a n b n c n |n≥0}
我的問題是:如何為它編寫上下文無關的語法?
通常,當某些東西被排除在外時(即帶有“-”號),我該如何編寫語法?
沒有確定語言是否上下文無關的算法。 因此,對於您提出的問題沒有通用的解決方案也就不足為奇了。
上下文無關的語言在補語,集合差異或交集下不會封閉。 (但它們在連接,並集和Kleene星的作用下是關閉的。)
{a n b n c n |n≥0}
不是上下文無關的語言,但它的補語(如您的問題)是上下文無關的。 這一事實的證明(通過為補語構建上下文無關的語法)是在補語下不封閉CFG的標准示例。
概括而言,您的語言L可以由以下各項的組合組成:
字母{a,b,c}
上字母不按順序排列的所有字符串。 換句話說,所有包含子字符串ba
, cb
或ca
的字符串。
{a i b j c k |i,j,k≥0∧i≠j}
{a i b j c k |i,j,k≥0∧j≠k}
(a, b, c)* − {a^nb^nc^n|n≥0}
這表示您可以選擇a,b或c中的任何一個,並重復其中的任何一個,例如abccbaabaab或abca或bccc
對於a *,請使用A->aA |e
或A->AA | a | e
A->AA | a | e
A->AA | a | e
。
使用該規則,您可以執行以下操作:
S -> A | B | C A->aA |e | AS B->bB |e | BS C->cC |e | CS
如果整個對象上都有一個Kleene星(....)*
,則可以使用A,B和C中的每個S,並允許您回到起點並添加另一個符號。
我不知道如何制作排除符號的語法,但是從邏輯上講,如果-
不是可用的終端符號,則您已經排除了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.