
286
|
第 8 章
相當隱約且又高度敏感;如果將迴圈裡的
n = n - 1
陳述式改成
n = n - 2
,程式只會在
輸入長度為偶數時停止。知道 Ruby 和數值的所有事實,以及如何相互串連事實而對這
種程式做出準確決定,都需要大型且複雜的停機核對器。
根本的難題是很難預測程式不需實際執行而會完成什麼。以
#evaluate
執
行程式來瞭解它是否停止的確非常有吸引力,但這並不好:如果程式不停
止,
#evaluate
將會永遠執行,但無論我們等待多久,都無法從
#halts?
得
到答案。任何可靠的停止檢測演算法,都必須找到一種能在有限時間內以
檢閱和分析程式本文產生最終確定答案的作法(而非只是執行和等待)。
絕對無法運作的狀況
好的,所以我們的直覺告訴我們
#halts?
將難以正確實作,但並不一定意謂著停機問
題就是無法決定。事實證明只要給予足夠的努力和才能,許多困難的問題(例如編寫
#evaluate
)都就可以迎刃而解;如果停機問題是無法決定的,那就意謂著編寫
#halts?
不僅是極端困難,而且根本
不可能
。
我們怎麼知道適當的
#halts?
實作物不可能存在?如果這只是工程問題,為什麼我們不
將諸多的程式開發人員對著它丟過去,並在最後提出解決方案呢?
難以置信
讓我們暫時假裝停機問題是可以決定的。在這個虛構的世界,可以編寫出完整的
#halts?
實作物,因此呼叫
halts?(program, input)
勢必回到任何
program
和
input
的
true
或
false
的答案,而且如果在標準輸入以
input
執行它,這個答案必能正確預測 ...