[英]How to construct a PDA for n(a) is less than or equal to 2n(b)
所以這就是我卡住的地方,我必須構建一個 PDA 來接受來自 {a,b}* 的單詞,條件 n(a) 小於或等於 2n(b)
將自己置於下推自動機的思維框架中。 您所知道的就是讀取輸入和堆棧,然后根據您看到的內容進行推送/彈出和更改狀態。 如果你開始閱讀一個字符串並需要判斷它是否在語言中,你能做什么?
在我看來,我們能做的最好的起步是要記住多少a
š我們閱讀。 在我們看到b
之前,沒有理由做任何其他事情。 也就是說,只需讀取a
s 並將它們壓入堆棧。 以下規則應該足夠了:
Q i s Q' s'
-- -- -- -- --
q0 a Z q0 aZ
q0 a a q0 aa
現在,當我們看到 a b
時會發生什么? 如果我們至少要多一倍b
S作為a
S,我們不能只越過a
S代表每個b
,因為這將至少給盡可能多的b
S作為a
秒,但不是至少兩倍多。
如果我們越過什么對開a
S代表每個b
? 嗯,這為我們提供了至少一半的b
S作為a
s,這是錯誤的方向。 這表明每兩個b
划掉一個a
,結果證明是正確的。 規則:
Q i s Q' s'
-- -- -- -- --
q0 b a q1 a
q1 b a q2 -
q2 b a q1 a
請注意,我們創建了一個新狀態q2
,它與q0
有一個共同的規則,但沒有讀取a
的規則。 事實上,一旦我們開始讀b
S,我們不想讓更多的a
s到被讀取。 忽略規則將使自動機崩潰並拒絕字符串。
如果我們有許多准確的兩倍b
S作為a
S,我們會在狀態結束q2
沒有更多的輸入和一個空棧。 如果我們有額外的b
,我們需要一個規則來允許它們。 在狀態 q2 上添加一個自循環就足夠了:
Q i s Q' s'
-- -- -- -- --
q2 b Z q2 Z
綜合起來,這些狀態和轉換應該非常接近於您的語言的工作 PDA。 其他選擇是先編寫 CFG,然后應用算法將 CFG 轉換為 PDA,例如,自頂向下或自底向上解析器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.