非確定型有限自動機(NFA)

把非確定性當作設計工具(nondeterminism as a design tool)

退一步看,整章的實際心得很簡單:把非確定性當作一種「思考與設計的工具」,而不是一種硬體。當一個語言被自然地描述成「某處存在樣式 X」,或「這是把這些片段黏起來造的」時,NFA 或 ε-NFA 讓你幾乎可以一字不差地把那個描述寫下來——猜 X 在哪,或用 ε 把片段黏起來——然後信任機器的存在式接受規則去把剩下的事辦好。

這樣使用時,非確定性是一具「清晰引擎」。你設計出小而可讀的 NFA;你用「猜測並驗證」或「平行路徑」的圖像去推理它;只有在你需要確定型實作時,才跑子集構造法把它編譯成 DFA——並接受 DFA 可能更大。許多真實系統內部正是這麼做的:正規表示式引擎、詞法分析器(掃描器)與協定檢查器,常常先以 NFA 規格化,再加以確定化或模擬。這份便利是真實的,而且天天在用。

但這件工具附帶一張標籤,而那張標籤正是收尾本章的誠實主題:這種猜測總是能被模擬掉。對有限自動機而言這是一條定理(子集構造法),其代價最壞是大小上的指數、但絕不是表達能力上的,而且非確定性既不隨機也不免費。請把「我能不能就猜一猜再驗證?」這個習慣帶著走——因為到了 NP 的層級,完全相同的這個問題會變成這個領域最深的未解難題,那裡我們「還不知道」這種猜測是否總能被廉價地移除。

為掃描器規格化一個詞符,例如「註解從 /* 開始到 */ 結束」:寫一個猜「結尾的 */ 在哪裡」的小 NFA,遠比手工打造確定型狀態機容易。正規表示式工具會把你的樣式編譯成 NFA,再加以確定化或模擬——你既享有猜測的便利,也得到一台可以實際執行的確定型機器。

用猜測來設計,再編譯成確定型——同一份便利,到了 NP 的層級,會成為一個深刻的未解問題。

對有限自動機,猜測可被證明能移除(子集構造法)。不要在別處一概假設如此——在 NP 的層級,猜測能否被廉價移除尚屬未知(P 對 NP)。

又稱
nondeterminism as a descriptive device非確定性作為設計工具