停機問題 The Halting Problem

2021-05-25 14:47:53 字數 1143 閱讀 5111

看停機問題時,覺得它跟我國的「以子之矛攻子之盾」的想法很相似

也跟c語言的struct內不能包含自身很相似

停機問題描述:是否存在這樣的一段**h,這段**h以任意的**p作為輸入,它判斷**p在執行的過程中是否會停止。如果**p在執行的過程中會一直執行下去,不會停止,則程式h輸出「loop」;反之,如果**p在執行的過程中會停止,即**p執行一段時間之後,**p執行結束了,那麼程式h輸出「halt」

例如:

//不會停止,一直執行的程式

#include

int main()

while(x0!=x1);

return 0;

} //執行一段時間之後會停止的程式

#include

int main()

while(x0

return 0;

} 停機問題說明不存在具有上述功能的**h,證明如下:

假設存在具有這樣功能的**h,我構建一段如下所示的**k,**k也以任意**作為輸入

function k( code p)

if ( h(p) == 『loop』)

return;

else

while(1);

**k具有這樣的功能,如果輸入的**p不會停止( if  (  h(p) == 『loop』 )),那麼**k直接返回,反之**k一直執行

那麼我現在讓**k自己作為**k的輸入,即 k( k ),矛盾就出現了

為了方便敘述,將 k( k ) 寫成 k1( k2 )

如果k1( k2 )一直在執行,那麼說明k2會返回,而k2本身就是k1。k1一直執行,k2會返回,而k1就是k2,矛盾;反之亦然

停機問題的出發點是為了提出一種萬能演算法。

x+1 和 x-1 均為質數的稱為孿生質數,例如 3 和 5

現在我寫乙個程式,它一直對外輸出孿生質數。現在用h來判斷這個程式是」loop」 還是」halt」,如果為」loop」,則說明不存在最大孿生質數,反之則說明存在最大孿生質數

上面的說法有個矛盾的地方,就是這個一直對外輸出孿生質數的程式應該怎麼寫?

程式的大體結構似乎是這樣的:

while(true)

關鍵是這個「最大孿生質數」如何判斷?

不解?

停機問題的理解

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

停機問題的誤解

停機問題 halting problem 是否存在這樣乙個程式,他能判斷任意程式在輸入確定的情況下是否為死迴圈。可以用while true 表示死迴圈,構造例子如下 判斷 輸入 假設有兩個程式 a b 那麼 判斷 a 停機 判斷 b 死迴圈現在問題就是 是否存在這樣乙個判斷程式?先構造乙個相反函式,...

停機問題 哥德爾定理

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