更改

第233行: 第233行:  
S(x){
 
S(x){
   −
<math>q=\lambda (Copy_o Popup_o Control)</math>
+
<math>q=\lambda (Copy_o a\ b Popup_o a\ b Control)</math>
   −
<math>(Copy_o Popup_o Control)(q);</math>
+
<math>(Copy_o a\ b Popup_o a\ b Control)(q);</math>
    
}
 
}
第242行: 第242行:  
源代码2:自打印程序的源码缩写
 
源代码2:自打印程序的源码缩写
   −
我们可以进一步地把它简写为:Q(q),其中Q表示(CopyоPopupоControl)这三个程序的联合程序,而q则表示联合程序的源代码。Q(x)这个程序的作用是输出一个特殊的字符串“X(x)”即程序X调用自己的代码x的源程序,我们称这个Q为蒯恩函数。
+
我们可以进一步地把它简写为:<math>Q(q)</math>,其中<math>Q</math>表示(<math>(Copy_o a\ b Popup_o a\ b Control)</math>)这三个程序的联合程序,而<math>q</math>则表示联合程序的源代码。<math>Q(x)</math>这个程序的作用是输出一个特殊的字符串“<math>X(x)</math>”即程序<math>X</math>调用自己的代码x的源程序,我们称这个<math>Q</math>为'''蒯恩函数'''。
   −
那么,自打印程序不是别的,正是将蒯恩函数Q自己的源代码再喂给它自己,这样就产生了Q(q)=”Q(q)”的效果。等式左边是Q对q的计算,是一个动作,它的结果产生了等式右边的字符串"Q(q)",而这个字符串恰恰就是Q作用于q的源代码。我们看到,第2节中的
+
那么,自打印程序不是别的,正是将蒯恩函数<math>Q</math>自己的源代码再喂给它自己,这样就产生了<math>Q(q)=”Q(q)”</math>的效果。等式左边是<math>Q</math>对<math>q</math>的计算,是一个动作,它的结果产生了等式右边的字符串"<math>Q(q)</math>",而这个字符串恰恰就是<math>Q</math>作用于<math>q</math>的源代码。我们看到,第2节中的蒯恩方法与这里的<math>Q(q)</math>是一模一样的。仔细想想不难发现,其实自打印程序的逻辑与蒯恩语句的逻辑是相通的。因此,自指恰恰就隐藏在了这段自打印程序之中了。
蒯恩方法与这里的Q(q)是一模一样的。仔细想想不难发现,其实自打印程序的逻辑与蒯恩语句的逻辑是相通的。因此,自指恰恰就隐藏在了这段自打印程序之中了。
      
我们只要对这个自打印程序稍加更改就能创造出自我复制的程序出来。首先,我们要说明程序的自我复制究竟是什么意思。假设内存中漂浮着很多大大小小的程序,某一个程序P能够自我复制是指,当CPU执行到程序P的时候,P就会命令CPU执行一系列的操作使得它自己的一份拷贝会出现在内存中。但是,需要强调的是P不能够从硬盘上读取文件,否则自我复制将变得异常简单,只要把硬盘上的源程序再调用到内存中就行了。乍一看,这似乎与自打印程序一样不可能实现。但是利用与自打印程序同样的蒯恩技巧,我们依然可以很轻松地构造出自复制的程序出来。
 
我们只要对这个自打印程序稍加更改就能创造出自我复制的程序出来。首先,我们要说明程序的自我复制究竟是什么意思。假设内存中漂浮着很多大大小小的程序,某一个程序P能够自我复制是指,当CPU执行到程序P的时候,P就会命令CPU执行一系列的操作使得它自己的一份拷贝会出现在内存中。但是,需要强调的是P不能够从硬盘上读取文件,否则自我复制将变得异常简单,只要把硬盘上的源程序再调用到内存中就行了。乍一看,这似乎与自打印程序一样不可能实现。但是利用与自打印程序同样的蒯恩技巧,我们依然可以很轻松地构造出自复制的程序出来。
   −
我们只需要把自打印程序(CopyоPopupоControl)中的Popup改成Construct就可以了。这里的Construct是一个函数,你输入给Construct一段程序的源代码x,它就能把x所对应的程序X编译出来并驻留在内存中。这样,程序λ((CopyоConstructоControl))о(CopyоConstructоControl)就可以完成自复制功能。
+
我们只需要把自打印程序(<math>(Copy_o a\ b Popup_o a\ b Control)</math>)中的<math> Popup_o </math>改成Construct就可以了。这里的Construct是一个函数,你输入给Construct一段程序的源代码<math>x</math>,它就能把<math>x</math>所对应的程序<math>X</math>编译出来并驻留在内存中。这样,程序<math>q=\lambda (Copy_o a\ b Popup_o a\ b Control)</math>就可以完成自复制功能。
   −
进一步,利用同样的逻辑,我们也能够制造出可以复制自身的真实机器。只要让Construct代表从给定机器的描述λ(X)而构造出实际机器X就行了。在冯诺依曼的著作《自复制自动机理论(TheoryofSelf-reproducingAutomata)》一书中,作者试图构建的自复制自动机就包括了这四个部分。即自复制机器是由一个通用拷贝机(Copy)、一个通用构造机(Construct)和一个控制器(Control)以及所有这三台机器的描述即源代码λ(Copyо ConstructоControl)构成的。
+
进一步,利用同样的逻辑,我们也能够制造出可以复制自身的真实机器。只要让Construct代表从给定机器的描述<math>\lambda (X)</math>而构造出实际机器<math>X</math>就行了。在冯诺依曼的著作《自复制自动机理论(TheoryofSelf-reproducingAutomata)》一书中,作者试图构建的自复制自动机就包括了这四个部分。即自复制机器是由一个通用拷贝机(Copy)、一个通用构造机(Construct)和一个控制器(Control)以及所有这三台机器的描述即源代码<math>q=\lambda (Copy_o a\ b Popup_o a\ b Control)</math>构成的。
    
在此小节中,我们用自打印程序和自复制程序为例来说明了建构型的自指。然而,建构性的自指实际上不仅仅是这两种,它还会有各种各样的用途。下一节,我们将介绍著名的克
 
在此小节中,我们用自打印程序和自复制程序为例来说明了建构型的自指。然而,建构性的自指实际上不仅仅是这两种,它还会有各种各样的用途。下一节,我们将介绍著名的克