Las tablas de Laver proporcionan ejemplos de programas que no se ha demostrado que terminen en el sistema axiomático estándar de matemática ZFC, pero que terminan cuando se asumen axiomas cardinales muy grandes.
Introducción
Las tablas Laver clásicas son las álgebras finitas únicos con el conjunto subyacente y una operación que satisface la identidad y donde para y donde .An
{1,...,2n}
*
x * (y * z)=(x * y) * (x * z)
x*1=x+1
x<2n
2n*1=1
Se puede encontrar más información sobre las tablas clásicas de Laver en el libro Braids and Self-Distributivity de Patrick Dehornoy.
Desafío
¿Cuál es el código más corto (en bytes) que se calcula 1*32
en las tablas clásicas de Laver y termina precisamente cuando encuentra un n
con ? En otras palabras, el programa termina si y solo si encuentra un con pero de lo contrario se ejecuta para siempre.1*32<2n
n
1*32<2n
Motivación
Un cardenal de rango dentro de rango (también llamado cardenal I3) es un nivel extremadamente grande de infinito y si uno asume la existencia de un cardenal de rango dentro de rango, entonces puede probar más teoremas que si no lo hace Supongamos la existencia de un cardenal de rango en rango. Si existe un cardenal de rango en rango, entonces hay alguna tabla clásica de Laver donde . Sin embargo, no hay pruebas conocidas de que en ZFC. Además, se sabe que el menor donde es mayor que (que es un número extremadamente grande ya que la función de Ackermann es una función de rápido crecimiento). Por lo tanto, cualquier programa de este tipo durará mucho tiempo.An
1*32<2n
1*32<2n
n
1*32<2n
Ack(9,Ack(8,Ack(8,254)))
Ack
Quiero ver qué tan corto se puede escribir un programa para que no sepamos si el programa termina usando el sistema axiomático estándar ZFC, pero si sabemos que el programa finalmente termina en un sistema axiomático mucho más fuerte, a saber, ZFC + I3. Esta pregunta se inspiró en la reciente publicación de Scott Aaronson en la que Aaronson y Adam Yedidia han construido una máquina de Turing con menos de 8000 estados, de modo que ZFC no puede probar que la máquina de Turing no termina pero se sabe que no termina cuando se asumen grandes hipótesis cardinales.
Cómo se calculan las tablas clásicas de Laver
Cuando se calculan las tablas Laver lo general es conveniente utilizar el hecho de que en el álgebra , tenemos para todos en .An
2n * x=x
x
An
El siguiente código calcula la tabla clásica de Laver An
# table (n, x, y) devuelve x * y en A n tabla: = función (n, x, y) si x = 2 ^ n entonces devuelve y; elif y = 1 luego devuelve x + 1; else return table (n, tabla (n, x, y-1), x + 1); fi; final;
Por ejemplo, la entrada table(4,1,2)
volverá 12
.
El código para table(n,x,y)
es bastante ineficiente y solo puede calcular en la tabla Laver en un período de tiempo razonable. Afortunadamente, existen algoritmos mucho más rápidos para computar las tablas clásicas de Laver que los que se dan arriba.A4
fuente
Ack(9,Ack(8,Ack(8,254)))
es un límite inferior para la primera tabla en la que la primera fila tiene el período 32, es decir, dónde1*16 < 2^n
?table(n,x,y)
, y creo que tomará entre 25 y 30 estados para configurar las constantes y el bucle externo. La única representación directa de TM que puedo encontrar en esolangs.org es esolangs.org/wiki/ScripTur y no es realmente tan elegante.Respuestas:
Cálculo binario de Lambda, 215 bits (27 bytes)
compila a (utilizando software en https://github.com/tromp/AIT )
Esta solución se debe principalmente a https://github.com/int-e
fuente
CJam (
3632 bytes)En la práctica, esto se corrige rápidamente porque desborda la pila de llamadas, pero en una máquina teórica ilimitada es correcto, y entiendo que esa es la suposición de esta pregunta.
en realidad no es correcto si almacenamos en caché los valores calculados para evitar volver a calcularlos. Ese es el enfoque que he tomado, utilizando el
j
operador (memorización) . Prueba A 6 en milisegundos y desborda la pila probando A 7 , y en realidad me he desmotivadotable
en interés del golf.Disección
Si suponemos que
n
se entiende desde el contexto, en lugar depodemos quitar el primer caso especial, dando
y todavía funciona porque
y para cualquier otro
y
,entonces por inducción obtenemos
f(2^n, y) = y
.Para CJam resulta más conveniente invertir el orden de los parámetros. Y en lugar de usar el rango
1 .. 2^n
, estoy usando el rango0 .. 2^n - 1
al disminuir cada valor, por lo que la función recursiva que estoy implementando esfuente
Pyth, 33 bytes
Pruébalo en línea! (Obviamente, la parte de prueba no está incluida aquí).
fuente
fi
en el código?