停机问题——感觉很有哲理的问题

来源:互联网 发布:javascript encodeuri 编辑:程序博客网 时间:2024/06/11 08:31
n一个很哲学的计算机问题:停机问题——
给定一个计算机程序和一个特定的输入,判断该程序是进入死循环,还是可以停机。
证明:(反证法)设停机问题有解,即:存在过程H(P,I)可以给出程序P在输入I的情况下是否可停机。假设若P在输入I时可停机,H输出停机,反之输出死循环,即可导出矛盾:

 显然,程序本身可以被视作数据,因此它可以被作为输入,故H应该可以判定当将P作为P的输入时,P是否会停机。所以我们设过程K(P)的流程如下:首先,它调用H(P,P),如果H(P,P)输出死循环,则K(P)停机,反之K(P)死循环。即K(P)做与H(P,P)的输出相反的动作。

 现在假设求K(K),则若H(K,K)输出死循环,K(K)停机,但由定义知二者矛盾。反之,H(K,K)输出停机,则K(K)死循环,两者一样矛盾。

 因此,H不是总能给出正确答案,故而不存在解决停机问题的方法。


 

设停机问题有解,即:存在过程H(P,I)可以给出程序P在输入I的情况下是否可停机。假设若P在输入I时可停机,H输出“停机”,反之输出“死循环”,即可导出矛盾:

显然,程序本身可以被视作数据,因此它可以被作为输入,故H应该可以判定当将P作为P的输入时,P是否会停机。所以我们设过程K(P)的流程如下:首先,它调用H(P,P),如果H(P, P)输出“死循环”,则K(P)停机,反之K(P)死循环。即K(P)做与H(P, P)的输出相反的动作。

伪代码表示如下

int H(procedure,Input); //这里的H函数有两种返回值,死循环 或 停机
int K(P)
{
    if (H(P,P) == 死循环){
       return  停机;
    }else{
       while(1){} //这里会死循环
    }
}

现在假设求K(K),则若H(K, K)输出停机,K(K)死循环,但由定义知二者矛盾。反之,H(K,K)输出死循环,则K(K)停机,两者一样矛盾。

因此,H不是总能给出正确答案,故而不存在解决停机问题的方法。[1]

另外还有两个本质上相似的悖论:

理发师悖论:村子里有个理发师,这个理发师有条原则是,对于村里所有人,当且仅当这个人不自己理发,理发师就给这个人理发。如果这个人自己理发,理发师就不给这个人理发。无法回答的问题是,理发师给自己理发么?

停机测试悖论:计算机里有个测试程序,这个测试程序的原则是,对于计算机里所有程序,当且仅当这个程序不递归调用自己(输出停机),测试程序就调用它(对应不停机)。如果这个程序递归调用自己(对应不停机),测试程序就不调用它(对应停机)。无法回答的问题是,测试程序递归调用自己么?

还有就是判断一个程序中是否包含计算机病毒



原创粉丝点击