二元兰达微积分(2012)

2021-04-11 23:54:48

(Cat Hilbert.Blc; Echo -N 1234)| ./tromp (cat ordindices.blc; echo; cat primes.blc | ./trom -b)| ./tompcat inpes.blc | ./tomp -b | ./primes.pl.

法官敢说这个词条的数据文件是处理的,而不是进入本身更加混淆。

该计划通过实施已知最简洁的语言,二进制Lambda微积分(BLC)来庆祝混淆和简洁之间的密切联系。

BLC开发为进行算法信息理论,最小的程序理论,更具体。它从最简单的计算模型,lambda微积分开始,并增加了最小的机器量,以实现二进制输入和输出。

更具体地,它定义了一种通用机器,从输入的比特流解析Lambda微积分的二进制编码,将其应用于剩余的输入(转换为Booleans的懒惰列表,在Lambda中具有标准表示微积分,并将评估的结果转换回要输出的比特流。

Lambda被编码为00,应用为01,以及由N&#39的变量绑定;然后将λ(所谓的de Bruijn表示法表示)为1 ^ {n} 0.这就是BLC!

例如拉姆达术语S = \ X \ Y \ Z(X Z)(Y z)的编码中,与德布鲁因符号\ \ \(3 1)(2 1),是00 00 00 01 01 1110 10 01 110 10

在密切相关的BLC8语言中,IO是面向字节的,在字节流之间翻译,并在Booleans的长度8个列表中翻译。

该提交以最简洁的方式实现了通用机器。它缺少#defines和#includes,并编译为尺寸为6k的(剥离)可执行文件。

没有参数,它以字节模式,使用标准和输出运行。一个(任意)参数,它以比特模式运行,仅使用最小的输入,使用字符'0'和'1'进行输出。

该程序使用以下退出代码:0:确定;结果是一个有限列表5:超出术语SPACE6:从内存中出现1,2,3,4,8,9:结果不在列表表单中

最短(封闭的)Lambda微分术语是\ x x(\ 1在de bruijn符号中),这是身份函数。当它的编码0010是FedInto通用机器时,它将简单地将输入复制到输出。(嗯,不是那么简单的,因为每个字节被击落到位点并从头开始重建)Voila:半字节CAT:

由于第一个字节的最低有效4位仅是由程序忽略了任意填充,因此来自ASCII 32(空间)到47(/)的任何字符都将执行,例如:

如果输入不能以有效的程序开头,即,如果解释器在程序解析期间达到文件结束,则会以某种方式崩溃:

此外,解释器需要初始编码的lambda项才能关闭,即,变量n只能出现在封闭lambdas的至少n内。术语\ 5未关闭,导致翻译在调查中时崩溃 - 指针环境:

由于可以在创建BLC程序时检查这些属性,因此解释器不会打扰检查它。

BLC通用机器可以小于650字节的C(包括布局的952个字节),但在BLC中编写了一个自我解释器,它在232比特(29字节)下是彻头彻尾的微量卷(29字节):

0111010101111100101111100100

19468 05580 05F00 BFE5F 85F3F 03C2D B9FC3F8 5E9D65E5F 0DECB F0FC3 9BEFE 185F7 0B7FB 00CF67BB03 91A1A(CAT UNI8.BLC; ECHO" NI HAO")| ./tompni hao.

即使短于自我解释器是这个167位的这个素数筛(21个字节):

对于那些更倾向于在十进制中消化其素数的人来说,奇怪的是,BLC将打印由给定字符分隔的所有奇数字符(带有LSB = 1)的索引:

(Cat ordindices.blc; echo -n"&#34 ;; cat primes.blc | ./trom -b)| ./tomp |头-c 702 3 5 7 11 13 13 13 23 23 23 23 43 47 53 53 59 61 71 71 71 71 71 73 73 79 83 89 97

程序Hilbert.Blc,在143个字节,是一个非常曲折的“单线”(以十六进制显示):

1818181 8111154 6806041 55ff0419d F9 DE 16 FF FE 5F 3fef f615ff9 46 84 058117e 05cb FE BC bfee86cb9 4681600 5c0bfac bfbf71a 85 E0 5C F4 14d5fe0 8180b048d0800e078 016445ffe 5ff7 ffffe5fff2fc 02f7ad97f5bf FFFF BF FF CA AF ff7817ffa df76695 4680601 57f7e16 05 C1 3fe80b2 2c18581 bfe5c10 42ff805de EC 06 C2 C0 C060 8191A00167FB CBCFDF65F7C0 A20

它期望输入的n个任意字符,并绘制一个空间填充r rerber曲线n:

(Cat Hilbert.Blc; Echo-n" 1")| ./tomp _ | | (Cat Hilbert.Blc; Echo -N" 12")| ./tomp _ _ | | _ | || _ _ | _ | | _(Cat Hilbert.Blc; Echo -n" 123")| ./tomp _ _ _ _ | | _ | | | | _ | || _ _ | | _ _ | _ | | _____ | | _ | ___ ___ || _ | _ | | _ | _ | _ | _ _ | _ | | ___ | | ___ | | (Cat Hilbert.Blc; Echo -N" 1234")| ./trom_ _ _ _ _ _ _ _ | | _ | | | | _ | | | | _ | | | | _ | || _ _ | | _ _ | | _ _ | | _ _ | _ | | _____ | | _ _ | | _____ | | _ | ___ ___ | | ___ ___ || _ | _ | | _ | _ | | _ | _ | | _ | _ | _ | _ _ | _ _ | _ _ | _ | | ___ | | ___ | | _ | | ___ | | ___ | || _ ___ ___ ___ ___ _ | _ | | _ | _ | _ | | _ | _ | _ | | _ | _ | _ | _ _ | _ | _ || _ | | _ | | | ___ | | ___ | | | _ | | _ | _ _ | ___ ___ | _ _ | | _ | | | _ | _ | | _ | _ | | | _ | || _ _ | _ | _ _ | _ | _ _ | _ | | ___ | | ___ | | ___ | | ___ | | _

最小的已知的BF翻译是写入的......您猜到了,BLC,进入112字节(包括3位填充):

OD -t X4 bf.Blc 0000000 01a15144 02d55584 223070b7 00f032ff0000020 7f85f9bf 956fe15e c0ee7d7f 006854e50000040 fbfd5558 fd5745e0 b6f0fbeb 07d62ff00000060 d7736fe1 c0bc14f1 1f2eff0b 17666fa10000100 2fef5be8 ff13ffcf 2034cae1 0bd0c80a0000120 e51fee99 6a5a7fff ff0fff1f d0049d870000140 db0500ab 3bb74023 b0c0cc28 10740e6c0000160

它预计其输入包括Brainfuck程序(仅查找位0,1,4,以区分 - 。+<),然后是a],然后输入脑投入程序。

本解析器可以略微不那么痛苦地写入BLC程序,即将单字母变量LAMBDA微积分略微痛苦地变为BLC:

程序膨胀.Blc及其反向偏转.BLC允许我们在BLC和BLC8之间翻译。如果您组装面向字节的程序,则需要将其压缩到BLC8中:

回声" \ a a((\ b b)(\ b \ c \ d \ e d(b)(\ f f c e))))(\ b \ c c)" >反向猫parse.blc反向| ./tomp>反向.blc.blc.

BLC8程序符号.BLC显示符号Lambda条款上的单个减少步骤。它用于在教堂数字中显示2 3的计算:

回声"(\ f \ x f(f(f x)))(\ f \ x f(f x))" > threetwo cat parse.blc threetwo | ./tomp> threetwo.blc cat符号.blc threetwo.blc | ./tromp(\ ba(a(ab)))(\ a \ ba(ab))\ a(\ b \ cb(bc))((\ b \ cb(bc))((\ b \ CB(BC))a)))\ a \ b(\ c \ dc(cd))((\ c \ dc(cd))a)((\ c \ dc(cd))((\ c \ dc( CD))a)a)b)\ a \ b(\ c(\ d \ ed(de))a((\ d \ ed(de))ac))((\ c \ dc(cd))((\ C \ DC(CD))a))b)\ a \ b(\ c \ dc(cd))a((\ c \ dc(cd))a((\ c \ dc(cd))((\ c \ DC(CD))a))b)))\ a \ b(\ ca(ac))((\ c \ dc(cd))a((\ c \ dc(cd))((\ c \ dc( CD))a)b)))\ a \ ba(a(\ c \ dc(cd))a((\ c \ dc(cd))((\ c \ dc(cd))a)b)) )\ a \ ba(a((\ ca(ac))((\ c \ dc(cd))((\ c \ dc(cd))a)b))))\ a \ ba(a(a( a((\ c \ dc(cd))((\ c \ dc(cd))a)b)))))))\ a \ ba(a(a((\ c(\ d \ ed(de)) )a((\ d \ ed(de))交流))))b)))))\ a \ ba(a(a((\ c \ dc(cd))a((\ c \ dc(cd)) )ab)))))))\ a \ ba(a(a(a((\ c \ dc))((\ c \ dc))ab))))))))))))))))))))\ a \ ba(a(a(a( A(a(a((\ c \ dc(cd))ab))))))))))\ a \ ba(a(a(a(a(a(a(a((\ ca(ac))b))))))) )\ a \ ba(a(a(a(a(a(a(a(a(a))))))))

只采用第一行输出给我们提供了一种BLC拆卸器,这是上述汇编器的精确逆。素数筛子拆卸如下:

CAT Symbolic.Blc Primes.Blc | ./tomp | head -1 \ a(\ bb(b((\ ccc)(\ c \ d \ ee(\ f \ gg)((\ fccf(\ ggg)(\ gf(gf)))))(\ f \ g \ h \ IIG(h(df)))))))(\ c \ d \ eb(ec)))))))(\ b \ cc(\ d \ ed)b)

Cat符号的最后一行.Blc inmes.blc | ./tomp |作为\ a \ bb(\ c \ dc)(\ cc(\ d \ ed)(\ dd(\ e \ f \ f \ gg)(\ f(\ f(\ g \你好

\ A是用于忽略其余的输入(通用MachineApplies解码的Lambda术语)。 \ bb(...)(...)是通常被称为缺点的列表构造函数,应用于head(列表元素)和尾部(另一个列表)。在这种情况下,元素是(\ c \ dc),哪个代表Boolean True,我们用来表示0位。这是0表示0不是Prime的位。下一个列表元素(遵循另一个缺点)是(\ d \ e D)。另外0位,这次说1不是素数。第三个列表元素是(\ e \ f f),1位,确认我们怀疑2是素数。根据(\ f \ g g),如下数字。我们可以看到前4个Elementsis之后的尾巴仍然需要进一步减少。对于第30行的第一次第4位,如(\ g \ hg),或0,因为归零out的所有倍数,2.since my computer在第40行之前迁移地狱,我们看不到下一个到达,至少在这个象征性的减少中。

性能非常不错,并且对于这种微小的实施非常有利,比Haskell实现的普通机器所谓的高阶摘要语法慢的速度大致50%,这依赖于高度优化的Haskell运行时系统进行评估。当然,口译员的各个BLC程序正在运行,而不是Haskell中编写的相同程序更糟糕。

时间cat primes.blc | ./tomp -b |头-c 210> / dev / nullreal 0m0.043s time cat uni.blc primes.blc | ./tomp -b |头-c 210> / dev / nullreal 0m0.191s time cat uni.blc uni.blc primes.blc | ./tomp -b |头-c 210> / dev / nullreal 0m1.919s time cat uni.blc uni.blc uni.blc primes.blc | ./tomp -b |头-c 210> / dev / nullreal 0m23.514s time cat uni.blc uni.blc uni.blc uni.blc primes.blc | ./tomp -b |头-c 210> / dev / nullreal 4m52.700s

程序自由(无铸造)在int和int *之间转换,导致many警告;注意:预期的'int *',但参数是类型'int'警告:来自不兼容的指针类型的分配警告:赋值从指针的integer没有投射警告:赋值在没有演员警告的情况下从整数中指针:内部内部的隐式声明在“calloc”警告中:内置函数的隐式声明不兼容的内置函数'退出'警告:传递参数1'd'的指针在没有演员警告的情况下从整数中指针:传递参数1'p'的参数1从整数的指针没有施放警告:条件表达中的指针/整数类型不匹配

避免这些将使该计划大大更长,并贬低其单一思想的重点。

它隐式声明函数读取,写入,退出和calloc,后两个不可相容性的32位和64位可执行文件是单独的makefile目标,涉及长期int,从4到8的硬编码尺寸。 该程序已经过32和64位在Linux / Solaris / MacOSX上正常工作。 Christopher Hendrie,Bertram Felgenhauer,Alex Stangl,Seong-Hoon Kang和Yusuke Endoh有贡献的想法和改进建议。 G J Chaitin,算法信息理论,I卷,剑桥在剑桥大学理论计算机科学中,1987年10月。http://www.cs.auckland.ac.nz/~chaitin/cup.html ©版权所有1984-2015,Leo Broukhis,Simon Cooper,Landon Cooker - 保留所有权利这项工作是根据Creative Commons atticulation-Sharealike 3.0未受到的许可证许可。