运营知识今天 07:55
📱

用Kleene第二递归定理构造自复制程序:Quine背后的数学原理

一个程序如何在不读取自身源码的前提下原样输出自己?这篇文章从Kleene第二递归定理出发,把Quine的构造思路讲清楚,适合对计算理论和编程之美感兴趣的读者。

#Quine#计算理论#递归定理#自复制程序#函数式编程

一个看似不可能的任务:让程序打印自己

配图

写一个程序,运行后原样输出它自己的源代码——这就是 Quine。初学者第一反应往往是“读一下文件不就行了”,但 Quine 的经典规则恰恰禁止读取自身源码。于是问题变成了:程序在没有任何外部信息的情况下,如何“知道”自己长什么样?

这个问题看似只是编程小把戏,背后却连着计算理论里一条相当深刻的定理:Kleene 第二递归定理。最近 Hacker News 上有人专门写了一篇长文,用这条定理一步步构造出 Quine,把“自指”这件事从玄学变成了可推导的工程。

先理解不动点:程序也能有“自指”

第二递归定理的通俗版本是:对任意一个可计算的总函数 F,都存在一个程序 e,使得 e 和 F(e) 行为等价。换句话说,你总能让一个程序“拿到自己的编号”,并据此行动。

这正是 Quine 需要的。把 F 设计成“接收一个程序编号,输出一个打印该编号对应源码的程序”,那么不动点 e 就会输出自己的源码。定理保证了这样的 e 一定存在,剩下的工作只是把它显式构造出来。

构造的两块积木:数据与代码

配图

文章把构造拆成两个可复用的部件:

  • 数据部分:一段把“模板”当字符串携带的代码,它不执行模板,只负责搬运。
  • 代码部分:一段接收字符串、把字符串代入模板并打印出来的逻辑。
🔒

登录解锁全文

以下内容需登录后阅读。注册/登录完全免费,无需付费。

0 0 0

评论(0)

0/500 · 需登录

还没有评论

延伸阅读