簡體   English   中英

下推自動機構造

[英]Pushdown Automata Construction

如何構建一個接受該語言的 PDA:

( {a^ib^kba^i | i>=0,k>0}) 

要獲得這種語言的 PDA,我建議分別為聯合中的每種語言編寫兩個 PDA,然后不確定地跳轉到一個或另一個 PDA。

為 a^(2n) 獲得一個 PDA | n > 0,我們只需要保證a的個數是偶數; 這是一種常規語言,因此 DFA 就足夠了(DFA 只是一個 PDA,它不會對堆棧做任何有趣的事情)

       /---a---\         state    stack    input    state'    stack'
       |       |         q0       Z        a        q1        Z
       V       |         q1       Z        a        q0        Z
----->q0--a-->q1

要為另一個 PDA 獲取 PDA,我們看到正面和背面的 a 的數字必須匹配; 為此,我們需要堆棧。 我們可以讓PDA推送它讀取的a,直到它看到第一個c; 然后我們可以讓它讀取 c,然后是至少一個 d,然后是另一個 c,最后是我們之前推送的相同數量的 a:

state    stack    input    state'    stack'    comment
q0       x        a        q0        ax        push a's until we see a c
q0       x        c        q1        x         read the required c
q1       x        d        q2        x         read the required d
q2       x        d        q2        x         read as many d as needed
q2       x        c        q3        x         read the 2nd required c
q3       ax       a        q3        x         pop a's until we run out of input
q3       Z        q4       Z         Z         accept on empty stack+state

要連接這些,您只需將第一個狀態重命名為 q0' 和 q1',然后添加一個新的開始 state q0'',其工作方式如下:

state    stack    input    state'    stack'    comment
q0''     Z        -        q0        Z         guess we're going to the 2nd PDA
q0''     Z        -        q0'       Z         guess we're going to the 1st PDA

至於你的第二個問題:

  1. 假設我們有一個 PDA 接受最終 state 但不一定是空堆棧; 也就是說,如果 PDA 在最終狀態中沒有輸入,它會接受,否則它會拒絕。 我們可以添加一個新的 state,使其成為唯一的接受狀態,並將所有先前接受狀態的空轉換添加到它。 這個新的 state 可以對自身進行空轉換,僅用於清除堆棧而不消耗任何額外的輸入。 這個結構表明,如果我們可以單獨通過最終 state 接受,我們可以通過最終 state 和空堆棧一起接受。

  2. 假設我們有一個 PDA 通過空堆棧接受但不一定是最終的 state; 也就是說,如果 PDA 在堆棧為空的同時用完輸入,則 PDA 接受。 添加一個新的 state 並將 PDA 中的所有狀態轉換到空堆棧上的它。 讓這個 state 接受並且不給它任何轉換。 PDA 將崩潰,除非輸入已經用盡,並且只有在堆棧也為空時才能到達。 這個結構表明,如果我們可以單獨通過空堆棧接受,我們可以通過空堆棧接受和同時接受 state。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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