[英]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
至於你的第二個問題:
假設我們有一個 PDA 接受最終 state 但不一定是空堆棧; 也就是說,如果 PDA 在最終狀態中沒有輸入,它會接受,否則它會拒絕。 我們可以添加一個新的 state,使其成為唯一的接受狀態,並將所有先前接受狀態的空轉換添加到它。 這個新的 state 可以對自身進行空轉換,僅用於清除堆棧而不消耗任何額外的輸入。 這個結構表明,如果我們可以單獨通過最終 state 接受,我們可以通過最終 state 和空堆棧一起接受。
假設我們有一個 PDA 通過空堆棧接受但不一定是最終的 state; 也就是說,如果 PDA 在堆棧為空的同時用完輸入,則 PDA 接受。 添加一個新的 state 並將 PDA 中的所有狀態轉換到空堆棧上的它。 讓這個 state 接受並且不給它任何轉換。 PDA 將崩潰,除非輸入已經用盡,並且只有在堆棧也為空時才能到達。 這個結構表明,如果我們可以單獨通過空堆棧接受,我們可以通過空堆棧接受和同時接受 state。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.