Mengapa FRACTRAN turing lengkap?

10

Saya sudah mencoba google untuk penjelasan tetapi sebagian besar tautan hanya mengatakan hal-hal seperti "FRACTRAN sedang selesai. Sebagai contoh, mari kita lihat multiplikasi."

Saya ingat melihat posting forum xkcd mengatakan bahwa FRACTRAN membantu poster memahami Turing Completeness. Saya mencari penjelasan intuitif mengapa esolang ini Turing lengkap, karena tidak terlalu jelas melihat mekanika bahasa.

agas
sumber
Bagi mereka yang tidak terbiasa dengan FRACTRAN: en.wikipedia.org/wiki/FRACTRAN
FrustratedWithFormsDesigner
2
Alasan penggandaan adalah contoh yang baik dari turing kelengkapan adalah karena memerlukan perulangan dan penyimpanan. Meskipun itu bukan tes penuh apakah ada sesuatu yang sedang selesai. "Bukti" terbaik adalah menulis emulator brainfuck di dalamnya
Earlz

Jawaban:

12

Agar bahasa imperatif menjadi lengkap, Turing harus memiliki:

  1. Loop bersyarat
  2. Jumlah variabel yang berubah-ubah

FRACTRAN adalah bahasa yang terdiri dari serangkaian fraksi yang menyimpan datanya dalam eksponen bilangan prima.

Katakanlah Anda ingin menambahkan dua angka: 2 a 3 b menjadi 5 ab

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

Itu adalah program FRACTRAN untuk melakukan perubahan di atas.

Anda memulai dengan angka seperti 72 (2 3 3 2 ). Program berjalan 'maju' sampai menemukan nomor yang ketika dikalikan dengan instruksi adalah bilangan bulat lain (tidak ada sisa yang diizinkan).

72akan berjalan maju sampai tiba 11/2. Kemudian akan membagi jumlahnya dengan 2dan mengalikannya dengan 11(kekuatan dalam 11 adalah variabel). Ini memberi 396. 396habis dibagi 33 (mengurangi 3 daya dan 11) dan kalikan dengan 455 (menambah variabel 5, 7 dan 13). Dan seterusnya. Deskripsi lengkap program ini dan tabel statusnya dapat dibaca di halaman wikipedia FRACTRAN , termasuk gif animasi yang sangat bagus dari program di atas.

Materi FRACTRAN lain di Stack Exchange yang menyentuh pada kelengkapan Turing dapat ditemukan di: Konversi Fractran menjadi Brainfuck (ok, itu penggunaan waktu seseorang yang sangat produktif)

Alasan bahwa Fractran adalah Turing-complete adalah karena mensimulasikan mesin register. Faktorisasi utama bilangan menyimpan isi register, sedangkan pembagian dan penggandaan adalah cara untuk menambah dan mengurangi kondisional dari register.

Bagian dari trik di sini (dan ini mulai menyimpang ke teori) adalah bahwa di belakang layar, ini adalah mesin register Minsky yang terbukti bahwa kaset tertentu (program) adalah mesin Turing JIKA rekaman itu direpresentasikan sebagai nomor Gödel yang merupakan persis apa nomor FRACTRAN itu (dari halaman wikipedia tertaut):

Gödel menggunakan sistem berdasarkan faktorisasi prima. Dia pertama kali memberikan bilangan alami unik untuk setiap simbol dasar dalam bahasa formal aritmatika yang dengannya dia berurusan.

Jadi, kita punya loop kondisional, variabel sewenang-wenang disimpan sebagai nomor Gödel, kita punya mesin Turing.

Beberapa bacaan menyenangkan lainnya yang menyentuh tentang sifat Collatz seperti FRACTRAN dapat dibaca di Can't Decide? Putuskan keputusan! yang mengaitkan dugaan Collatz dengan FRACTRAN dan masalah penghentian.


FRACTRAN agak sulit untuk membuat seseorang berkeliaran.

Pertimbangkan programnya seperti:

LABEL: start
    block1
    block2
    block3
    ...
END

Dalam hal ini, setiap blok berbentuk:

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

    I += n
    J += m

    goto start

Pernyataan pertama dari program multiplikasi di atas:

455
---
 33

Akan ditulis dalam bentuk ini sebagai:

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

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

    goto start

Dan dengan demikian Anda dapat dengan jelas melihat penyimpanan data dan konstruksi perulangan yang diperlukan untuk kelengkapan Turing. Sangat sederhana, tetapi itu ada dan berjalan sebagai mesin register sederhana - tapi kemudian hanya itu yang Anda benar-benar harus bisa lakukan.


Masih belum yakin?

Ini sebagian besar meminjam dari kuliah oleh Dimitri Hendricks on Models of Computation

Ini mengambil program (2/3)yang sangat sederhana yang merupakan penambah (2 a 3 b -> 3 a + b ) Tapi itu merusak - nilai dalam 2 dihapus sebagai bagian dari proses.

Mari kita menulis FRACTRAN tingkat yang lebih tinggi yang membuatnya mudah untuk tidak melakukan penghancuran seperti itu.

Program asli dapat dianggap sebagai:

   2
α: - → α
   3

Dalam F 2 , seseorang dapat menentukan 'fungsi' sejenis.

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

   3
β: - → β
   5 

Untuk mengonversi program F 2 (P) menjadi program FRACTRAN standar, Anda dapat:

  1. Hapus P panjang loop 1
  2. Ganti huruf Yunani (fungsi) dengan bilangan prima segar
  3. Ganti transisi:
   kartu as
p: - → q, - → r, - -> s, ...
   bdf

menjadi:

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

Apa yang telah dilakukan ini adalah menggunakan bilangan prima p, q, r, dan s untuk menyimpan status program.

Dan kemudian kita punya mesin register ... ia memiliki sejumlah register yang terbatas yang menyimpan sejumlah besar arbitrer dan dua instruksi:

  • inc (x i , m) - increment register i dan pergi ke baris m
  • jzdec (x i , m 1 , m 2 ) - jika register i adalah 0 pergi ke baris m, kalau tidak decrement i, dan pergi ke garis m2.

Mesin register ini telah terbukti Turing lengkap.

Ini kemudian menunjukkan proses selama beberapa slide mengkompilasi program mesin register menjadi program FRACTRAN sebagai bagian dari proses mekanis.

Pada dasarnya:

                       p (i)
inc (x (i), m) = ---- → m
                        1

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

Dan dengan demikian karena kesetaraan antara dua model komputasi ini, FRACTRAN adalah Turing yang lengkap.

Btw, jika Anda benar-benar ingin pikiran Anda meledak, baca Code Golf: Fractran di mana beberapa orang menulis program FRACTRAN untuk menjalankan program FRACTRAN lainnya.

Komunitas
sumber
2
Dan saya pikir Brainf * ck aneh.
Robert Harvey
Perhatikan bahwa Sistem Penambahan Vektor terkait karena setiap program Fractran dapat ditulis sebagai VAS. Dan juga jaring Petri.
Dan D.