As tabelas Laver fornecem exemplos de programas que não foram mostrados para terminar no sistema axiomático padrão da matemática ZFC, mas que terminam quando alguém assume axiomas cardinais muito grandes.
Introdução
As tabelas Laver clássicos são as álgebras finitas únicos com subjacente conjunto e uma operação que satisfaz a identidade e onde para e onde .An
{1,...,2n}
*
x * (y * z)=(x * y) * (x * z)
x*1=x+1
x<2n
2n*1=1
Mais informações sobre as tabelas clássicas do Laver podem ser encontradas no livro Tranças e auto-distributividade, de Patrick Dehornoy.
Desafio
Qual é o código mais curto (em bytes) que calcula 1*32
nas tabelas clássicas do Laver e termina exatamente quando encontra um n
com ? Em outras palavras, o programa termina se e somente se encontrar um com mas, caso contrário, ele será executado para sempre.1*32<2n
n
1*32<2n
Motivação
Um cardeal de classificação em hierarquia (também chamado de cardeal I3) é um nível extremamente grande de infinito e se alguém assume a existência de um cardeal de classificação em hierarquia, então é possível provar mais teoremas do que se não o fizer. supor a existência de um cardeal de classificação em classificação. Se existe um cardeal de classificação em classificação, então existe uma tabela clássica de Laver em que . No entanto, não há provas conhecidas disso no ZFC. Além disso, sabe-se que o menor onde é maior que (que é um número extremamente grande, uma vez que a função Ackermann é uma função de rápido crescimento). Portanto, qualquer programa desse tipo durará um período extremamente longo.An
1*32<2n
1*32<2n
n
1*32<2n
Ack(9,Ack(8,Ack(8,254)))
Ack
Quero ver o quão curto um programa pode ser escrito para que não saibamos se o programa termina usando o sistema axiomático ZFC padrão, mas onde sabemos que o programa termina eventualmente em um sistema axiomático muito mais forte, o ZFC + I3. Essa pergunta foi inspirada no post recente de Scott Aaronson, em que Aaronson e Adam Yedidia construíram uma máquina de Turing com menos de 8000 estados, de modo que o ZFC não pode provar que a máquina de Turing não termina, mas sabe-se que não termina quando alguém assume grandes hipóteses cardinais.
Como são calculadas as tabelas clássicas do Laver
Ao calcular tabelas do Laver, geralmente é conveniente usar o fato de que na álgebra , temos tudo para dentro .An
2n * x=x
x
An
O código a seguir calcula a tabela clássica do Laver An
# table (n, x, y) retorna x * y em A n tabela: = função (n, x, y) se x = 2 ^ n, em seguida, retorne y; elif y = 1 então retorne x + 1; caso contrário, retorne tabela (n, tabela (n, x, y-1), x + 1); fi; fim;
Por exemplo, a entrada table(4,1,2)
retornará 12
.
O código para table(n,x,y)
é bastante ineficiente e só pode computar na tabela Laver em um período de tempo razoável. Felizmente, existem algoritmos muito mais rápidos para calcular as tabelas Laver clássicas do que os dados acima.A4
fonte
Ack(9,Ack(8,Ack(8,254)))
é um limite inferior para a primeira tabela na qual a primeira linha possui o período 32, ou seja, onde1*16 < 2^n
?table(n,x,y)
e acho que serão necessários entre 25 e 30 estados para configurar as constantes e o loop externo. A única representação direta da TM que posso encontrar no esolangs.org é esolangs.org/wiki/ScripTur e não é realmente assim.Respostas:
Cálculo binário Lambda, 215 bits (27 bytes)
compila para (usando o software em https://github.com/tromp/AIT )
Esta solução se deve principalmente a https://github.com/int-e
fonte
CJam (
3632 bytes)Na prática, esse erro ocorre rapidamente porque transborda a pilha de chamadas, mas em uma máquina teórica ilimitada está correta, e entendo que essa é a suposição desta pergunta.
não está realmente correto se armazenarmos em cache os valores computados para evitar recalculá-los. Essa é a abordagem que
j
adotei , usando o operador (memoisation) . Ele testa A 6 em milissegundos e transborda o teste A 7 da pilha - e eu realmente desoptimizeitable
no interesse do golfe.Dissecação
Se assumirmos que isso
n
é entendido a partir do contexto, em vez depodemos remover o primeiro caso especial, dando
e ainda funciona porque
e para qualquer outro
y
,então, por indução, obtemos
f(2^n, y) = y
.Para CJam, é mais conveniente reverter a ordem dos parâmetros. E, em vez de usar o intervalo
1 .. 2^n
, estou usando o intervalo0 .. 2^n - 1
decrementando cada valor; portanto, a função recursiva que estou implementando éfonte
Pitão, 33 bytes
Experimente online! (Obviamente, a parte de teste não está incluída aqui.)
fonte
fi
no código?