簡體   English   中英

如何構造n(a)小於或等於2n(b)的PDA

[英]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.

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