目錄
一、概念
能否寫出一個程序,判斷其他程序是否會結束?
比如,求和函數sum計算[1,2],check_halt(sum, [1, 2])應該返回true
雖然我們特別想要這樣的功能,讓我們提前做災備工作,避免重大的程序風險,但是這是一個不可解的問題,可以用反證法來證明。
什么是反證法?
就是先假設“命題的否定形式”成立,再根據假設推導出矛盾的結果駁倒假設。
舉個例子:證明“不存在最大的正整數”。
這個問題一般人會覺得你無聊吃飽了撐着,只會傻不拉幾的說:“這TM不是常識嗎?這還用證明?”
No,科學是要證明的,你覺得正常的東西不一定就是可驗證的真理。
我們用反證法證明一下:
1. 假設“存在最大的正整數”,這個數為M
2. 那么M+1比M大,這與假設矛盾
所以,“不存在最大的正整數”
二、反證法證明
1. 假設能寫出停機函數check_halt(program, params)
如果能停止,返回true;如果不能停止,返回false
以下是偽代碼
def check_halt(program, params):
return True Or False
2. 定義一個調用了check_halt並會觸發死循環的函數self_root
如果check_halt(program, program)返回true,就進入死循環;
如果check_halt(program, program)返回false,就返回0
def self_root(program):
if check_halt(program, program):
while True:
# 如果停機就進入死循環
pass
else:
return 0
注意:check_halt的兩個參數都是program
3. self_root(self_root)觸發矛盾
- 假設self_root(self_root)會結束運行
那么check_halt(self_root, self_root)返回true,self_root會進入死循環,不會結束,與假設矛盾 - 假設self_root(self_root)不會結束運行
那么check_halt(self_root, self_root)返回false,self會結束,又與假設矛盾
綜上所述,check_halt不能寫出,所以停機問題是無解的