Các chương trình rất ngắn với tình trạng tạm dừng chưa biết là gì?


32

Chương trình 579 bit này trong Tính toán nhị phân Lambda có trạng thái tạm dừng không xác định:

01001001000100010001000101100111101111001110010101000001110011101000000111001110
10010000011100111010000001110011101000000111001110100000000111000011100111110100
00101011000000000010111011100101011111000000111001011111101101011010000000100000
10000001011100000000001110010101010101010111100000011100101010110000000001110000
00000111100000000011110000000001100001010101100000001110000000110000000100000001
00000000010010111110111100000010101111110000001100000011100111110000101101101110
00110000101100010111001011111011110000001110010111111000011110011110011110101000
0010110101000011010

Đó là, không biết liệu chương trình này chấm dứt hay không. Để xác định nó, bạn phải giải quyết phỏng đoán Collatz - hoặc, ít nhất, cho tất cả các số lên tới 2 ^ 256. Trên kho lưu trữ này có một lời giải thích đầy đủ về cách chương trình này đã thu được.

Có (nhiều) chương trình BLC ngắn hơn cũng có tình trạng tạm dừng không xác định?


6
Câu hỏi rất liên quan . Cộng đồng bình chọn, xin vui lòng: trùng lặp?
Raphael

9
Nhiệm vụ thể hiện một chương trình như vậy trong càng ít bit càng tốt dường như là một vấn đề của Code Golf , ít hơn là khoa học máy tính .
Raphael

2
Tôi nghĩ rằng câu trả lời của Ricky về TM 5 trạng thái tốt hơn câu hỏi ban đầu. Nếu cái này được đóng lại dưới dạng dupe, câu trả lời có thể được di chuyển không?
David Richerby


6
Bạn đang thiếu một chi tiết chính: bạn chưa chỉ định ngôn ngữ nào chương trình phải được viết. Ví dụ của bạn sử dụng phép tính lambda nhị phân - đó có phải là ngôn ngữ duy nhất bạn quan tâm không? Chúng ta có thể thấy việc phát triển chương trình 1 bit có trạng thái tạm dừng không xác định là rất đơn giản, chỉ đơn giản bằng cách nhúng phần thân của thuật toán trực tiếp vào chính ngôn ngữ. Đó là một lỗ hổng, nhưng bạn phải chú ý khi yêu cầu giải pháp chơi gôn. Họ yêu những sơ hở của họ! Sự phức tạp Kolmogov có thể là một chủ đề quan trọng để khám phá ở đây.
Cort Ammon - Phục hồi Monica

Câu trả lời:


30

Vâng. Trang này cho biết có 98 5-state máy Turing có trạng thái ngập ngừng chưa được biết. Thật khó chịu, nó không đưa ra bất kỳ ví dụ nào về những chiếc máy như vậy, nhưng trang 26 tuổi này cung cấp cho 2 máy Turing 5 trạng thái có trạng thái tạm dừng rõ ràng vào thời điểm đó. (Tìm kiếm "bộ đếm đơn giản" sẽ đưa bạn đến ngay giữa những người đó 2.) Tôi đã sao chép chúng ở đây trong trường hợp liên kết bị hỏng:

Input Bit   Transition on State     Steps            Comment
             A   B   C   D   E

    0       B1L C1R D0R A1L H1L   > 2*(10^9)       ``chaotic''
    1       B1R E0L A0L D0R C0L

    0       B1L A0R C0R E1L B0L       ?        complex ``counter''
    1       A1R C0L D1L A0R H1L

Phần dưới cùng của trang có nội dung: $ Ngày: 2007/11/03, sau đó 26 tuổi như thế nào?
Falaque

1
@Falaque Đầu trang có ghi "Trang này là bản viết lại HTML của tác giả ... tháng 2 năm 1990". Văn bản này 26 tuổi, phiên bản thành HTML là từ (hoặc được cập nhật lần cuối) vào năm 2007
IMSoP

5

Phỏng đoán Collatz:

Chương trình sau luôn tạm dừng:

void function( ArbitraryInteger input){
     while( input > 1){
            if(input % 2 == 0)
                input /= 2;
            else
                input = (input*3) + 1;
     }

     // Halt here
}

Biến thể nhẹ (vẫn là một phỏng đoán, bởi vì nó dựa trên kết quả từ kết quả của Collatz):

Đối với một số đầu vào, chương trình sau sẽ không bao giờ nhập cùng một trạng thái hai lần (trong đó trạng thái được xác định bởi giá trị được giữ bởi "đầu vào"):

void function( ArbitraryInteger input){
     while( input >= 1){ // notice the "="
            if(input % 2 == 0)
                input /= 2;
            else
                input = (input*3) + 1;
     }
}

Lưu ý rằng chương trình thứ hai không bao giờ tạm dừng, bất kể chương trình thứ nhất có dừng lại hay không.

Người ta tin rằng chương trình đầu tiên luôn chấm dứt cho bất kỳ đầu vào nào, tuy nhiên, chúng tôi không có bằng chứng về điều đó và vẫn có thể tồn tại một số nguyên mà chương trình không dừng lại (còn có giải thưởng 100 đô la để chứng minh điều đó) .

Chương trình thứ hai cũng thú vị: nó nói rằng chương trình sẽ không bao giờ nhập cùng một trạng thái hai lần cho một số đầu vào, về cơ bản đòi hỏi chương trình đầu tiên phải có một chuỗi được biết để phân kỳ mà không lặp lại. Nó không chỉ yêu cầu phỏng đoán Collatz là sai, mà còn yêu cầu nó sai và không có vòng lặp , ngoài vòng lặp 1,4,2,1 rõ ràng.

  • Nếu Collatz chỉ lặp các ví dụ ngược lại thì biến thể trên phỏng đoán là sai

  • Nếu Collatz sai mà không có vòng lặp, thì biến thể của phỏng đoán là đúng

  • Nếu Collatz là đúng, biến thể là sai

  • Nếu Collatz sai cả vì nó có các vòng lặp và vì nó có một số mà nó phân kỳ, thì biến thể của phỏng đoán là đúng (nó chỉ yêu cầu một số mà nó phân kỳ mà không cần vào một vòng lặp)

Tôi nghĩ rằng các biến thể là thú vị hơn (không chỉ vì tôi tình cờ tìm thấy nó và nhận thấy nó nhờ @LieuweVinkhuijzen), mà bởi vì nó thực sự đòi hỏi một bằng chứng thực sự. Bằng cách cưỡng bức, chúng ta có thể tìm thấy một vòng lặp ngày này hay ngày khác (và đó sẽ là một vòng lặp dài hơn 70 số: trạng thái hiện tại của nghệ thuật là không thể có các vòng lặp vô hạn ngắn hơn 68 hoặc hơn), và vũ phu cưỡng bức không thú vị: nó chỉ là số giòn. Tuy nhiên, chúng tôi không thể tạo ra một chuỗi phân kỳ vô hạn, chúng tôi không biết liệu nó có thực sự kết thúc mà không có bằng chứng thực sự hay không.

EDIT: Tôi đã bỏ qua phần về Collatz Conjecture, tôi thực sự đã trả lời bằng một thuật toán mà tôi đã đọc cách đây vài năm, tôi không ngờ rằng nó đã được đề cập.

EDIT2: Một nhận xét khiến tôi chú ý rằng tôi đã viết thuật toán với một lỗi, tuy nhiên, sai lầm đó thực sự làm cho câu trả lời của tôi khác với phỏng đoán Collatz (nhưng là một biến thể trực tiếp của nó).


1
input > 1input >= 11421

Bạn nói đúng, tôi muốn đặt một >, tuy nhiên miễn là chúng tôi không có bằng chứng cho việc tạm dừng với >chúng tôi không thể chắc chắn chúng tôi sẽ đạt được 1 -> 4 -> 2 -> 1vòng lặp (ví dụ: nếu nó không chấm dứt vì >nó không ' t đạt >=)
Nhà phát triển GameD

1
>=14211421>=>

2
n<1n=1n4n>1n11

1
Điều đó đúng :) Bạn nói đúng, tôi nên thêm 'nếu phỏng đoán Collatz là đúng' vào bình luận đầu tiên của tôi. Tôi thấy chỉnh sửa của bạn, rất tốt. Bạn không cần chương trình thứ hai, bởi vì phỏng đoán 'chương trình này không bao giờ vào cùng một trạng thái hai lần' cũng không được giải quyết trong chương trình thứ nhất: có thể có một số không chuyển hướng thành vô tận, nhưng thay vào đó lại bị kẹt trong một vòng lặp lớn ở đâu đó lên với số lượng rất cao.
Liêuwe Vinkhuijzen
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.