Thoát khỏi tarpit (Cảnh sát)


9

Đây là một thử thách dựa trên việc xác định ngôn ngữ và chứng minh rằng chúng đã hoàn thành Turing.

Đây là chủ đề của cảnh sát. Chủ đề của bọn cướp ở đây .

Cảnh sát

Là một cảnh sát, bạn sẽ chuẩn bị hai điều:

  • Một đặc điểm kỹ thuật chính thức của ngôn ngữ lập trình hoặc hệ thống tính toán khác. (Hệ thống tính toán được định nghĩa dưới đây.)

  • Một bằng chứng cho thấy hệ thống của bạn đã hoàn thành Turing, theo định nghĩa hơi nghiêm ngặt dưới đây.

Bạn sẽ đăng thông số kỹ thuật ngôn ngữ của mình và bọn cướp sẽ cố gắng "bẻ khóa" nó bằng cách chứng minh tính hoàn chỉnh của Turing. Nếu bài nộp của bạn không bị bẻ khóa trong vòng một tuần, bạn có thể đánh dấu nó là an toàn và đăng bằng chứng của mình. (Câu trả lời của bạn có thể bị vô hiệu nếu ai đó tìm thấy lỗ hổng trong bằng chứng của bạn, trừ khi bạn có thể sửa nó.)

Đây là một , vì vậy người chiến thắng sẽ là câu trả lời có nhiều phiếu bầu nhất và không bị bẻ khóa hoặc vô hiệu. Thử thách đã kết thúc mở - tôi sẽ không chấp nhận câu trả lời.

Vì lợi ích của thách thức này, một hệ thống tính toán sẽ được định nghĩa là bốn điều:

  • Một "bộ chương trình" P. Đây sẽ là một tập hợp vô hạn có thể đếm được, ví dụ: chuỗi, số nguyên, cây nhị phân, cấu hình pixel trên lưới, v.v. (Nhưng hãy xem giới hạn kỹ thuật bên dưới.)

  • Một "tập hợp đầu vào" I, cũng sẽ là một tập hợp vô hạn có thể đếm được và không cần phải là tập hợp giống như P(mặc dù có thể như vậy).

  • Một "bộ đầu ra" O, tương tự sẽ là một tập hợp vô hạn có thể đếm được và có thể hoặc không giống PhoặcI

  • Một thủ tục xác định, cơ học để tạo ra một đầu ra otừ chương trình pvà đầu vào i, trong đó p, iolà thành viên của P, IOtương ứng. Về nguyên tắc, quy trình này phải được thực hiện trên máy Turing hoặc mô hình tính toán trừu tượng khác. Tất nhiên, thủ tục có thể không dừng lại, tùy thuộc vào chương trình và đầu vào của nó.

Các bộ P, IOphải được như vậy mà bạn có thể thể hiện chúng như dây đàn một cách tính toán. (Đối với hầu hết các lựa chọn hợp lý, điều này sẽ không thành vấn đề; quy tắc này tồn tại để ngăn bạn chọn các bộ lạ, chẳng hạn như bộ máy Turing không dừng lại.)

Tính đầy đủ của Turing sẽ được định nghĩa như sau:

  • Đối với bất kỳ chức năng một phần tính toán ftừ Iđến O, tồn tại một chương trình ptrong Pđó có đưa pvà đầu vào i, đầu ra là f(i)nếu f(i)có một giá trị. (Nếu không thì chương trình không dừng lại.)

Từ "tính toán" trong định nghĩa trên có nghĩa là "có thể được tính bằng máy Turing".

Lưu ý rằng cả quy tắc 110thẻ tuần hoàn bit đều không hoàn thành Turing theo định nghĩa này, bởi vì chúng không có cấu trúc đầu vào-đầu ra bắt buộc. Tính toán Lambda là Turing hoàn chỉnh, miễn là chúng ta xác định IOlà số của Giáo hội . (Nó không hoàn chỉnh nếu chúng ta nói IOtrở thành biểu thức lambda nói chung.)

Lưu ý rằng bạn không phải cung cấp ngôn ngữ của mình, nhưng bạn có thể đưa một câu vào câu trả lời nếu bạn muốn. Tuy nhiên, bạn không nên dựa vào việc triển khai để xác định ngôn ngữ theo bất kỳ cách nào - thông số kỹ thuật phải tự hoàn thiện và nếu có mâu thuẫn giữa thông số kỹ thuật và việc triển khai thì điều này nên được coi là một lỗi trong quá trình triển khai.


9
Xin lỗi các bạn, nhưng cuộc thi nổi tiếng một tiêu chí chiến thắng khách quan. Trở thành một pop-con không tạo ra một thách thức ngoài chủ đề, và chưa bao giờ được thực hiện. Cuộc thảo luận meta gần đây nhất có sự đồng thuận +27 ủng hộ điều này, vì vậy mặc dù năm bạn có thể thích nó khác biệt nhưng bạn thực sự không có chân để đứng. Vì câu hỏi này đã được đóng lại đối với chính sách đã thỏa thuận, tôi yêu cầu mở lại.
Nathaniel

2
(lưu ý rằng WhatWizard đã đóng nó vì một lý do khác.)
user202729

2
Vui lòng không sử dụng phiếu bầu gần như là "Tôi không đồng ý" hoặc nút "Tôi không thích điều này". Phiếu bầu gần sẽ được sử dụng để thực thi chính sách trang web. Nếu bạn không đồng ý với chính sách, hãy đưa nó đến meta - đừng đóng những thách thức theo chủ đề bởi sự đồng thuận của cộng đồng.
Mego

1
@Mego Tôi đã bỏ phiếu để đóng cái này quá rộng, nhưng tôi cũng nghĩ rằng điều này không đúng chủ đề bởi các quy tắc hiện hành của chúng tôi dành cho pop-cons. Chúng tôi hy vọng các cuộc thi phổ biến sẽ có "Một đặc điểm kỹ thuật rõ ràng về mục tiêu phải đạt được", câu hỏi này là làm X theo cách sáng tạo nhất. Rõ ràng với tôi rằng không có mục tiêu nào khác ngoài việc là một câu trả lời hợp lệ và thẻ pop-con được đính kèm chỉ để giữ cho nó mở.
Ad Hoc Garf Hunter

2
@WhatWizard mục tiêu phải đạt được là không hoàn toàn rõ ràng Turing, với sự không rõ ràng được đánh giá bằng cách không bị bẻ khóa trong vòng một tuần. Điều đó không rõ ràng?
Nathaniel

Câu trả lời:


10

Số học bịt mắt

Có thể là một ngôn ngữ khá dễ dàng để bắt đầu, tương đối nói. (Có những giới hạn về mức độ khó của một ngôn ngữ tôi có thể tạo ra bởi vì tôi phải chứng minh nó Turing-hoàn thiện bản thân mình!)

Đối với ngôn ngữ này, bộ chương trình là tập hợp các chương trình Số học bịt mắt như được đưa ra trong phần "chương trình" bên dưới, bộ đầu vào là tập hợp các số nguyên dương và bộ đầu ra là tập hợp các số nguyên (toàn bộ, không chỉ các số nguyên dương).

Ngôn ngữ này khá thú vị - thậm chí có thể thực sự hữu ích - bởi vì nó có ít nhiều hoàn toàn thiếu luồng kiểm soát, hoàn toàn dựa trên các tính toán trên các số bạn không thể thấy. Điều đó làm cho nó có khả năng hữu ích như một ngôn ngữ để thực hiện các chương trình bên trong các hệ thống mã hóa đồng hình .

Sự chỉ rõ

Số học bịt mắt là một ngôn ngữ lập trình bí truyền với các thông số kỹ thuật sau:

Lưu trữ dữ liệu

Một trạng thái của chương trình Số học bịt mắt đang chạy bao gồm sáu biến, mỗi biến có thể lưu một số nguyên. (Không có giới hạn về cách lớn hay nhỏ những số nguyên có thể nhận được; đặc biệt, họ có thể đi tiêu cực.) Các biến này được gọi là a, b, c, d, e, và i.

Vào lúc bắt đầu của chương trình, ađể ebao gồm là mỗi khởi tạo đến 0, và iđược khởi tạo vào một số nguyên dương lấy từ người dùng nhập vào. (Nếu không có đầu vào khả dụng, iđược khởi tạo thành 1.)

Nếu chương trình ngừng thực thi (điều này chỉ có thể xảy ra do chia cho 0), giá trị ingay lập tức trước khi phân chia được thử được sử dụng làm đầu ra của chương trình.

Chương trình

Chương trình Số học bịt mắt là một danh sách các lệnh, mỗi lệnh có một trong các dạng sau (trong đó v có thể được thay thế bằng bất kỳ tên biến nào, có khả năng là một tên khác nhau mỗi lần sử dụng):

  • v = v + v
  • v = v - v
  • v = v * v
  • v = v / v

Lưu ý rằng mỗi toán hạng của các lệnh phải là một biến; ngôn ngữ này không cho phép sử dụng các số nguyên theo nghĩa đen.

Việc thực hiện chương trình được thực hiện bằng cách chạy từng lệnh theo trình tự, sau đó lặp lại bắt đầu và tiếp tục chạy lại các lệnh theo thứ tự, ad infinitum (hoặc cho đến khi có một nỗ lực chia cho 0, kết thúc chương trình) .

Mỗi lệnh có cùng một ngữ nghĩa như bạn mong đợi từ ký hiệu, không khác với ngôn ngữ được sử dụng bởi hầu hết các ngôn ngữ lập trình thực tế: các giá trị của biến thứ hai và thứ ba được lấy trong lệnh được thực hiện, một phép toán số học (cộng / trừ / nhân / chia tương ứng cho bốn dạng lệnh) được áp dụng cho chúng và giá trị kết quả được lưu trữ vào biến đầu tiên. Phân chia ở đây là phân chia số nguyên, làm tròn về 0.

Không có luồng điều khiển dưới bất kỳ hình thức nào, ngoài lối ra chương trình; các lệnh luôn tuần hoàn theo trình tự, cho đến khi một phép chia bằng 0 (nếu có) xảy ra và kết thúc chương trình. Cụ thể, không có cách nào để đọc trực tiếp các biến, chỉ sử dụng chúng làm nguồn tính toán có kết quả tác động đến các giá trị được gán cho các biến khác.


Bạn có thể kiểm tra nếu câu trả lời của tôi thiếu bất cứ điều gì?
dùng202729

@ user202729: (bình luận ở đây vì tôi không có đại diện để bình luận ở đó) Bạn không thể mô phỏng "di chuyển nếu sai" từ "lật" và "di chuyển nếu đúng" vì bạn không thể hoàn tác lật sau khi bạn di chuyển Vì vậy, bạn sẽ cần một số cách khác để xử lý việc đó (ví dụ: cách đảo ngược các bài kiểm tra, điều đó không khó). Tuy nhiên, đáng chú ý hơn, đó là bằng chứng Turing-đầy đủ về hành vi tạm dừng, nhưng định nghĩa trong câu hỏi yêu cầu bạn phải có khả năng thực hiện I / O, vì vậy bạn cần chứng minh bạn có thể làm điều đó.
ais523

Tôi hy vọng phần I / O (bây giờ) là ok. Đối với vấn đề khác, tôi nhận ra rằng bên trong nếu không cần thiết, các trạng thái trung gian sẽ giải quyết tất cả vấn đề (mặc dù tôi không chắc chắn làm thế nào để nói từ đó)
user202729

@ user202729: vẫn chưa hoàn toàn đúng (ví dụ: câu hỏi yêu cầu bạn phải có thể xuất số âm và bạn cũng cần thay đổi mục đích iđể số trạng thái - sẽ luôn bị "dừng" - sẽ không là một phần của đầu ra), nhưng nó đủ gần để tôi không đánh dấu điều này là an toàn, vì rõ ràng bạn sẽ có một vết nứt đầy đủ trong thời gian đủ và làm rõ đầy đủ các quy tắc. Tôi không muốn chiến thắng thử thách này về kỹ thuật.
ais523

Điều này rất gần với các hạn chế mà de.ioccc.org/years-spoiler.html#1992_buzzard.1 sử dụng. Việc triển khai đó sử dụng các số nguyên có kích thước cố định và do đó không hoàn thành Turing và điều này bị hạn chế nghiêm trọng về số lượng biến bạn có, nhưng tôi nghĩ bằng chứng vẫn tương tự.
b_jonas
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.