回到将近一年之后,我意识到我在发布之前错过了一些重要的研究。
Jot似乎很符合我的要求,它有两个相对简单的组合器B&X,可以用紧凑的Goedel编号表示。
我使用Python简化了他的参考实现:
def S(x): return lambda y: lambda z: x(z)(y(z))
def K(x): return lambda y: x
def X(x): return x(S)(K)
def B(x): return lambda y: lambda z: x(y(z))
def I(x): return x
def J(n): return (B if n & 1 else X)(J(n >> 1)) if n else I
J(n)返回构建的函数,该函数表示其Goedel号n表示的程序。
B(等效于Church编码的乘法)起到功能应用程序(括号)的作用,并且可以隔离单基Iota组合器X的S / K半部分。
我几乎(几乎)无耻地从该语言的发明者克里斯·巴克(Chris Barker)的网站上偷了这种语言的一些重要属性,大约在2000年。
Jot是语法上的常规语言,但图灵完备。从J(n)的实现中可以看到,如果宿主语言支持尾递归,则解析位串程序格式不需要堆栈空间。
Chris的站点也提供了Turing-complete的证明,使用S和K组合器实现了已知的Turing-complete组合逻辑:
K ==> 11100
S ==> 11111000
AB ==> 1[A][B], where A & B are arbitrary CL combinators built up from K & S
Jot没有语法错误,给定Goedel号n的每个程序都是有效程序。这可能是我自己研究中最重要的方面,因为它不仅简化了琐碎的解析,而且在理论上也应使Jot比任何必须跳过格式错误的程序的图灵完备编码都更加简约。
我编写了一些工具,可以通过蛮力“解决”在Jot中查找函数的Kolmogorov复杂性的半定问题。它依靠程序员指定功能映射的一些非常有特色的训练示例,然后枚举所有Jot程序,直到所有训练示例都匹配,然后最后尝试证明所找到函数与原始详细实现相等。
在我有限的资源下,它目前最多只能运行约40位。我正在尝试使用SAT解算器进行重写,以学习更大的程序。如果您知道如何将有界嵌套闭包作为布尔公式展开,请提供有关我的新问题的帮助。
现在与John Tromp的Binary Lambda演算进行一些有趣的比较,该演算虽然简洁明了,但是确实存在语法错误的问题。以下程序是由我的学习程序在几秒钟内生成的。
Function Jot Binary Lambda Calculus |J| |B|
--------|----------|--------------------------|---|---
SUCC J(18400) "000000011100101111011010" 15 24
CHURCH_0 J(154) "000010" 8 6
CHURCH_1 J(0) "00000111010" 1 11
CHURCH_2 J(588826) "0000011100111010" 20 16
IS_ZERO J(5) "00010110000000100000110" 3 23
MUL J(280) "0000000111100111010" 9 19
EXP J(18108) "00000110110" 15 11
S J(8) "00000001011110100111010" 4 23
K J(4) "0000110" 3 7
AND J(16) "0000010111010000010" 5 19
OR J(9050) "00000101110000011010" 14 20
根据我自己的实验,随着我的程序学习简单的功能,编写它们,然后从改进的上限中学习更大的功能,关于乔特导致较小程序的假设正在逐渐得到证实。