Để một ngôn ngữ bắt buộc phải hoàn thành Turing, nó phải có:
- Vòng lặp có điều kiện
- 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ư).
72
sẽ chạy về phía trước cho đến khi nó được 11/2
. Sau đó, nó sẽ chia số cho 2
và nhân nó với 11
(công suất trong 11 là một biến). Điều này cho 396
. 396
chia 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:
- Xóa P các vòng có độ dài 1
- Thay thế chữ cái Hy Lạp (hàm) bằng số nguyên tố mới
- 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.