Te tabele Laver przykłady programów, które nie zostały pokazane, aby zakończyć się w standardowym systemie aksjomatyczną matematyki ZFC , ale które nie kończą, gdy zakłada bardzo duże aksjomaty kardynalnych.
Wprowadzenie
Klasyczne tabele Laver są unikalne skończone algebry z bazowego zestawu i operacja , która spełnia tożsamość i gdzie dla i gdzie .An
{1,...,2n}
*
x * (y * z)=(x * y) * (x * z)
x*1=x+1
x<2n
2n*1=1
Więcej informacji na temat klasycznych stołów Laver można znaleźć w książce Warkocze i autodystrybucja autorstwa Patricka Dehornoya.
Wyzwanie
Jaki jest najkrótszy kod (w bajtach), który oblicza się 1*32
w klasycznych tabelach Lavera i kończy się dokładnie, gdy znajdzie znak n
z ? Innymi słowy, program kończy się wtedy i tylko wtedy, gdy znajdzie się jednak inaczej działa zawsze.1*32<2n
n
1*32<2n
Motywacja
Szeregowych do rangi kardynał (zwane również I3-kardynał) jest bardzo duży poziom nieskończoność i jeśli ktoś zakłada istnienie kardynała szeregowych do rangi, a następnie z nich jest w stanie udowodnić kolejne twierdzenia, niż gdyby ktoś nie założyć istnienie kardynała szeregowego. Jeśli istnieje kardynał rangi, to istnieje jakiś klasyczny stół Laver, gdzie . Jednak nie ma znanego dowodu na to, że w ZFC. Ponadto wiadomo, że najmniej gdzie jest większe niż (co jest wyjątkowo dużą liczbą, ponieważ funkcja Ackermanna jest funkcją szybko rosnącą). Dlatego każdy taki program będzie trwał bardzo długo.An
1*32<2n
1*32<2n
n
1*32<2n
Ack(9,Ack(8,Ack(8,254)))
Ack
Chcę zobaczyć, jak krótki jest program, abyśmy nie wiedzieli, czy program kończy się przy użyciu standardowego systemu aksomatycznego ZFC, ale gdzie wiemy, że program ostatecznie kończy się w znacznie silniejszym systemie aksomatycznym, a mianowicie ZFC + I3. Pytanie to zostało zainspirowane najnowszym postem Scotta Aaronsona, w którym Aaronson i Adam Yedidia skonstruowali maszynę Turinga z mniej niż 8000 stanów, tak że ZFC nie może udowodnić, że maszyna Turinga się nie kończy, ale wiadomo, że nie kończy się, gdy przyjmuje się duże hipotezy kardynalne.
Jak obliczane są klasyczne tabele Lavera
Przy obliczaniu tabele Laver zwykle jest wygodny w użyciu, że w algebrze , mamy dla wszystkich w .An
2n * x=x
x
An
Poniższy kod oblicza klasyczną tabelę Lavera An
# tabela (n, x, y) zwraca x * y w A n tabela: = funkcja (n, x, y) jeśli x = 2 ^ n, to zwróć y; elif y = 1, a następnie zwraca x + 1; w przeciwnym razie zwraca tabelę (n, tabela (n, x, y-1), x + 1); fi; koniec;
Na przykład dane wejściowe table(4,1,2)
zostaną zwrócone 12
.
Kod dla table(n,x,y)
jest raczej nieefektywny i może obliczyć tylko w tabeli Laver w rozsądnym czasie. Na szczęście istnieją znacznie szybsze algorytmy obliczania klasycznych tabel Lavera niż te podane powyżej.A4
źródło
Ack(9,Ack(8,Ack(8,254)))
jest to dolna granica dla pierwszej tabeli, w której pierwszy rząd ma okres 32, tj. Gdzie1*16 < 2^n
?table(n,x,y)
i myślę, że ustawienie stałych i pętli zewnętrznej zajmie od 25 do 30 stanów. Jedyną bezpośrednią reprezentacją TM, którą mogę znaleźć na stronie esolangs.org, jest esolangs.org/wiki/ScripTur i nie jest tak naprawdę golfowa.Odpowiedzi:
Binary Lambda Calculus, 215 bitów (27 bajtów)
kompiluje się do (przy użyciu oprogramowania na https://github.com/tromp/AIT )
To rozwiązanie wynika głównie z https://github.com/int-e
źródło
CJam (
3632 bajty)W praktyce powoduje to dość szybki błąd, ponieważ przepełnia stos wywołań, ale na teoretycznej nielimitowanej maszynie jest to poprawne i rozumiem, że to założenie tego pytania.
nie jest właściwie poprawne, jeśli buforujemy obliczone wartości, aby uniknąć ich ponownego obliczenia. Takie podejście zastosowałem, używając
j
operatora (zapamiętywania) . Testuje A 6 w milisekundach i przepełnia stos A 7 - a tak naprawdę zostałem zoptymalizowanytable
w interesie gry w golfa.Sekcja
Jeśli założymy, że
n
rozumiemy to z kontekstu, zamiastmożemy usunąć pierwszy specjalny przypadek, dając
i nadal działa, ponieważ
i dla każdego innego
y
,więc przez indukcję otrzymujemy
f(2^n, y) = y
.W przypadku CJam wygodniej jest odwrócić kolejność parametrów. I zamiast używać zakresu
1 .. 2^n
, używam zakresu0 .. 2^n - 1
, zmniejszając każdą wartość, więc implementuję funkcję rekurencyjnąźródło
Pyth, 33 bajty
Wypróbuj online! (Oczywiście część testowa nie jest tutaj uwzględniona.)
źródło
fi
oznacza kod?