[英]Pda for the language of all odd-length words and even-length non-palindromes
我想要這種語言的掌上電腦
L = (a|b)* - {wwR: W 在 {a,b}*}
我們的策略如下:
所有奇數長度字符串的語言的 PDA 有兩個狀態並且不使用堆棧; 它在 a 或 b 上從最初的非接受 state 移動到接受 state,然后在后續的 a 或 b 上回到最初的 state。
偶數長度非回文語言的PDA可以通過修改{a,b}上偶數長度回文的PDA得到。 考慮這個用於偶數長度回文的簡單 PDA:
q S s q' S'
q0 x a q0 ax
q0 x b q0 bx
q0 x - q1 x
q1 a a q1 -
q1 b b q1 -
q1 Z - q2 Z
讀取這些產生式的方法是這樣的:從 state q 開始,堆棧頂部有符號 S(其中 x 是任何符號的簡寫),移動到輸入 s 上的 state q'(或空/epsilon-/lambda 轉換)在 -) 的情況下並用 S' 更新最頂層的堆棧符號(或者在 - 的情況下將其刪除)。
這保證了無論我們從堆棧中讀取 a 和 b 的什么字符串,如果我們要到達 state q2(接受狀態),我們必須將其向后彈出。
現在,偶數長度的非回文在某些時候根本無法通過此測試。 因此,我們可以讓 q2 不接受,添加一個新的 state q3,並在檢測到不匹配時允許 state q2 到 go 到 q3。 然后,我們需要做的就是在 q3 中確認它確實是一個不匹配(通過每次我們從輸入中消耗一個符號時從堆棧中彈出一個符號)然后我們將在 q3 中接受一個空堆棧。
q S s q' S'
q0 x a q0 ax
q0 x b q0 bx
q0 x - q1 x
q1 a a q1 -
q1 b b q1 -
q1 a b q3 -
q1 b a q3 -
q1 Z - q2 Z
q3 a x q3 -
q3 b x q3 -
以空堆棧結束 q3 的唯一方法應該是你正在查看一個偶數長度的非回文。 偶數長度來自壓入 n 個符號然后彈出 n 個符號,並且不是回文是通過從 q1 到 q3 的轉換以及 q3 然后清空堆棧並以相同速率消耗剩余輸入這一事實來保證的。
編輯:忘記描述如何制作組合式 PDA
要制作組合的 PDA,請使用上面為偶數長度非回文導出的一個,以及為奇數長度單詞使用的這個:
q S s q' S'
q5 x y q6 x
q6 x y q5 x
這里,x 和 y 是通配符,q6 是接受。
然后,只需制作一個非確定性 PDA,它首先分支到一個或另一個:
q S s q' S'
q7 Z - q5 Z
q7 Z - q6 Z
現在,q7 將是組合 PDA 的初始 state,如果堆棧為空且輸入已耗盡,則 PDA 將接受狀態 q3 或 q6。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.