平面表达式的最简单完整组合器基础对


9

在克里斯·冈崎(Chris Okasaki)的论文“ 拼合组合器:没有括号的情况下生存 ”中,他表明,两个组合器既足以作为编码图灵完备表达式的基础,又不需要应用运算符或括号。

通过使用应用程序运算符对S和K组合器进行前缀编码,与John Trump在“ 二进制Lambda微积分和组合逻辑 ”中对组合逻辑的编码相比,只需要两个组合器来进行平面表达式,就可以将代码密度提高到最优。产生的Goedel编号将每个整数映射为有效的,格式正确的闭项表达式,这与大多数计算和最小描述长度的esolang不同,后者的规范表示通常允许描述语法无效的程序。

但是Okasaki的编码在从lambda演算项到位串的单向映射中是最有用的,而不一定是相反的,因为当用作实用的替换指令时,此归约中使用的两个组合器相对复杂。

什么是不需要应用程序运算符的最简单的完整组合器基础对?


1
不知道是否有关,但是:注意,有一个形成的演算的基础单一期限。这使得哥德尔编号更加简单。cs.uu.nl/research/techreps/repo/CS-1989/1989-14.pdf

Answers:


2

回到将近一年之后,我意识到我在发布之前错过了一些重要的研究。

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

根据我自己的实验,随着我的程序学习简单的功能,编写它们,然后从改进的上限中学习更大的功能,关于乔特导致较小程序的假设正在逐渐得到证实。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.