系统中的观察者(5)——自指

来自集智百科 - 复杂系统|人工智能|复杂科学|复杂网络|自组织
跳到导航 跳到搜索


  • 作者:jake
  • 时间:2010-02

自指——连接图形与衬底的金带

在第二章《基本框架》中,我们曾对生命的本质进行过简单的探讨。按照第二章的说法,“那些可以被形式因和目的因解释的系统就具备智能和生命”。然而,这个答案仍然有些简单粗暴。观察者为什么凭白无故地将因果箭头转向?

在上一章《人工智能中的背景——玩家观察者》中,我们指出构建图灵机-观察者模型的一个重要目标就是要让计算机程序能够利用玩家的交互资源而不断地构建越来越深的虚拟层次。然而,计算机程序是如何构建虚拟层的?

所有这些问题都集中到一个古老而意义深远的名词:自指(Self-reference)。

本章的叙述框架如下:首先,在第1节中我们将简单回顾自指问题在数理逻辑、计算科学中的研究历史;其次,在第2节,我们专门论述了自然语言中的自指现象。这一节对整个章节的理解都至关重要,因为本节利用人们熟悉、容易理解的自然语言将后续部分自指中的所有关键概念、方法都概括了。所以,我希望读者能够花大力气搞懂这一小节,尤其是要透彻理解用蒯恩技术实现的间接自指,它是整个章节的精髓;然后,第3节主要介绍“自打印程序”,并试图用该程序说清建构性自指的概念;随后的第4节则将建构性自指升级,我们开始讨论递归定理,它被我称为“未开采的科学金矿”;第5节利用图灵停机问题和歌德尔定理(可跳过)作为实例介绍破坏性自指,我们将着重介绍蒯恩技术和自指悖论的构建方法;第6节将从另一个角度:“黄金对角线”,把第3、4、5节的主题重新论述一遍(此节可跳过),你会看到原来自指还可以有“几何表示法”;可以说前6节全部是在介绍有关自指的具体技术,只有到第7章才开始论述观察者与自指的关系。上一章提出的图灵机-观察者模型将会在这里重新发挥作用;第8节则进一步将观察者与自指的关系提升到因果逆转的高度,并从深层次指出生命的本质就在于这种因果逆转;最后,第9节对全章进行小结。

自指——一条永恒的金带

自指是一个非常古老的话题,它通常与古代奥义以及各种神秘哲学有关。例如佛教中所提倡的“观身无常、观心无我”,以及古希腊的“认识你自己”,都在劝解人们能够将心智的观察箭头指向自己。中国道家所倡导的“无”,正是一个最简单的一字悖论。

图5-1、自噬的蛇

一幅最能体现自指深邃含义的图画莫过于这条正在吞噬自己的蛇。此蛇作为一种图腾曾广泛出现在北欧神话、基督教神学、印度教和非洲宗教之中。这条蛇将自指那种深刻的自我毁灭性体现得淋漓尽致——我们可以想象一下当它把自己吞噬完毕会产生怎样怪异的情景。

将这种自我毁灭性的古代奥义应用到现代科学中已经产生了一系列深刻的结论。首先,在19世纪末,著名数学家康托尔(George Cantor)将“对角线删除”法则应用到集合论中,从而证明了实数的个数比自然数多。紧接着,罗素(Bertrand Russell)提出了著名的“罗素悖论”而摧毁了弗雷格(Gottlob Frege)的数学大厦。年仅25岁的哥德尔(Kurt Gödel)巧妙地应用同样的破坏性自指一举摧毁了数学大师希尔伯特(David Hilbert)的完备一致性的数学体系梦想。图灵(Alan Turing)则利用同样的技巧进一步发现任何超级计算机都不可能求解的图灵停机问题

纽约时报曾将哥德尔不完备定理评价为20世纪最伟大的数学定理。自指可以用来构造破坏性的悖论已经是众人皆知、司空见惯了。然而,这种认识其实很片面。自指包含了比自指悖论更宽泛的内容,因为在自指大家庭中,还包括另外一类构建性的成员。

1953年,正当人们举杯欢庆沃森和克里克发现了DNA双螺旋结构,并从分子层面上解释了生命的自我复制之谜的时候,另外一名伟大的美国匈牙利裔数学家:约翰.冯诺依曼(John von Neumann)正在独立地思考着生命自我复制的逻辑基础。然而,令人遗憾的是,那时的冯诺依曼已经患上了癌症,并于1957年的2月去世。于是,他的助手阿瑟.伯克斯Arthur Burks将他关于自复制自动机理论的整理成书《Theory of Self-reproducing Automata》,并于1966年出版。

与沃森.克里克不同的是,冯诺依曼要寻找的是生命自我复制的逻辑基础而非物质基础。虽然冯诺依曼没有明确指出,但是已经暗含了这个自复制的逻辑基础不是别的,正是一种自指结构。也就是说,自指恰恰是生命实现自我复制的逻辑内核。这也许会让读者感到困惑。不是说,自指都是用来构造诸如哥德尔定理、罗素悖论之类的破坏性武器吗?实际上,还存在着另外一大类自指,笔者称之为“建构性的自指”,它不但不会引起破坏,反而能够创造很多令人意想不到的惊奇结构。至于自我繁殖的系统是如何令人意想不到的,请参考第4节的讨论。

实际上,早在1938年,与哥德尔共同奠定递归函数论基础的数学家克林尼(Stephen Kleene)就证明了递归函数论中的一个著名定理:递归定理(更精确地说,应该叫Kleene第二递归定理)。根据它,人们可以很轻松地得到一个数学推论,系统的自我复制是可能的。

证明递归定理的核心技巧,是一个被称为“蒯(kuai3)恩”的特别技术。蒯恩(Willard.V. Quine)是美国的哲学家,终身致力于哲学、数理逻辑、集合论的研究。他创造了一种称之为蒯恩的方法,使得人们可以不通过使用“我”或者“这句话”等词语就能创造出可以谈论自身的句子来。

有趣的是,蒯恩构造恰恰就是那条“黄金对角线”(这一方法正是当年康托尔最早提出证明实数比自然数多的方法,也是哥德尔定理构造哥德尔句子的关键技术)。只不过,康托尔、哥德尔等人的对角线与蒯恩的对角线方法稍有不同。我们会在第6节中详细地讨论这些技术。

总而言之,从宗教到科学,从悖论到自复制,自指是贯穿始终的主题。正如《哥德尔、艾舍尔、巴赫》这本书指出的那样,自指是一条永恒的金带。

语言中的自指

提到自指,很多读者马上就会联系到那句臭名昭著的悖论句子:

这句话是错的

这句话之所以让人讨厌,是因为你无论从正面(即假设它是对的),还是从反面(即假设它是错的),都会得出相反的结论。因此,这句话既不对也不错。

然而,这句“说谎者悖论”仅仅是广大自指语句家庭中的成员之一,有很多语言是自指的,但却是无害的甚至是有益的。比如下面的句子:

这句话是对的

这句话就是一个既可以是对又可以是错的句子。你可以非常虔诚地承认这句话所论述的内容是对的,然后,再看它的内容,它正在陈述:它自己是对的。于是你初期的假设被证实了。另一方面,当你假设它是错误的时候,你就会知道它的语义“这句话对”是错误的,于是你就真的得到了这句话就是错误的结论。也就是说这句话的对错完全取决于你的假设。

当然,还有一些更好玩的自指句子,如:

这句话有2个‘这’字,2个‘句’字,2个‘话’字,2个‘有’字,7个‘2’字,11个‘个’字,11个‘字’字,2个‘7’字,3个‘11’字,2个‘3’字

这被称为自描述语句,也就是说这个句子正在描述自己的“分子”构成。当你尝试独立写下这样一个自描述语句的时候就会发现,你其实并没有创造这句话,而是这句话正在“迫使”你写出它自己。这是因为,按照这个句子的逻辑一旦你开始写下第一个字,你就必须按照已出现的字的情况而自动补全后面的句子。同时,这个语句还具有了不起的自我修复性。你不妨将该句子中的某一个汉字删掉(例如你删除第一个‘2’字),就会很快发现该句子中的一部分出现问题了,即“7个‘2’字”是错误的。因此,你会根据句子整体的意思指导而发现你少了一个‘2’字。

因此,自指不都是破坏性的,更多的自指是无害的,而且可以给我们带来一定的“惊奇性”。这种惊奇性的来源主要是自指语句中包含的无穷递归,因为它可以创造无限的虚拟层次。

虚拟层次是一个我们司空见惯的概念,例如故事中的故事,电影中的电影,梦境中的梦境等等(电影《盗梦空间》(Inception)就是对梦中梦层次的一个非常好的展示)。在上一章中,我们已经领略了程序是可以通过模拟而产生多个虚拟层次的。在语言中,我们不妨将引号看作是标识一个新的虚拟层次出现的符号。这样,下面这句话:

“明天会下雨”是错的

就包含了两个层次,更深一层的句子是“明天会下雨”,而上面一层则是“‘明天会下雨’是错的”。当然,我们通过不断地加引号就能创造出各种复杂的嵌套结构。

另外,人们发明了一类代词可以指代不同的句子。例如“这句话”,“那句话”。这些代词就仿佛是一个指针会将一个句子整体放到一个引号中而实现多个层次的嵌套。例如下面两句话:

下面的句子是对的
明天会下雨

在第一句话中出现了一个指代词“下面的句子”,它是一个指针指向了“明天会下雨”这句话,于是我们观察者作为一个解读器就会将这两句话解释为:

“明天会下雨”是对的

也就是说,我们照指代词的意思将“明天会下雨”这句话加上了引号放到了第一句中的“下面的句子”那个指代词之中了。于是,指代词创造了包含了两个虚拟层次的句子。

按照同样的逻辑,当我们遇到了指代词“这句话”的时候会发生什么呢?我们将会得到一个包含无穷虚拟层次的语句。例如我们将自指语句“这句话是错的”按照代词的法则展开就会得到:

““““…………”是错的”是错的”…………”是错的”是错的

我们看到,只要“这句话”这个指代词一出现,我们就能够得到无穷。因此,自指语句往往都与无穷虚拟层次有关。注意,我这里用的词语是“往往”,而不是“一定”。之所以这样说,是因为的确存在着一种构造自指语句的方法,让我们绕过无穷。这种方法就是大名鼎鼎的蒯恩法

在讨论蒯恩之前,让我们先来领教句子中的动词(动词短语)。大部分动词是与我们读句子的观察者无关的,例如:

小明起床了

这个句子表达了小明这个人物正在做的一个动作是起床了。其中“起床了”就是一个动词。当然,有很多动词不仅可以描述一个人或者事物,还可以去描述句子,例如:

“小明起床了”包含5个字

这里面的“包含5个字”就是一个描述句子“小明起床了”的动词。还有一些句子包含了动词,而这个动词是使役我们读这个句子的观察者做出某种动作的:

删除“小明起床了”中的第一个字

这个“删除第一个字”的动作就是使役读句子的观察者做出的,于是,我们按照这个句子的说法进行操作,就会得到一个新句子:

明起床了

我们可以再做稍微复杂一点的操作,例如:

把“小明起床了”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

按照这个句子所描述的复杂操作(你最好拿来一个草稿纸,自己在纸上写一写),我们就可以得到:

小“小明起床了”明起床了

好,既然你已经熟悉了这个复杂的操作,那么让我们来看下面一个古怪的句子:

把“把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

如果按照这个句子指示的操作你会得到什么?让我们来做一做。按照这个句子的要求,我们可以把引号之中的句子施行下面的三步操作:第一步,把第一个字,也就是“把”放在左引号前面,这样就得到的新句子中的第一个字:“把”;第二步,将后面的字放在右引号后面,这样新句子就会以“中的第一个字放到……字不变”为结尾;第三步,保持引号和其中的字不变,于是新句子的中间会有一个引号,并且引号的中间就会是“把中的第一个字放到……”。于是,我们得到的新句子就是:

把“把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

请注意,这个新句子和原句子是一模一样的!事实上,原句子使役我们观察者完成了一次对自己的拷贝!这个句子其实就是大名鼎鼎的蒯恩了!

也许,你已经有些糊涂了,让我们再好好看看究竟蒯恩是怎么操作的。首先,我们定义了一种具有动词的句子,也就是:

把“X”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

我们不妨将这个句子记为[math]\displaystyle{ Q(X) }[/math],其中的[math]\displaystyle{ X }[/math]就是一个空穴,可以往其中添放任何一个句子。例如,如果我们让[math]\displaystyle{ X }[/math]=“小明起床了”,那么原句子[math]\displaystyle{ Q(X) }[/math]就成为了一个完整的句子:

把“小明起床了”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

按照[math]\displaystyle{ Q(X) }[/math]的意思对[math]\displaystyle{ X }[/math]进行操作就得到了新句子[math]\displaystyle{ Y }[/math]

小“小明起床了”明起床了

在这个例子中,[math]\displaystyle{ Q(X) }[/math]显然与[math]\displaystyle{ Y }[/math]没有什么关系。

进一步,如果去除句子[math]\displaystyle{ Q(X) }[/math]中的空穴[math]\displaystyle{ X }[/math],我们可以得到:

把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

它也是一个句子(尽管它不完整),我们记它为[math]\displaystyle{ Q }[/math]。最关键的时刻来临了:我们让[math]\displaystyle{ X=Q }[/math]并代入[math]\displaystyle{ Q(X) }[/math]之中会怎样?也就是将除去空穴的句子部分[math]\displaystyle{ Q }[/math]放到[math]\displaystyle{ Q(X) }[/math]这个句子的空穴[math]\displaystyle{ X }[/math]之中:

把“把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

我们不妨把这个句子记做[math]\displaystyle{ Q(Q) }[/math],因为我们把空穴[math]\displaystyle{ X }[/math]换成了残句子[math]\displaystyle{ Q }[/math]。之后,我们再按照这个句子所给出的使役动词进行操作,就能得到新句子[math]\displaystyle{ Y }[/math],也就是:

把“把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变

令人惊奇的是,经过动词操作之后创造的句子[math]\displaystyle{ Y }[/math]与原来的句子[math]\displaystyle{ Q(Q) }[/math]竟然是一模一样的!所以句子[math]\displaystyle{ Q(Q) }[/math]利用使役动词完成了“自复制”过程,也就是[math]\displaystyle{ Q(Q)=Q(Q) }[/math]

我们把这种技巧称之为蒯恩以纪念它的发现者美国哲学家W.V. Quine。你会看到,这种技巧可以让我们不用“这句话”指代词就能够造出自指语句,比如下面这个句子:

把“把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变得到的句子是假的”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变得到的句子是假的

注意,这个句子与前面的句子稍有不同,这就是在后面加上了一个判断“得到的句子是假的”。我们不妨记[math]\displaystyle{ F= }[/math]“得到的句子是假的”,并且把:

把“X”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变得到的句子是假的

这句话记为[math]\displaystyle{ Q^oF(X) }[/math],其中[math]\displaystyle{ ^o }[/math]符号表示将两个句子粘合在一起形成新的句子,于是[math]\displaystyle{ Q^oF(X) }[/math]就是:

把“把中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变得到的句子是假的”中的第一个字放到左引号前面,其余的字放到右引号后面,并保持引号及其中的字不变得到的句子是假的

我们可以验证,经过句子所描述的操作之后得到的句子跟是一模一样的。所以这句话就相当于:“这句话是假的”。我们没使用“这句话”指代词就实现了自指。

有关更多的语言中的蒯恩操作的讨论请参看《哥德尔、艾舍尔、巴赫——集异璧之大成》一书的对话《G弦上的咏叹调》,以及《Diagonalization and Self-Reference》一书。

也许你会觉得我们在玩弄语言游戏,然而,这种语言技术却在数学和计算机中起到了非常大的作用,因为蒯恩句子恰恰就是自复制机器的逻辑基础,也是Godel定理证明过程中的关键一步。下面,我们分别对建构性自指和破坏性自指进行详细地介绍。