| 第506行: |
第506行: |
| | ==== Quine(自打印程序) ==== | | ==== Quine(自打印程序) ==== |
| | | | |
| − | '''现象''':一个'''不接受任何输入、只打印出自己源代码副本'''的程序。<ref name="wikipedia_quine_computing" />。它的约束很苛刻——'''不能读自己的源码'''(靠读文件输出自己、如 `cat $0`,被视为"作弊",不算 quine),只能靠"代码部分 + 代表代码文本的数据部分"来构造性地打印自己;§5.4 例 1 的 Python 程序就是一个标准 quine。"quine" 一词由 [[侯世达|Hofstadter]] 在《哥德尔、艾舍尔、巴赫》中普及(借自哲学家 W. V. O. Quine 的名字,他构造过自指的句子)<ref name="hofstadter1979" />。 | + | '''现象''':一个'''不接受任何输入、只打印出自己源代码副本'''的程序。<ref name="wikipedia_quine_computing" />。它的约束很苛刻——'''不能读自己的源码'''(靠读文件输出自己、如 `cat $0`,被视为"作弊",不算 quine),只能靠"代码部分 + 代表代码文本的数据部分"来构造性地打印自己;§5.4 例 1 的 Python 程序就是一个标准 quine。"quine" 一词由 [[侯世达|Hofstadter]] 在《[[哥德尔、艾舍尔、巴赫]]》中普及(借自哲学家 W. V. O. Quine 的名字,他构造过自指的句子)<ref name="hofstadter1979" />。 |
| | | | |
| − | '''SRT 如何推出它''':把 SRT 里的变换规则 f 直接定义为'''"打印"程序'''——f(c) = "打印出 c 的源码的那个程序"。套用 SRT(<math>\phi_c = \phi_{f(c)}</math>)得到不动点 c: | + | '''SRT 如何推出它''':把 SRT 里的变换规则 <math>f</math> 直接定义:'''"打印"程序'''——<math>f(c) =</math> "打印出 <math>c</math> 的源码的那个程序"。套用 SRT(<math>\phi_c = \phi_{f(c)}</math>)得到不动点 <math>c</math>: |
| | | | |
| − | > <math>\phi_c = \phi_{f(c)} = \phi_{"打印 c"}</math>
| + | : <math>\phi_c = \phi_{f(c)} = \phi_{"打印 c"}</math> |
| | | | |
| − | 也就是说,程序 c 的行为 = 打印出 c 自己——这正是 quine。所以 quine 就是"取 f = Print 程序、再套 SRT"的一行产物。Kiselyov 在分阶段 <math>\lambda</math> 演算里形式化地证明,quine、twine(两个程序互相打印对方)、trade 谜题都是 SRT 的不动点。<ref name="kiselyov" /> | + | 也就是说,程序 <math>c</math> 的行为 = 打印出 <math>c</math> 自己——这正是 quine。所以 quine 就是"取 <math>f =</math> Print 程序、再套 SRT"的一行产物。Kiselyov 在分阶段 <math>\lambda</math> 演算里形式化地证明,quine、[[twine]](两个程序互相打印对方)、[[trade谜题]]都是 SRT 的不动点<ref name="kiselyov" />. |
| | | | |
| | ==== 自省程序与自省式自改进程序 ==== | | ==== 自省程序与自省式自改进程序 ==== |