紫菜表计算和未知在ZFC中终止的算法


12

紫菜表提供的还没有被证明在数学的标准公理系统终止程序的例子ZFC但是当一个人承担非常大基数公理就终止。

介绍

经典紫菜表是独特的有限代数与底层集合和操作,其满足的身份,并且其中用于和其中。An{1,...,2n}*x * (y * z)=(x * y) * (x * z)x*1=x+1x<2n2n*1=1

有关经典Laver表的更多信息,请参见Patrick Dehornoy所著的《辫子和自我分配》。

挑战

1*32在经典Laver表中计算并在找到nwith 时恰好终止的最短代码(以字节为单位)是什么?换句话说,程序仅在找到with时终止,否则它将永远运行。1*32<2nn1*32<2n

动机

一个秩为秩基数(也称为I3-基数)是一个非常大的水平无穷的,如果一个假设秩为秩基数的存在,那么一个人能够证明更定理如果一个不超过假设存在等级为基数的基数。如果存在一个秩为秩基数,再有就是一些经典紫菜表哪里。但是,尚无ZFC中的证明。此外,已知的是,至少其中大于(这是一个非常大的数量,因为阿克曼函数是一个快速增长的函数)。因此,任何此类程序都将持续极长的时间。An1*32<2n1*32<2nn1*32<2nAck(9,Ack(8,Ack(8,254)))Ack

我想看看可以编写多短的程序,以便我们不知道该程序是否使用标准公理系统ZFC终止,但是我们确实知道该程序最终在一个更强大的公理系统(即ZFC + I3)中终止。这个问题的灵感来自斯科特 ·亚伦森(Scott Aaronson)最近的一篇文章,在这篇文章中,亚伦森和亚当·叶迪迪亚(Adam Yedidia)建造了具有8000个州以下的图灵机,以至于ZFC无法证明图灵机不会终止,但是当人们假设大的基本假设时,已知该图灵机不会终止。

经典Laver表的计算方式

当计算紫菜表通常是方便使用的事实,在代数,我们对所有的。An2n * x=xxAn

以下代码计算经典Laver表 An

#table(n,x,y)在A n中返回x * y
表格:=功能(n,x,y)
如果x = 2 ^ n则返回y;
elif y = 1然后返回x + 1;
否则返回table(n,table(n,x,y-1),x + 1); fi; 结束;

例如,输入table(4,1,2)将返回12

的代码table(n,x,y)效率很低,并且只能在合理的时间内在Laver表中进行计算。幸运的是,计算经典Laver表的算法比上面给出的算法要快得多。A4


2
欢迎来到PPCG!很棒的帖子!
NoOneIsHere

1
根据Wikipedia的说法,Ack(9,Ack(8,Ack(8,254)))是周期超过16的n的下限。为此,我们可以检查1 * 16而不是1 * 32。我将相应地修改程序。
约翰·特朗

1
我已经开始编写图灵机来执行此操作,并且我认为我发现了两个因数错误。Dougherty不能证明这Ack(9,Ack(8,Ack(8,254)))是第一张表的下界,在第一张表中第一行的时间段为 32,即哪里1*16 < 2^n
彼得·泰勒

1
如果您有用于Ackermann的20状态2符号机,请给我链接,因为我可能会从中窃取一些想法。我有44个状态要计算table(n,x,y),我认为设置常量和外部循环需要25到30个状态。我可以在esolangs.org上找到的唯一直接TM表示形式是esolangs.org/wiki/ScripTur,但并不是那么容易。
彼得·泰勒

1
cheddarmonk.org/papers/laver.pdf与我本周希望完成的工作一样多,因为我要去旅行。
彼得·泰勒

Answers:


4

二进制Lambda演算,215位(27字节)

\io. let
  zero = \f\x. x;
  one = \x. x;
  two = \f\x. f (f x);
  sixteen = (\x. x x x) two;
  pred = \n\f\x. n (\g\h. h (g f)) (\h. x) (\x. x);
  laver = \mx.
    let laver = \b\a. a (\_. mx (b (laver (pred a))) zero) b
    in laver;
  sweet = sixteen;
  dblp1 = \n\f\x. n f (n f (f x)); -- map n to 2*n+1
  go2 = \mx. laver mx sweet mx (\_. mx) (go2 (dblp1 mx));
in go2 one

编译为(使用https://github.com/tromp/AIT上的软件)

000101000110100000010101010100011010000000010110000101111110011110010111
110111100000010101111100000011001110111100011000100000101100100010110101
00000011100111010100011001011101100000010111101100101111011001110100010

该解决方案主要是由于https://github.com/int-e


2
我不确定您的成绩如何,但默认情况下,应根据代码中的字节数对提交的内容进行评分。我为此提交计算了375个字节。您还应该包括语言名称以及(可选)该语言的解释器的链接。
Alex A.

您可能应该在帖子中包含长度为234位的确切代码。
CalculatorFeline

2
可以在Wikipedia上找到该编码。也有指向此解释器的链接(未测试)。但是,应该检查这些,并且二进制编码也应该在后面。
PurkkaKoodari'5

1
对于编译语言,我们对用户编写的代码进行评分-而不是生成的二进制文件中的字节数。
Alex A.

5
@AlexA。没必要……编译器或解释器可以理解的任何形式的代码都可以。
feersum '16

4

CJam(36 32字节)

1{2*31TW$,(+a{0X$j@(@jj}2j)W$=}g

实际上,这种错误很快就会出错,因为它会使调用堆栈溢出,但是在理论上不受限制的计算机上,它是正确的,而且我知道这是对此问题的假设。

的代码table(n,x,y)效率很低,并且只能在合理的时间内在Laver表A 4中进行计算。

如果我们缓存计算值以避免重新计算它们,则实际上是不正确的。这是我使用j(memoisation)运算符采取的方法。它以毫秒为单位测试A 6,并且堆栈测试A 7溢出-我实际上出于 table高尔夫的目的而进行了优化。

解剖

如果我们假设n是从上下文理解的,而不是

f(x,y) =
    x==2^n ? y :
    y==1 ? x+1 :
    f(f(x,y-1),x+1)

我们可以删除第一个特殊情况

f(x,y) =
    y==1 ? x+1 :
    f(f(x,y-1),x+1)

它仍然有效,因为

f(2^n, 1) = 2^n + 1 = 1

对于其他任何东西y

f(2^n, y) = f(f(2^n, y-1), 1) = f(2^n, y-1) + 1

因此通过归纳,我们得到f(2^n, y) = y

对于CJam而言,反转参数顺序更为方便。而不是使用范围,而是通过递减每个值1 .. 2^n来使用范围0 .. 2^n - 1,所以我要实现的递归函数是

g(y,x) =
    y==0 ? x+1
         : g(x+1, g(y-1, x))

1           e# Initial value of 2^n
{           e# do-while loop
  2*        e#   Double 2^n (i.e. increment n)
  31T       e#   table(n,1,32) is g(31,0) so push 31 0
  W$,(+a    e#   Set up a lookup table for g(0,x) = x+1 % 2^n
  {         e#   Memoisation function body: stack is 2^n ... y x
    0X$j    e#     Compute g(0,x) = x+1 % 2^n
            e#     Stack is 2^n ... y x (x+1%2^n)
    @(      e#     Bring y to top, decrement (guaranteed not to underflow)
            e#     Stack is 2^n ... x (x+1%2^n) (y-1%2^n)
    @jj     e#     Rotate and apply memoised function twice: g(x+1,g(y-1,x))
  }
  2j        e#   Memoise two-parameter function
            e#   Stack: 2^n g(31,0)
  )W$=      e#   Test whether g(31,0)+1 is 2^n
}g          e# Loop while true

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.