Tại sao FRACTRAN turing hoàn thành?


10

Tôi đã cố gắng để google giải thích nhưng hầu hết các liên kết chỉ nói những điều như "FRACTRAN đã hoàn tất. Ví dụ, chúng ta hãy xem phép nhân."

Tôi nhớ đã thấy một bài đăng trên diễn đàn xkcd nói rằng FRACTRAN đã giúp người đăng hiểu Turing Hoàn thiện. Tôi đang tìm kiếm một lời giải thích trực quan về lý do tại sao esolang này hoàn thành Turing, vì nó không rõ ràng khi nhìn vào cơ chế ngôn ngữ.


Đối với những người không quen thuộc với FRACTRAN: en.wikipedia.org/wiki/FRACTRAN
Thất

2
Lý do nhân là một ví dụ tốt về tính đầy đủ của Turing là bởi vì nó đòi hỏi cả vòng lặp và lưu trữ. Mặc dù nó không phải là một thử nghiệm đầy đủ như thể một cái gì đó đang hoàn thành. "Bằng chứng" tốt nhất là viết một trình giả lập brainfuck trong đó
Earlz

Câu trả lời:


12

Để một ngôn ngữ bắt buộc phải hoàn thành Turing, nó phải có:

  1. Vòng lặp có điều kiện
  2. Số lượng biến tùy ý

FRACTRAN là một ngôn ngữ được tạo thành từ một loạt các phân số lưu trữ dữ liệu của nó theo số mũ của các số nguyên tố.

Hãy nói rằng bạn muốn thêm hai số: 2 a 3 b trở thành 5 ab

455 11 1 3 11 1
---, -, -, -, -, -
 33 13 11 7 2 3

Đó là một chương trình FRACTRAN để thực hiện thay đổi trên.

Bạn bắt đầu với một số như 72 (2 3 3 2 ). Chương trình đi 'chuyển tiếp' cho đến khi tìm thấy một số mà khi nhân với hướng dẫn là một số nguyên khác (không cho phép số dư).

72sẽ chạy về phía trước cho đến khi nó được 11/2. Sau đó, nó sẽ chia số cho 2và nhân nó với 11(công suất trong 11 là một biến). Điều này cho 396. 396chia hết cho 33 (giảm 3 lũy thừa và 11) và nhân với 455 (tăng 5, 7 và 13 biến). Và như thế. Có thể đọc mô tả đầy đủ về chương trình này và bảng trạng thái của nó tại trang wikipedia FRACTRAN , bao gồm một gif hoạt hình thực sự hay của chương trình trên.

Tài liệu FRACTRAN khác trên Stack Exchange chạm vào sự hoàn chỉnh Turing có thể được tìm thấy tại địa chỉ: Chuyển đổi Fractran vào Brainfuck (ok, đó là một thực sự sử dụng hiệu quả thời gian của một người)

Lý do Fractran hoàn thành Turing là vì nó mô phỏng một máy đăng ký. Hệ số nguyên tố của số lưu trữ nội dung của các thanh ghi, trong khi phép chia và phép nhân là một cách để thêm và trừ một cách có điều kiện từ các thanh ghi.

Một phần của thủ thuật ở đây (và đi lạc vào lý thuyết bắt đầu này) là đằng sau hậu trường, đây là một máy đăng ký Minsky mà nó đã được chứng minh rằng một số băng (chương trình) được máy Turing NẾU băng được biểu diễn như một số Godel là chính xác số FRACTRAN là gì (từ trang wikipedia được liên kết):

Gôdel đã sử dụng một hệ thống dựa trên yếu tố chính. Đầu tiên anh ta gán một số tự nhiên duy nhất cho mỗi biểu tượng cơ bản trong ngôn ngữ chính thức của số học mà anh ta đang giao dịch.

Vì vậy, chúng ta có các vòng lặp có điều kiện, các biến tùy ý được lưu dưới dạng số Gôdel, chúng ta đã có một máy Turing.

Một số cách đọc thú vị khác chạm vào Collatz giống như bản chất của FRACTRAN có thể được đọc tại Không thể Quyết định? Chưa quyết định! có liên quan đến phỏng đoán Collatz với FRACTRAN và vấn đề tạm dừng.


FRACTRAN là một chút khó khăn để có được một đầu xung quanh.

Hãy xem xét chương trình này như:

LABEL: start
    block1
    block2
    block3
    ...
END

Trong đó, mỗi khối có dạng:

IF(registers X >= a, Y >= b)  # or any combination of registers
THEN
    X -= a
    Y -= b

    I += n
    J += m

    goto start

Câu lệnh đầu tiên từ chương trình nhân ở trên:

455
---
 33

Sẽ được viết dưới dạng này là:

IF(register `3` >= 1 && `11` >= 1)
THEN
     `3` -= 1
    `11` -= 1

     `5` += 1
     `7` += 1
    `13` += 1

    goto start

Và do đó bạn có thể thấy rõ việc lưu trữ dữ liệu và các cấu trúc lặp cần thiết cho tính hoàn chỉnh của Turing. Nó rất thô sơ, nhưng nó tồn tại và chạy như một máy đăng ký đơn giản - nhưng đó là tất cả những gì bạn thực sự cần để có thể làm được.


Vẫn không thuyết phục?

Điều này phần lớn mượn từ một bài giảng của Dimitri Hendricks về Mô hình tính toán

Điều này có chương trình rất đơn giản (2/3)là một bộ cộng (2 a 3 b -> 3 a + b ) Nhưng nó có tính phá hủy - giá trị trong 2 bị xóa như một phần của quy trình.

Hãy viết một FRACTRAN cấp cao hơn để dễ dàng không thực hiện việc phá hủy như vậy.

Chương trình ban đầu có thể được coi là:

   2
α: - →
   3

Trong F 2 , người ta có thể chỉ định 'hàm' của một loại.

   10 1
α: - → α, - →
    3 1

   3
: - →
   5 

Để chuyển đổi chương trình F 2 (P) thành chương trình FRACTRAN tiêu chuẩn, người ta thực hiện:

  1. Xóa P các vòng có độ dài 1
  2. Thay thế chữ cái Hy Lạp (hàm) bằng số nguyên tố mới
  3. Thay thế các chuyển đổi:
   át chủ
p: - → q, - → r, - -> s, ...
   bdf

trở thành:

aq cr es
-, -, -, ...
bp dp fp

Những gì điều này đã làm được sử dụng các số nguyên tố p, q, r và s để lưu trữ trạng thái của chương trình.

Và sau đó chúng ta đã có máy đăng ký ... nó có số lượng thanh ghi hữu hạn lưu trữ số lượng lớn tùy ý và hai hướng dẫn:

  • inc (x i , m) - đăng ký gia tăng i và đi đến dòng m
  • jzdec (x i , m 1 , m 2 ) - nếu đăng ký i bằng 0 đi đến dòng m, khác giảm i và đi đến dòng m2.

Máy đăng ký này đã được hiển thị là Turing hoàn thành.

Sau đó, nó sẽ hiển thị quá trình qua một số slide biên dịch chương trình máy đăng ký thành chương trình FRACTRAN như một phần của quy trình cơ học.

Về cơ bản:

                       số Pi)
inc (x (i), m) = ---- → m
                        1

                        1 1
jzdec (x (i), m1, m2) = ---- → m2, - → m1
                       p (i) 1

Và do đó, do sự tương đương giữa hai mô hình điện toán này, FRACTRAN đã hoàn thành Turing.

Btw, nếu bạn thực sự muốn đầu óc mình tỉnh táo , hãy đọc Code Golf: Fractran trong đó một số người đã viết một chương trình FRACTRAN để chạy một chương trình FRACTRAN khác.


2
Và tôi nghĩ Brainf * ck thật kỳ lạ.
Robert Harvey

Lưu ý rằng Hệ thống bổ sung Vector có liên quan vì bất kỳ chương trình Fractran nào cũng có thể được viết dưới dạng VAS. Và cả lưới Petri.
Dan D.
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.