Розрахунки таблиць лавер та алгоритм, який, як відомо, не закінчується в ZFC


12

У таблицях Laver наведено приклади програм, за якими не було показано, що вони закінчуються в стандартній аксіоматичній системі математики ZFC, але вони припиняються, коли приймаються дуже великі кардіологічні аксіоми.

Вступ

Класичні столи Laver є єдиними кінцевими алгебри з основним безліччю і операція , яка задовольняє ідентичності і де для і де .An{1,...,2n}*x * (y * z)=(x * y) * (x * z)x*1=x+1x<2n2n*1=1

Більше інформації про класичні таблиці Лавер можна знайти у книзі «Коси та саморозповсюдження» Патріка Дехорного.

Виклик

Який найкоротший код (у байтах), який обчислюється 1*32в класичних таблицях Laver і закінчується точно, коли він знаходить nс ? Іншими словами, програма припиняється, якщо і тільки якщо вона знайде з, але в іншому випадку вона працює вічно.1*32<2nn1*32<2n

Мотивація

Ранг в-ранг кардинал (також званий I3-кардинал) є надзвичайно великим рівнем нескінченності і , якщо припустити існування кардинала рангу в-ранг, то один може довести більше теорем , ніж якби один не робить припустимо існування рангового кардинала. Якщо існує ранг в-ранг кардинала, тобто деяка класична таблиця умивальник де . Однак невідомо доказів того, що в ZFC. Крім того, відомо, що найменше там, де більше (що надзвичайно велика кількість, оскільки функція Акермана є швидко зростаючою функцією). Тому будь-яка така програма триватиме надзвичайно довгий час.An1*32<2n1*32<2nn1*32<2nAck(9,Ack(8,Ack(8,254)))Ack

Я хочу побачити, наскільки коротко програми можна записати, щоб ми не знали, чи програма припиняється за допомогою стандартної аксіоматичної системи ZFC, але де ми знаємо, що програма врешті-решт закінчується в набагато сильнішій аксіоматичній системі, а саме ZFC + I3. Це питання надихнуло недавній пост Скотта Ааронсона, в якому Ааронсон та Адам Єдідія побудували машину Тьюрінга з станами менше 8000, так що ZFC не може довести, що машина Тьюрінга не припиняється, але, як відомо, не припиняється, коли передбачається велика кардинальна гіпотеза.

Як обчислюються класичні таблиці Лавер

При обчисленні таблиць LAVER це, як правило , зручно використовувати той факт , що в алгебрі , у нас є для всіх в .An2n * x=xxAn

Наступний код обчислює класичну таблицю Laver An

# table (n, x, y) повертає x * y в A n
таблиця: = функція (n, x, y)
якщо x = 2 ^ n, тоді повертаємо y;
elif y = 1, тоді повертаємо x + 1;
інша таблиця повернення (n, таблиця (n, x, y-1), x + 1); fi; кінець;

Наприклад, вхід table(4,1,2)повернеться 12.

Код для table(n,x,y)досить неефективний, і він може обчислюватися в таблиці Laver лише за розумну кількість часу. На щастя, існують набагато швидші алгоритми для обчислення класичних таблиць Лавера, ніж наведені вище.A4


2
Ласкаво просимо до PPCG! Чудовий пост!
NoOneIsHere

1
Згідно з Вікіпедією, Ack (9, Ack (8, Ack (8, 254))) - нижня межа n, для якої період перевищує 16. Для цього ми можемо перевірити 1 * 16, а не 1 * 32. Я внесу зміни до своєї програми відповідно.
Джон Тромп

1
Я почав писати машину Тюрінга, щоб зробити це, і, думаю, я помітив помилку, що склалася за двома факторами. Хіба Даггерті не довів, що Ack(9,Ack(8,Ack(8,254)))це нижня межа для першої таблиці, в якій перший рядок має період 32, тобто де 1*16 < 2^n?
Пітер Тейлор

1
Якщо у вас Ackermann має 20-ти станковий автомат, то, будь ласка, дайте мені посилання, тому що я, мабуть, можу вкрасти з нього деякі ідеї. У мене є 44 стану для обчислення table(n,x,y), і я думаю, що для налаштування констант і зовнішньої петлі знадобиться між 25 і 30 станами. Єдине пряме представлення ТМ, яке я можу знайти на esolangs.org, - це esolangs.org/wiki/ScripTur, і це насправді не так сильно.
Пітер Тейлор

1
cheddarmonk.org/papers/laver.pdf - це стільки, скільки я очікую зробити на цьому тижні, тому що я збираюся подорожувати.
Пітер Тейлор

Відповіді:


4

Двійковий обчислення лямбда, 215 біт (27 байт)

\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

компілює в (використовуючи програмне забезпечення на веб- сайті https://github.com/tromp/AIT )

000101000110100000010101010100011010000000010110000101111110011110010111
110111100000010101111100000011001110111100011000100000101100100010110101
00000011100111010100011001011101100000010111101100101111011001110100010

Таке рішення здебільшого пояснюється https://github.com/int-e


2
Я не впевнений, як ви отримали свій бал, але за замовчуванням подання слід оцінювати відповідно до кількості байтів у коді. Я рахую 375 байт для цього подання. Ви також повинні вказати назву мови та необов'язково посилання на перекладача для цієї мови.
Олексій А.

Ви, ймовірно, повинні включити точний код довжиною 234 біт у свій пост.
CalculatorFeline

2
Кодування можна знайти у Вікіпедії . Також є посилання на цей перекладач (не перевірено). Вони повинні бути перевірені, однак, і двійкове кодування також повинно бути в пості.
PurkkaKoodari

1
Для складених мов ми оцінюємо код, написаний користувачем - не кількість байтів у створеному двійковому файлі.
Олексій А.

5
@AlexA. Це не обов'язково ... будь-яка форма коду, яку може зрозуміти компілятор або інтерпретатор, це добре.
feersum

4

CJam ( 36 32 байти)

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

На практиці ця помилка виходить досить швидко, оскільки вона переповнює стек викликів, але на теоретичній необмеженій машині це правильно, і я розумію, що це припущення цього питання.

Код для table(n,x,y)досить неефективний, і він може обчислювати лише в таблиці Laver A 4 за розумну кількість часу.

насправді не правильно, якщо ми кешуємо обчислені значення, щоб уникнути їх перерахування. Ось такий підхід я застосував, використовуючи jоператор (пам'ять) . Він тестує A 6 в мілісекундах і переповнює тест стека A 7 - і я фактично деоптимізувався table в інтересах гольфу.

Розсічення

Якщо припустити, що nце розуміється з контексту, а не з

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

ми можемо зняти перший особливий випадок, даючи

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

і це все ще працює тому, що

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

і для будь-якого іншого y,

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

тому за допомогою індукції ми отримуємо f(2^n, y) = y.

Для CJam виявляється зручнішим змінити порядок параметрів. І замість того, щоб використовувати діапазон, 1 .. 2^nя використовую діапазон 0 .. 2^n - 1, зменшуючи кожне значення, тому рекурсивна функція, яку я реалізую, - це

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.