停機問題的誤解

2021-09-26 08:02:12 字數 2047 閱讀 3067

停機問題(halting problem):是否存在這樣乙個程式,他能判斷任意程式在輸入確定的情況下是否為死迴圈。

可以用while(true)表示死迴圈,構造例子如下:

判斷(輸入)

假設有兩個程式:

a()

b()

那麼:

判斷(a)

== 停機

判斷(b)

== 死迴圈

現在問題就是:是否存在這樣乙個判斷程式?

先構造乙個相反函式,也就是輸入停機,我就不停機,輸入不停機,我就停機

相反(輸入)

然後用自身作為輸入:

相反(相反)

這樣的話:

判斷相反是停機

但是相反(相反)執行結果卻是死迴圈

判斷相反是死迴圈

但是相反(相反)執行結果卻是停機

不管怎樣,都會產生矛盾

上述解法真的矛盾嗎?我們再來重新看下問題:

能判斷任意程式在給定輸入的情況下能否執行完畢。

來看乙個測試程式:

test

(input)

很明顯:

test(1)執行結果是停機

test(2)執行結果是死迴圈

沒錯,問題就出在輸入身上,當然,這不是輸入有沒有的問題,而是輸入是否一致。

如果沒有輸入,我們可以認為輸入是

輸入的內容不同,結果當然不同了。

所以不能單純的說test是不是死迴圈,要看給的輸入是什麼樣。

相反(相反)

所以說,相反(相反)的輸入是相反

而判斷的相反函式是沒有輸入的,或者說輸入是

所以結果不矛盾。

說道這裡有的朋友可能會想了,如果判斷(相反(相反))呢?

那實際函式就是相反(相反(相反))了,引數還是不一樣,永遠比你多一層。

這麼看問題似乎有點無解,那正確解法是什麼?

說明:

偽**做了一些簡化,但是可能會造成一些歧義,相反(相反)這種表示方法有點繞,看起來也不像是迭代,程式可以這樣呼叫自身嗎?當然可以,你可以把外面的輸入理解成函式,裡面這個相反理解函式本身的**。假設有乙個列印函式可以列印函式的源**,那他可以列印自身嗎?當然也是可以的,這就是列印(列印)

正解其實很簡單,是我們構造的函式有問題,我們再構造乙個正解函式

正解(輸入)

這樣的話,用正解帶入輸入

正解(正解)

這樣的話矛盾就顯而易見了,判斷(正解(正解)) == 停機

正解(正解)的實際執行結果卻是死迴圈。

如果停機問題能被解決,我們就可以解決大部分數學證明,但是能判斷所有**是否停機的程式是不存在的,況且也沒什麼太大的意義。因為從實用角度看,我們很少會寫這麼奇怪的**,但是判斷部分簡單**還是可以的,這樣也能幫助程式設計師寫出更加健壯的**。

停機問題 The Halting Problem

看停機問題時,覺得它跟我國的 以子之矛攻子之盾 的想法很相似 也跟c語言的struct內不能包含自身很相似 停機問題描述 是否存在這樣的一段 h,這段 h以任意的 p作為輸入,它判斷 p在執行的過程中是否會停止。如果 p在執行的過程中會一直執行下去,不會停止,則程式h輸出 loop 反之,如果 p在...

停機問題的理解

關於停機問題維基百科給出的定義是 停機問題 halting problem 是邏輯數學中可計算性理論的乙個問題。通俗的說,停機問題就是判斷任意乙個程式是否會在有限的時間之內結束執行的問題。該問題等價於如下的判定問題 給定乙個程式 這個問題的結論是乙個可以解決停機問題的通用演算法是不存在的。問題倒是很...

停機問題 哥德爾定理

今天讀 哥德爾 艾舍爾 geb 集異璧之大成 看到 自指 的論述,突然想起以前學自動機理論時的 停機問題 該問題上課前看書就看明白了,考試完了又忘了,後來又想起來看過一次,現在又忘了 可見,我是不懂裝懂。我之前其實沒搞明白 怎麼這麼乙個程式h2,當作 輸入p給另乙個h2後,它的存在性還受到另乙個它的...