第462行: |
第462行: |
| 我们来分析一下D,它有一个输入参数z。D首先会调用H这个函数,并让H判断当源代码为z的程序Z作用到它自己源程序的字符串上是否会停下来。如果H(z,z)的返回为Yes, | | 我们来分析一下D,它有一个输入参数z。D首先会调用H这个函数,并让H判断当源代码为z的程序Z作用到它自己源程序的字符串上是否会停下来。如果H(z,z)的返回为Yes, |
| 也就意味着程序Z作用到自己的源代码z上会停下来,于是D开始进入一个死循环(中间的那两句:dowhiletrue…loop)。否则,D就退出去。 | | 也就意味着程序Z作用到自己的源代码z上会停下来,于是D开始进入一个死循环(中间的那两句:dowhiletrue…loop)。否则,D就退出去。 |
| + | |
| | | |
| 我们知道D是一个地道的计算机程序,没有任何毛病,只要我们能够定义出H程序,D就一定能够很好地工作。然而,当我们考虑把D作用到它自己的源代码d上的时候会怎样呢? | | 我们知道D是一个地道的计算机程序,没有任何毛病,只要我们能够定义出H程序,D就一定能够很好地工作。然而,当我们考虑把D作用到它自己的源代码d上的时候会怎样呢? |
| + | |
| | | |
| 我们来分析一下,首先,根据D函数的定义,D会调用H函数来判断D作用到d上是否会停机。假如H函数返回的结果是Yes,即断言D作用到d上会停机,那么D这个程序就会陷入一个死循环,而永远不能停机。反过来,假如H函数返回的结果是No,即断言D作用到d上不会停机,那么D就会马上返回来,停机。因此,也不对。这样,无论H(q,q)的答案是yes还是no,都会得到矛盾的结果。于是,我们不得不放弃一开始的假设,所以H这样能判断任意的程序作用到某个数据上是否停机的程序是不存在的。 | | 我们来分析一下,首先,根据D函数的定义,D会调用H函数来判断D作用到d上是否会停机。假如H函数返回的结果是Yes,即断言D作用到d上会停机,那么D这个程序就会陷入一个死循环,而永远不能停机。反过来,假如H函数返回的结果是No,即断言D作用到d上不会停机,那么D就会马上返回来,停机。因此,也不对。这样,无论H(q,q)的答案是yes还是no,都会得到矛盾的结果。于是,我们不得不放弃一开始的假设,所以H这样能判断任意的程序作用到某个数据上是否停机的程序是不存在的。 |
| + | |
| | | |
| 我们看到,这里面关键的一步主要在于将D这个程序作用到它自己的源代码d上的时候,这就是自指发生的时刻。无论如何,程序D(d)所发生的情形都会与H的判断正好相反, | | 我们看到,这里面关键的一步主要在于将D这个程序作用到它自己的源代码d上的时候,这就是自指发生的时刻。无论如何,程序D(d)所发生的情形都会与H的判断正好相反, |
| 这相当于一种二律背反,自指悖论的破坏性让我们不得不否认H函数的存在性。 | | 这相当于一种二律背反,自指悖论的破坏性让我们不得不否认H函数的存在性。 |
| + | |
| | | |
| 让我们再回过头来分析一下D这个函数,它其实包含了两部分,第一部分是计算H(z,z)的结果,也就是判断将函数Z作用到它自身的源代码z上的时候,即Z(z)是否会停机。如果 | | 让我们再回过头来分析一下D这个函数,它其实包含了两部分,第一部分是计算H(z,z)的结果,也就是判断将函数Z作用到它自身的源代码z上的时候,即Z(z)是否会停机。如果 |
| 我们将一个程序X作用到它自身的源代码x这个特殊的事件编码为"X(x)",并定义一个叫做蒯恩的计算机程序产生这样的编码,也就是定义: | | 我们将一个程序X作用到它自身的源代码x这个特殊的事件编码为"X(x)",并定义一个叫做蒯恩的计算机程序产生这样的编码,也就是定义: |
| + | |
| | | |
| <div style="text-align: center;"><math>Q(x):=''X(x)''</math>;</div> | | <div style="text-align: center;"><math>Q(x):=''X(x)''</math>;</div> |
| | | |
| 那么,最终的判断H(z,z)又可以写成:H(Q(z))。所以实际上,D程序的第一部分就是将判断停机的函数H和蒯恩函数Q放到一起并同时作用到代码z上面。 | | 那么,最终的判断H(z,z)又可以写成:H(Q(z))。所以实际上,D程序的第一部分就是将判断停机的函数H和蒯恩函数Q放到一起并同时作用到代码z上面。 |
| + | |
| | | |
| 程序的第二部分则是一个取反的操作,也就是如果H(z,z)判断为yes,程序就进入死循环,如果判断为no,程序就退出。而在证明的最后一步,将D作用到它的源代码d上面会产生什么情景?这个D(d)的操作恰恰能够实现自指悖论。有关图灵停机问题的详细解释请参看:[[图灵机与计算理论]]。我们将在下一小节看出这些自指技术的共同之处。 | | 程序的第二部分则是一个取反的操作,也就是如果H(z,z)判断为yes,程序就进入死循环,如果判断为no,程序就退出。而在证明的最后一步,将D作用到它的源代码d上面会产生什么情景?这个D(d)的操作恰恰能够实现自指悖论。有关图灵停机问题的详细解释请参看:[[图灵机与计算理论]]。我们将在下一小节看出这些自指技术的共同之处。 |