Tính toán bảng Laver và một thuật toán không được biết là chấm dứt trong ZFC


12

Các bảng Laver cung cấp các ví dụ về các chương trình chưa được chứng minh là chấm dứt trong hệ tiên đề chuẩn của toán học ZFC nhưng sẽ chấm dứt khi người ta giả sử các tiên đề rất lớn.

Giới thiệu

Các bảng Laver cổ điển là các đại số hữu hạn duy nhất với tập hợp cơ bản và một hoạt động thỏa mãn danh tính và nơi cho và ở đâu .An{1,...,2n}*x * (y * z)=(x * y) * (x * z)x*1=x+1x<2n2n*1=1

Thông tin thêm về các bảng Laver cổ điển có thể được tìm thấy trong cuốn sách Bện và Tự phân phối của Patrick Dehornoy.

Thử thách

Mã ngắn nhất (tính bằng byte) tính toán 1*32trong các bảng Laver cổ điển và chấm dứt chính xác khi tìm thấy nvới ? Nói cách khác, chương trình chấm dứt khi và chỉ khi nó tìm thấy với nhưng nếu không thì nó chạy mãi mãi.1*32<2nn1*32<2n

Động lực

Một hồng y cấp bậc (còn gọi là hồng y I3) là một mức độ vô cùng lớn và nếu người ta giả sử sự tồn tại của một hồng y cấp bậc, thì người ta có thể chứng minh nhiều định lý hơn là không có giả sử sự tồn tại của một hồng y cấp bậc. Nếu có tồn tại một hồng y cấp bậc, thì có một bảng Laver cổ điển ở đâu . Tuy nhiên, không có bằng chứng nào được biết rằng trong ZFC. Hơn nữa, người ta biết rằng ít nhất là nơi lớn hơn (là một con số cực kỳ lớn vì hàm Ackermann là một hàm tăng trưởng nhanh). Do đó, bất kỳ chương trình như vậy sẽ kéo dài trong một khoảng thời gian rất dài.An1*32<2n1*32<2nn1*32<2nAck(9,Ack(8,Ack(8,254)))Ack

Tôi muốn xem chương trình có thể được viết ngắn đến mức nào để chúng tôi không biết liệu chương trình đó có kết thúc bằng hệ thống tiên đề chuẩn ZFC hay không nhưng chúng tôi biết rằng chương trình cuối cùng kết thúc trong một hệ tiên đề mạnh hơn nhiều, cụ thể là ZFC + I3. Câu hỏi này được lấy cảm hứng từ bài đăng gần đây của Scott Aaronson, trong đó Aaronson và Adam Yedidia đã chế tạo một máy Turing với dưới 8000 trạng thái để ZFC không thể chứng minh rằng máy Turing không chấm dứt nhưng được biết là không chấm dứt khi giả định về các giả thuyết lớn.

Cách các bảng Laver cổ điển được tính toán

Khi tính toán các bảng Laver thường thuận tiện để sử dụng thực tế là trong đại số , chúng ta có tất cả trong .An2n * x=xxAn

Đoạn mã sau tính toán bảng Laver cổ điển An

# bảng (n, x, y) trả về x * y trong A n
bảng: = hàm (n, x, y)
nếu x = 2 ^ n thì trả về y;
elif y = 1 sau đó trả về x + 1;
bảng trả về khác (n, bảng (n, x, y-1), x + 1); fi; kết thúc;

Ví dụ, đầu vào table(4,1,2)sẽ trở lại 12.

Mã cho table(n,x,y)khá kém hiệu quả và nó chỉ có thể tính toán trong bảng Laver trong một khoảng thời gian hợp lý. May mắn thay, có các thuật toán nhanh hơn nhiều để tính toán các bảng Laver cổ điển so với các thuật toán được đưa ra ở trên.A4


1
Chào mừng đến với PPCG! Bài đăng tuyệt vời!
NoOneIsHãy là

1
Theo Wikipedia, Ack (9, Ack (8, Ack (8,254))) là giới hạn dưới của n trong đó khoảng thời gian vượt quá 16. Đối với điều đó, chúng ta có thể kiểm tra 1 * 16 thay vì 1 * 32. Tôi sẽ sửa đổi chương trình của tôi cho phù hợp.
John Tromp

1
Tôi đã bắt đầu viết lên một máy Turing để làm điều này và tôi nghĩ rằng tôi đã phát hiện ra một lỗi ngoài hai yếu tố. Không Dougherty chứng minh rằng đó Ack(9,Ack(8,Ack(8,254)))là giới hạn thấp hơn cho bảng đầu tiên trong đó hàng đầu tiên có chu kỳ 32, tức là ở đâu 1*16 < 2^n?
Peter Taylor

1
Nếu bạn có một máy 20 ký hiệu 2 trạng thái cho Ackermann thì xin vui lòng cho tôi một liên kết, bởi vì tôi có thể có thể ăn cắp một số ý tưởng từ nó. Tôi có 44 trạng thái để tính toán table(n,x,y)và tôi nghĩ sẽ mất từ ​​25 đến 30 trạng thái để thiết lập các hằng số và vòng lặp bên ngoài. Đại diện TM trực tiếp duy nhất tôi có thể tìm thấy trên esolangs.org là esolangs.org/wiki/ScripTur và nó không thực sự như vậy.
Peter Taylor

1
cheddarmonk.org/ con / laver.pdf nhiều như tôi mong đợi sẽ hoàn thành trong tuần này, bởi vì tôi sẽ đi du lịch.
Peter Taylor

Câu trả lời:


3

Tính toán Lambda nhị phân, 215 bit (27 byte)

\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;
  dblmin1 = \n\f\x. n f (n f (f x)); -- map n to 2*n-1
  go2 = \mx. laver mx sweet mx (\_. mx) (go2 (dblmin1 mx));
in go2 one

biên dịch thành (sử dụng phần mềm tại https://github.com/tromp/AIT )

000101000110100000010101010100011010000000010110000101111110011110010111
110111100000010101111100000011001110111100011000100000101100100010110101
00000011100111010100011001011101100000010111101100101111011001110100010

Giải pháp này chủ yếu là do https://github.com/int-e


2
Tôi không chắc làm thế nào bạn có được điểm số của mình nhưng theo mặc định, các bài nộp sẽ được ghi theo số byte trong mã. Tôi đếm 375 byte cho bài nộp này. Bạn cũng nên bao gồm tên ngôn ngữ và tùy chọn một liên kết đến một thông dịch viên cho ngôn ngữ.
Alex A.

Bạn có thể nên bao gồm mã chính xác có độ dài 234 bit trong bài viết của mình.
Máy

2
Mã hóa có thể được tìm thấy trên Wikipedia . Ngoài ra còn có một liên kết đến thông dịch viên này (không được kiểm tra). Chúng nên được kiểm tra, mặc dù, và mã hóa nhị phân cũng nên có trong bài viết.
PurkkaKoodari

Đối với các ngôn ngữ được biên dịch, chúng tôi chấm điểm mã được viết bởi người dùng - không phải số byte trong tệp nhị phân được tạo.
Alex A.

4
@AlexA. Điều đó không cần thiết ... bất kỳ dạng mã nào có thể được hiểu bởi trình biên dịch hoặc trình thông dịch đều ổn.
frageum

4

CJam ( 36 32 byte)

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

Trong thực tế, lỗi này xảy ra khá nhanh vì nó tràn vào ngăn xếp cuộc gọi, nhưng trên một máy không giới hạn về mặt lý thuyết thì nó chính xác và tôi hiểu rằng đó là giả định của câu hỏi này.

Mã cho table(n,x,y)khá kém hiệu quả và nó chỉ có thể tính toán trong bảng Laver A 4 trong một khoảng thời gian hợp lý.

không thực sự chính xác nếu chúng ta lưu trữ các giá trị được tính toán để tránh tính toán lại chúng. Đó là cách tiếp cận tôi đã thực hiện, sử dụng jtoán tử (phân biệt) . Nó kiểm tra Một 6 bằng mili giây và tràn stack thử nghiệm Một 7 - và tôi đã thực sự deoptimised table vì lợi ích của chơi golf.

Mổ xẻ

Nếu chúng ta cho rằng điều đó nđược hiểu từ ngữ cảnh, thay vì

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

chúng ta có thể loại bỏ trường hợp đặc biệt đầu tiên, đưa ra

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

và nó vẫn hoạt động vì

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

và cho bất kỳ ai khác y,

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

do đó bằng cảm ứng, chúng tôi nhận được f(2^n, y) = y.

Đối với CJam, nó trở nên thuận tiện hơn để đảo ngược thứ tự của các tham số. Và thay vì sử dụng phạm vi 1 .. 2^ntôi đang sử dụng phạm vi 0 .. 2^n - 1bằng cách giảm từng giá trị, vì vậy hàm đệ quy tôi đang triển khai là

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.