Laver tablosu hesaplamaları ve ZFC'de sonlandığı bilinmeyen bir algoritma


12

Laver tabloları matematik standart aksiyomatik sisteminde sona erdirmek için gösterilmemiş programların örnekler sunmak ZFC biri çok büyük kardinal aksiyomlarını varsayar zaman sonlandırmak ama.

Giriş

Klasik Laver tabloları seti altında yatan sahip benzersiz sonlu cebirleridir ve bir operasyon olduğunu karşılar kimlik ve için ve .An{1,...,2n}*x * (y * z)=(x * y) * (x * z)x*1=x+1x<2n2n*1=1

Klasik Laver masaları hakkında daha fazla bilgi Patrick Dehornoy'un Örgüler ve Kendi Kendine Dağıtma kitabında bulunabilir.

Meydan okuma

1*32Klasik Laver tablolarında hesaplanan ve bir nile bulduğunda kesin olarak sona eren en kısa kod (bayt cinsinden) nedir? Başka bir deyişle, program yalnızca ve bir ile bulursa , ancak sonsuza dek çalışırsa sona erer .1*32<2nn1*32<2n

Motivasyon

Bir rütbeye kadar kardinal (ayrıca I3-kardinal olarak da adlandırılır) son derece büyük bir sonsuzluk seviyesidir ve eğer kişi rütbe bir kardinalin varlığını varsayarsa, kişi, rütbeye göre daha fazla teoremleri kanıtlayabilir. rütbe bir rütbe varlığını varsayalım. Bir sıradan içine-rank kardinal vardır, o bazı klasik Laver masa var nerede . Ancak, ZFC'de bilinen bir kanıt yoktur . Ayrıca, en azın nerede olduğu daha fazla bilinmektedir (Ackermann fonksiyonu hızlı büyüyen bir fonksiyon olduğu için son derece büyük bir sayıdır ). Bu nedenle, bu tür herhangi bir program çok uzun bir süre devam edecektir.An1*32<2n1*32<2nn1*32<2nAck(9,Ack(8,Ack(8,254)))Ack

Bir programın ne kadar kısa yazılabileceğini görmek istiyorum, böylece programın standart aksiyomatik sistem ZFC'yi kullanarak sonlandırıp sonlandırmayacağını bilmiyoruz, ancak programın sonunda çok daha güçlü bir aksiyomatik sistemde, yani ZFC + I3'te sonlandığını bildiğimiz yerde. Bu soru, Scott Aaronson'un Aaronson ve Adam Yedidia'nın 8000'in altında devlete sahip bir Turing makinesi inşa ettikleri, ZFC'nin Turing makinesinin sona ermediğini ancak büyük kardinal hipotezleri kabul ettiğinde sona ermediği bilinmediği bilinen bir görevinden ilham aldı .

Klasik Laver tabloları nasıl hesaplanır

Laver tabloları hesaplanırken zaman cebirde gerçeğini kullanmak genellikle uygundur , biz herkes için de .An2n * x=xxAn

Aşağıdaki kod klasik Laver tablosunu hesaplar An

# tablo (n, x, y) A n'de x * y değerini döndürür
Tablo: = fonksiyonu (n, x, y)
x = 2 ^ n ise y döndür;
elif y = 1 sonra x + 1;
başka dönüş tablosu (n, tablo (n, x, y-1), x + 1); fi; son;

Örneğin, giriş table(4,1,2)geri döner 12.

Kodu table(n,x,y)oldukça verimsizdir ve sadece Laver tablosunda makul bir sürede hesaplanabilir . Neyse ki, klasik Laver tablolarını hesaplamak için yukarıda verilenlerden çok daha hızlı algoritmalar vardır.A4


2
PPCG'ye Hoşgeldiniz! Harika gönderi!
NoOneIsHere

1
Wikipedia'ya göre, Ack (9, Ack (8, Ack (8,254))) n'nin üzerinde dönemin 16'yı aştığı bir alt sınırdır. Bunun için 1 * 32 yerine 1 * 16'yı kontrol edebiliriz. Programımı buna göre değiştireceğim.
John Tromp

1
Bunu yapmak için bir Turing makinesi yazmaya başladım ve sanırım iki faktörlük bir hata tespit ettim. Dougherty Ack(9,Ack(8,Ack(8,254))), ilk sıranın periyodu 32 olan ilk tablo için bir alt sınır olduğunu kanıtlamadı 1*16 < 2^nmı?
Peter Taylor

1
Ackermann için 20 durumlu 2 sembollü bir makineniz varsa, lütfen bana bir bağlantı verin, çünkü muhtemelen bazı fikirleri çalabilirim. Hesaplamak için 44 durumum var table(n,x,y)ve bence sabitleri ve dış döngüyü kurmak 25 ila 30 durum alacak. Esolangs.org'da bulabildiğim tek doğrudan TM temsili esolangs.org/wiki/ScripTur ve aslında o kadar da golf değil.
Peter Taylor

1
cheddarmonk.org/papers/laver.pdf bu hafta yapmayı beklediğim kadarıyla, çünkü seyahat edeceğim.
Peter Taylor

Yanıtlar:


4

Binary Lambda Matematik, 215 bit (27 bayt)

\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

derlemek ( https://github.com/tromp/AIT adresindeki yazılımı kullanarak )

000101000110100000010101010100011010000000010110000101111110011110010111
110111100000010101111100000011001110111100011000100000101100100010110101
00000011100111010100011001011101100000010111101100101111011001110100010

Bu çözüm çoğunlukla https://github.com/int-e adresinden kaynaklanmaktadır


2
Puanınızı nasıl aldığınızdan emin değilim, ancak varsayılan olarak gönderimler koddaki bayt sayısına göre puanlanmalıdır. Bu gönderim için 375 bayt sayıyorum . Ayrıca dil adını ve isteğe bağlı olarak dil için bir tercümanın bağlantısını da eklemelisiniz.
Alex A.

Muhtemelen postanıza 234 bit uzunluk kodunu eklemelisiniz.
CalculatorFeline

2
Kodlama Wikipedia'da bulunabilir . Ayrıca bu tercümanın bir bağlantısı da vardır (test edilmemiştir). Ancak bunlar kontrol edilmeli ve ikili kodlama da yazıda olmalıdır.
PurkkaKoodari

1
Derlenmiş diller için, oluşturulan ikili dosyadaki bayt sayısını değil, kullanıcı tarafından yazılan kodu puanlarız.
Alex

5
@AlexA. Bu gerekli değildir ... bir derleyici veya yorumlayıcı tarafından anlaşılabilecek herhangi bir kod biçimi uygundur.
feersum

4

CJam ( 36 32 bayt)

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

Pratikte, bu çağrı yığınını taştığı için oldukça hızlı bir şekilde hata veriyor, ancak teorik sınırsız bir makinede doğru ve bu sorunun varsayımı olduğunu anlıyorum.

Kodu table(n,x,y)oldukça verimsizdir ve sadece Laver tablosunda A 4 makul bir sürede hesaplanabilir .

hesaplanan değerleri yeniden hesaplamayı önlemek için önbelleğe alırsak aslında doğru değildir. j(Memoisation) operatörünü kullanarak benim yaklaşımım budur . Milisaniye cinsinden A 6'yı test eder ve yığın testi A 7'yi aşar - ve aslında golfüntable çıkarları konusunda deoptimize oldum .

teşrih

nBunun bağlamdan anlaşıldığını varsayarsak ,

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

İlk özel davayı kaldırabiliriz,

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

ve hala çalışıyor çünkü

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

ve diğerleri için y,

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

böylece tümevarım yoluyla elde ederiz f(2^n, y) = y.

CJam için parametrelerin sırasını tersine çevirmek daha uygun olur. Ve aralığı kullanmak yerine her değeri azaltarak 1 .. 2^naralığı kullanıyorum 0 .. 2^n - 1, bu yüzden uyguladığım özyinelemeli işlev

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.