計算機中的不可解問題——停機問題


一、概念

能否寫出一個程序,判斷其他程序是否會結束?

比如,求和函數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)觸發矛盾

  1. 假設self_root(self_root)會結束運行
    那么check_halt(self_root, self_root)返回true,self_root會進入死循環,不會結束,與假設矛盾
  2. 假設self_root(self_root)不會結束運行
    那么check_halt(self_root, self_root)返回false,self會結束,又與假設矛盾

綜上所述,check_halt不能寫出,所以停機問題是無解的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM