? Turing著名的停機定理說明無法用有限時長的算法判定任意的計算機程序是否停機產生確定輸出,這意味著你無法將某些永不停機的程序和其實會在等待時間后才停機的區分開來,人們或可主張這結果意義不大——畢竟運行時間太長的程序和不停機實踐上也沒啥區別。然而,Rice定理來指出“事情沒那么簡單”:停機定理中的“停機”可以被替換成任何只跟功能有關的性質,結果一樣是不可判定的。
? 例如:一段程序是否是破壞系統文件的計算機病毒就是不可判定的,跟停機問題是同樣意義上的不可判定。使用停機定理來證明計算機“比人類無能”的反AI論者運行殺毒軟件時身體可是很誠實——如果你覺得不可判定類問題人比機器更擅長的話,你為什么不自己扒代碼而是讓另一個計算機程序(殺毒軟件)來嘗試識別病毒呢?根據Rice定理,對方完全可以具有你的殺毒軟件識別不了的破壞功能。
? 判定病毒為何與判定停機等價?這就要從Rice定理的具體證明說起,我們首先定義何為只跟功能有關的性質:兩個程序作用于同一數據若總是產生相同的運行結果(都不停機或都停機在相同輸出),則稱兩者功能相同。一個程序的性質F如果滿足以下兩點:
(1)程序P具有F當且僅當所有功能相同的程序都具有F。
(2)具有/不具有F的程序各至少存在一個(這排除了所有程序無論功能如何都具有/不具有F的平凡情況)。
則稱性質F只跟程序功能有關,或稱F是功能性的。顯然,“會破壞系統文件”“病毒性”就是功能性的。
Rice定理是這樣處理的,假定可以判定任意程序是否具備F,那么對任意程序A都可以通過判定下列構造的A1和A2來求解A是否停機:
A1:每個循環中仿真運行A常數步,在循環末尾檢驗A是否已進入(仿真的)停機態,否則繼續循環,是則清零并執行G1.
A2:每個循環中仿真運行A常數步,在循環末尾檢驗A是否已進入(仿真的)停機態,否則繼續循環,是則清零并執行G2.
G1:任一已知具有F的程序。G2:任一已知不具有F的程序。功能性的定義(2)自然要求了G1和G2都存在,所以上述構造是可行的。
若A停機,則A1與A2功能分別等同于G1與G2,故判定結果應各是具有/不具有F,結果不同。
若A不停機,則A1與A2都會被卡在仿真運行A的無限循環上,因為仿真的停機態永不會被訪問。功能相同,故結果相同。