Les tableaux de Laver fournissent des exemples de programmes qui ne se sont pas révélés se terminer dans le système axiomatique standard de mathématiques ZFC mais qui se terminent lorsque l'on suppose de très grands axiomes cardinaux.
introduction
Les tables classiques Laver sont les algèbres finies uniques avec ensemble sous - jacent et une opération qui satisfait l'identité et où pour et où .An
{1,...,2n}
*
x * (y * z)=(x * y) * (x * z)
x*1=x+1
x<2n
2n*1=1
Vous trouverez plus d'informations sur les tables Laver classiques dans le livre Braids and Self-Distributivity de Patrick Dehornoy.
Défi
Quel est le code le plus court (en octets) qui calcule 1*32
dans les tables Laver classiques et se termine précisément lorsqu'il trouve un n
avec ? En d'autres termes, le programme se termine si et seulement s'il trouve un avec mais sinon il s'exécute indéfiniment.1*32<2n
n
1*32<2n
Motivation
Un cardinal de rang (également appelé cardinal I3) est un niveau d'infini extrêmement élevé et si l'on suppose l'existence d'un cardinal de rang, alors on est en mesure de prouver plus de théorèmes que si l'on ne le fait pas. supposons l'existence d'un cardinal de rang en rang. S'il existe un cardinal de rang en rang, alors il y a une table Laver classique où . Cependant, il n'y a aucune preuve connue que dans ZFC. Par ailleurs, il est connu que le moins où est supérieur à (ce qui est un nombre extrêmement important puisque la fonction Ackermann est une fonction à croissance rapide). Par conséquent, un tel programme durera très longtemps.An
1*32<2n
1*32<2n
n
1*32<2n
Ack(9,Ack(8,Ack(8,254)))
Ack
Je veux voir à quel point un programme peut être écrit pour que nous ne sachions pas si le programme se termine en utilisant le système axiomatique standard ZFC mais où nous savons que le programme se termine finalement par un système axiomatique beaucoup plus fort, à savoir ZFC + I3. Cette question a été inspirée par le récent article de Scott Aaronson dans lequel Aaronson et Adam Yedidia ont construit une machine de Turing avec moins de 8000 états de sorte que ZFC ne peut pas prouver que la machine de Turing ne se termine pas mais est connue pour ne pas se terminer lorsque l'on suppose de grandes hypothèses cardinales.
Comment les tables Laver classiques sont calculées
Lors du calcul des tables , il est généralement Laver pratique d'utiliser le fait que , dans l'algèbre , nous avons pour tous dans .An
2n * x=x
x
An
Le code suivant calcule la table Laver classique An
# table (n, x, y) renvoie x * y dans A n table: = fonction (n, x, y) si x = 2 ^ n alors retourne y; elif y = 1 puis retourne x + 1; else retour table (n, table (n, x, y-1), x + 1); Fi; fin;
Par exemple, l'entrée table(4,1,2)
reviendra 12
.
Le code de table(n,x,y)
est plutôt inefficace et il ne peut calculer dans la table Laver que dans un délai raisonnable. Heureusement, il existe des algorithmes beaucoup plus rapides pour calculer les tables Laver classiques que ceux donnés ci-dessus.A4
la source
Ack(9,Ack(8,Ack(8,254)))
s'agit d'une borne inférieure pour le premier tableau dans lequel la première ligne a la période 32, c'est-à-dire où1*16 < 2^n
?table(n,x,y)
, et je pense qu'il faudra entre 25 et 30 états pour configurer les constantes et la boucle externe. La seule représentation directe de MT que je peux trouver sur esolangs.org est esolangs.org/wiki/ScripTur et ce n'est pas vraiment aussi golfique.Réponses:
Calcul lambda binaire, 215 bits (27 octets)
compile vers (en utilisant un logiciel à https://github.com/tromp/AIT )
Cette solution est principalement due à https://github.com/int-e
la source
CJam (
3632 octets)En pratique, cette erreur sort assez rapidement car elle déborde de la pile d'appels, mais sur une machine théorique illimitée, elle est correcte, et je comprends que c'est l'hypothèse de cette question.
n'est pas réellement correct si nous mettons en cache les valeurs calculées pour éviter de les recalculer. C'est l'approche que j'ai adoptée, en utilisant l'
j
opérateur (mémoisation) . Il teste A 6 en millisecondes et déborde le test de pile A 7 - et j'ai en fait désoptimisétable
dans l'intérêt du golf.Dissection
Si nous supposons que cela
n
est compris dans le contexte, au lieu denous pouvons retirer le premier cas spécial, en donnant
et ça marche toujours parce
et pour tout autre
y
,donc par induction nous obtenons
f(2^n, y) = y
.Pour CJam, il s'avère plus pratique d'inverser l'ordre des paramètres. Et plutôt que d'utiliser la plage,
1 .. 2^n
j'utilise la plage0 .. 2^n - 1
en décrémentant chaque valeur, donc la fonction récursive que j'implémente estla source
Pyth, 33 octets
Essayez-le en ligne! (Évidemment, la partie test n'est pas incluse ici.)
la source
fi
le code?