不可判定性與停機問題
計算中的自我指涉(self-reference in computation)
自我指涉是指一個程式談論、或被餵入它自己的描述。聽起來很奇異,其實很日常:編譯器是處理程式的程式,防毒軟體掃描可執行檔,而 quine 是會印出自己原始碼的程式。停機證明那股驚人的力量,正來自讓一個程式問「關於它自己」的問題,再對答案做出反應。這個回授迴圈把一個無辜的假設變成了矛盾。
為什麼自我指涉根本可能?因為程式不過是符號字串,而字串可以當成普通資料交給另一個程式。所以「用 M 自己的程式碼當輸入來執行機器 M」——寫成 (M, M)——並沒有任何障礙。這正是對角線法核心的那一步:我們造一台機器 D,去詢問一個被假設的停機判定器關於「D 跑 D」的結果,然後故意與預測唱反調。這台機器在推理自己未來的行為,再去破壞它。之後的遞迴定理會讓這件事嚴謹化,保證任何機器都能取得並使用自己的描述。
同樣的模式在邏輯與電腦科學中反覆出現:Cantor 的對角線序列與「被列出的自己」不同,Gödel 的不完備句說「我無法被證明」,說謊者句說「我是假的」。每一例中,系統都豐富到能描述自己的陳述,而正是這份豐富,讓我們能建構一個沒有任何一致答案能釘住的自我指涉物件。對程式設計師的教訓很令人謙卑:正因為我們的語言強大到能把程式碼當資料來操弄,它們也就強大到能對自己提出沒有任何程式能解決的問題。
quine:一個輸出就是自己原始碼的程式——這是「程式碼能攜帶並複製自己描述」的具體證明。停機證明用的是同一種能力,只是用來與預測者唱反調,而非複製自己。
因為程式即資料,一台機器能在自己的程式碼上執行——這是每個對角線論證的樞紐。
自我指涉不是該被禁止的邏輯臭蟲。它是一種健全、定義良好的能力;它造出的矛盾是真正的定理,而非語言的故障。
又稱
另見