Skip to content

s-m-n 定理

s-m-n theorem · Parameter theorem

把程序的部分输入有效固化为新程序索引的参数化定理。

形式陈述

固定偏可计算函数的可接受编号。对任意 m,n1,存在总可计算函数

smn:Nm+1N

使对所有程序索引 e、固定参数 x1,,xm 和剩余输入 y1,,yn

φsmn(e,x1,,xm)(y1,,yn)φe(x1,,xm,y1,,yn).

符号 表示两边作为部分可计算函数外延相等:同一输入上要么都不定义,要么都停机并给出相同值。函数 smn 本身对每组代码和固定参数都必须停机,即使被专门化的原程序以后会发散。

证明骨架是有效的程序模板构造。建立一个模板,它把常量 e,x1,,xm 写入自身,并在收到 y1,,yn 后调用通用解释器计算

U(e,x1,,xm,y1,,yn).

程序文本与常量都有有限有效编码,所以“把这些常量嵌入模板并输出新索引”是总可计算的语法变换。可接受编号保证生成代码可被统一解释,且与原程序在剩余输入上的行为一致。一般 m,n 只是在编码元组和模板插槽数量上扩展同一构造。

直觉

s-m-n 定理是数学化的 partial evaluation。给一个多参数程序和前几项实参,可以只做编译工作,把这些实参写进一份新程序,而不必运行尚未给出的输入。新程序以后接收剩余参数时,表现得与旧程序收到完整参数完全一样。

定理处理的是程序代码,而不是先求出程序语义再重新编程。正因为代码变换总能完成,它才能成为自指、递归定理与索引集理论的可靠基础。

例子与边界

设索引 e 的二元程序计算

φe(a,b)=a+b.

固定 a=5 后,q=s11(e,5) 是某个一元程序的索引,并满足 φq(b)=5+b。更能体现部分性的例子是通用模拟器:固定机器索引 e 后,可生成只等待输入 x 的专用模拟程序;即使原机器在某些 x 上永不停机,生成专用程序代码的过程仍会停机。

smn 不需要给出最短、最快或唯一的新程序。不同编译模板可产生不同索引,只要计算同一偏函数即可。公式也不声称

smn(e,x)=e

或两份源码逐字符相同;结论只是运行行为外延相等。

定理不能用于判定任意程序语义。它能把参数写进代码,却不能告诉我们生成程序是否总停机、是否为空函数或是否与另一程序等价;这些非平凡语义问题仍受 Rice 定理限制。若编号只是任意集合论枚举,没有有效通用解释和编译性质,结论也可能失败。

推论与应用

把程序代码作为普通数据,再用本定理固化自应用所需的参数,可以证明Kleene 递归定理:任意总可计算代码变换都存在语义固定点。固定点满足程序行为相同,而非索引数值相等。

定理还支撑编译器专门化、解释器残留程序和通用模拟的形式分析。结合Rice 定理,它说明同一套有效编号既允许丰富的代码生成,又不提供语义判定捷径;“能构造程序”与“能决定程序做什么”必须严格区分。

参考资料
  • Stephen C. Kleene, Introduction to Metamathematics, North-Holland, 1952, §§52–53, the parameter theorem.
  • Hartley Rogers Jr., Theory of Recursive Functions and Effective Computability, MIT Press, 1987, Chs. 1–5 and 11.
  • Nigel Cutland, Computability: An Introduction to Recursive Function Theory, Cambridge University Press, 1980, Ch. 3.