使用C++構建用於語言L = {0m1(n+m)2n | m,n = 0} 的下推自動機


我們給定了一種語言“L”,任務是為給定的語言構建一個下推自動機,它解釋了1的出現次數將是0和2的出現次數之和,並且0和2的出現次數至少為1,也可以使字串為空,並且它應該被自動機接受。

什麼是下推自動機?

下推自動機或PDA是一種以類似於我們為正則語法設計確定性有限自動機或DFA的方式實現上下文無關語法的技術。DFA可以操作有限資料,但PDA可以操作無限資料。我們可以將下推自動機理解為“有限狀態機”和“堆疊”的組合。

下推自動機具有三個組成部分:

  • 一個輸入帶,

  • 一個控制單元,以及

  • 一個無限大小的堆疊。

PDA可以正式描述為一個7元組(Q, Σ, S, δ, q0, I, F):

  • Q是有限數量的狀態

  • Σ是輸入字母表

  • S是堆疊符號

  • δ是轉移函式:Q × (Σ υ {ε}) × S × Q × S*

  • q0是初始狀態(q0 Ε Q)

  • I是初始堆疊頂部符號(I Ε S)

  • F是一組接受狀態(F Ε Q)

讓我們為給定的語言構建一個下推自動機

該PDA可接受的字串形式為:

  • 0m1m - 01, 0011, 000111等。0的個數等於1的個數。當n為0時,我們將沒有2。持續壓入0,一旦遇到第一個1,則彈出0。如果我們到達字串的末尾並且沒有剩餘的0,則接受該字串。

  • 1n2n - 12, 1122, 111222等。1的個數等於2的個數。當m為0時,我們將沒有0。持續壓入1,一旦遇到第一個2,則彈出1。如果我們到達字串的末尾並且沒有剩餘的1,則接受該字串。

  • 0n1m+n2m - 0112, 001112, 001112等。1的個數等於0和2的個數之和。持續壓入0,一旦遇到第一個1,則彈出0,直到沒有剩餘的0。現在再次壓入1,直到遇到第一個2。然後,對於每個2,開始彈出1,直到我們沒有剩餘的1。如果我們到達末尾並且沒有剩餘的1,則接受該字串。

  • 空字串也被接受。001020

讓我們瞭解一下機器

  • 狀態q0的轉移:

    • ( 0, I/0I ) - 如果堆疊頂部為I且當前輸入符號為0,則將0壓入堆疊頂部並保持在q0。堆疊變為0I...

    • ( 0, 0/00 ) - 如果堆疊頂部為0且當前輸入符號也為0,則將0壓入堆疊頂部並保持在q0。堆疊變為00.... 持續壓入0,直到下一個1或2。

    • ( 1, I/1I ) - 如果堆疊頂部為I且當前輸入符號為1,則將1壓入堆疊頂部並移動到q1。堆疊變為1I...

    • ( 1, 0/$ ) - 如果堆疊頂部為0且當前輸入符號為1,則彈出0並移動到q1。

    • ( 1, 0/$ ) - 如果堆疊頂部為0且當前輸入符號為1,則彈出0並移動到q1。

  • 狀態q1的轉移:

    • ( 1, 1/11 ) - 如果堆疊頂部為1且當前輸入符號也為1,則將1壓入堆疊頂部並保持在q1。堆疊變為11.... 持續壓入1,直到下一個0或2。

    • ( 1, 0/$ ) - 如果堆疊頂部為0且當前輸入符號為1,則彈出0並保持在q1。

    • ( $, I/I ) - 如果堆疊頂部為I且沒有輸入,則不執行任何操作並移動到qf。

    • ( 2, 1/$ ) - 如果堆疊頂部為1且當前輸入符號為2,則彈出1並移動到q2。

  • 狀態q2的轉移:

    • ( 2, 1/$ ) - 如果堆疊頂部為1且當前輸入符號為2,則彈出1並保持在q2。

    • ( $, I/I ) - 如果堆疊頂部為I且沒有輸入,則不執行任何操作並移動到qf。

更新於: 2021年1月7日

482 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告

© . All rights reserved.