基礎:字母表、字串與語言
把問題視為語言(a problem as a language)
這是讓單一理論能一次談論所有計算問題的那個關鍵技巧。它的想法是把任何是非題改寫成「這個字串在這個集合裡嗎?」。你把每個可能的輸入編碼成一個字串,並把所有答案為「是」的輸入收進一個集合。那個集合就是該問題的語言。於是解決問題就等於識別這個語言:對任何輸入字串,判斷它是否屬於。
具體而言,取一個是非題,固定一種把每個實例寫成某字母表上字串的方式。該問題的語言就是所有編碼了「是」實例的字串的集合。例如「這個數是質數嗎?」變成語言 {質數的二進位編碼};「這個圖有環嗎?」變成(編碼了)有環的圖的語言。一台機器解決該問題,恰好是:給定編碼後的字串,它接受「是」實例、拒絕「否」實例。編碼細節(如何把圖或數轉成符號)假設是合理的,通常略過不談,因為它們不改變什麼是可解的。
為什麼堅持這種改寫?因為它把天差地遠的問題統一成同一個形狀,使得單一的機器概念、單一的接受概念、單一的難度階層就能涵蓋它們全部。兩點誠實提醒。第一,這個框架天然契合決定(是非)問題;要求產生輸出的問題(如「把這串排序」)需要一個相關但略有不同的設置,使用轉換器。第二,編碼必須合理:刻意浪費的編碼會扭曲複雜度的量測,這正是理論假設「合理編碼」的原因。
問題:w 是回文嗎?把每個候選字串直接編碼。其語言是 PAL = { w 在 Σ* 中 : w = w^R }。能識別 PAL 的機器正是回文檢查器;w 被接受當且僅當答案為是。
一個是非題變成它所有「是」實例構成的語言。
這對決定(是非)問題運作得很乾淨。要計算輸出的問題需要轉換器。編碼假設合理;荒謬的編碼可能扭曲難度。
又稱
另見