FRACTRAN turing neden tamamlandı?


10

Ben açıklama için google denedim ama çoğu bağlantı sadece "FRACTRAN tam turing." Örneğin, çarpma bakalım "gibi şeyler söylüyorlar.

Bir xkcd forum yazısı FRACTRAN'ın Turing Tamamlama'yı anlaması için posterin yardımcı olduğunu söylediğini hatırlıyorum . Bu esolangın Turing'in neden tamamlandığına dair sezgisel bir açıklama arıyorum, çünkü dil mekaniğine bakmak çok açık değil.


FRACTRAN'a aşina olmayanlar için: en.wikipedia.org/wiki/FRACTRAN
FrustratedWithFormsDesigner

2
Çoğaltmanın nedeni turing bütünlüğünün iyi bir örneğidir, çünkü hem döngü hem de depolama gerektirir. Bir şeyin tamamlanıp tamamlanmadığı konusunda tam bir test olmamasına rağmen. En iyi "kanıt" bir
beyin fırtınası

Yanıtlar:


12

Zorunlu bir dilin Turing'in tamamlanması için şunlara sahip olması gerekir:

  1. Koşullu döngü
  2. Rasgele değişken sayısı

FRACTRAN, verilerini primerlerin üssünde saklayan bir dizi fraksiyondan oluşan bir dildir.

İki sayı eklemek istediğinizi varsayalım: 2 a 3 b 5 ab olur

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

Yukarıdaki değişikliği yapmak için bir FRACTRAN programı.

72 (2 3 3 2 ) gibi bir sayı ile başlarsınız . Program, komutla çarpıldığında başka bir tamsayı (kalanlara izin verilmez) olan bir sayı bulana kadar 'ileri' gider.

72ulaşana kadar ilerleyecektir 11/2. Daha sonra sayıyı böler 2ve çarpar 11(11'deki güç bir değişkendir). Bu verir 396. 39633 ile bölünebilir (3 güç ve 11 azaltılır) ve 455 ile çarpılır (artan 5, 7 ve 13 değişkenler). Ve bunun gibi. Bu programın ve durum tablosunun tam açıklaması , yukarıdaki programın gerçekten güzel bir animasyonlu gif dahil FRACTRAN wikipedia sayfasında okunabilir .

Stack Exchange'de Turing tamlığına dokunan diğer FRACTRAN materyallerini şu adreste bulabilirsiniz: Fractran'ı Brainfuck'a dönüştürün (tamam, bu zamanın gerçekten verimli bir kullanımı)

Fractran'ın Turing-complete olmasının nedeni, bir kayıt makinesini simüle etmesidir. Sayının birincil çarpanlarına ayırma işlemi, kayıtların içeriğini saklarken, bölme ve çarpma, kayıtlara koşullu olarak ekleme ve çıkarma işleminin bir yoludur.

Burada hile (ve teoride bir straying bu başlar) bir kısmı perde arkasında, bu olmasıdır Minsky kayıt makinesi belirli bantlar (programlar) Turing Makinaları olduğu kanıtlandığı bir IF bant bir şekilde temsil edilmektedir Gödel sayısı ise FRACTRAN numarasının tam olarak ne olduğunu (bağlantılı wikipedia sayfasından):

Gödel, asal çarpanlara ayırmaya dayalı bir sistem kullandı. İlk olarak, üzerinde çalıştığı resmi aritmetik dilindeki her temel sembole benzersiz bir doğal sayı atadı.

Dolayısıyla, şartlı döngülerimiz var, Gödel sayıları olarak rastgele değişkenler var, bir Turing makinemiz var.

Collatz'a FRACTRAN'ın doğası gibi dokunan diğer eğlenceli okumalar Can't Decide? Undecide! Collatz varsayımını FRACTRAN ve durma problemi ile ilişkilendiriyordu.


FRACTRAN kafasını bulmak biraz zor.

Programı şöyle düşünün:

LABEL: start
    block1
    block2
    block3
    ...
END

Burada, her blok şu şekildedir:

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

    I += n
    J += m

    goto start

Yukarıdaki çarpma programından ilk ifade:

455
---
 33

Bu formda şu şekilde yazılacaktır:

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

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

    goto start

Böylece Turing tamlığı için gerekli olan veri depolama ve döngü yapılarını açıkça görebilirsiniz. Bu çok basit, ama var ve basit bir kayıt makinesi olarak çalışıyor - ama sonra gerçekten yapmanız gereken tek şey bu.


Hala ikna olmadınız mı?

Bu büyük ölçüde Dimitri Hendricks'in Hesaplama Modelleri üzerine bir konferansından ödünç alıyor

Bu, (2/3)toplayıcı olan çok basit bir program gerektirir (2 a 3 b -> 3 a + b ) Ama yıkıcıdır - 2'deki değer sürecin bir parçası olarak temizlenir.

Böyle bir yıkımı yapmamayı kolaylaştıran daha yüksek bir FRACTRAN yazalım.

Orijinal program şu şekilde düşünülebilir:

   2
α: - → α
   3

F 2'de , bir tür 'fonksiyonlar' belirlenebilir.

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

   3
β: - → β
   5 

Bir F 2 programını (P) standart bir FRACTRAN programına dönüştürmek için:

  1. Uzunluk döngülerinin net P 1
  2. Yunanca harfleri (işlevleri) yeni asal sayılarla değiştirme
  3. Geçişleri değiştirin:
   as
p: - → q, - → r, - -> s, ...
   bdf

dönüşür:

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

Bunun yaptığı, programın durumunu saklamak için p, q, r ve s primerlerini kullanmaktır.

Ve sonra kayıt makinesimiz var ... rasgele çok sayıda ve iki talimat saklayan sınırlı sayıda kayıt var:

  • inc (x i , m) - yazmaç i'yi artırın ve m satırına gidin
  • jzdec (x i , m 1 , m 2 ) - eğer i kaydı 0 ise m satırına gidin , i değerini azaltın ve m2 satırına gidin.

Bu kayıt makinesinin Turing tamamlandığı gösterilmiştir.

Daha sonra, mekanik bir işlemin bir parçası olarak bir kayıt makinesi programını bir FRACTRAN programına derlemek için birkaç slayt üzerinde işlemi göstermeye gider .

Temelde:

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

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

Ve böylece bu iki hesaplama modeli arasındaki denklik nedeniyle, FRACTRAN Turing tamamlandı.

Btw, eğer gerçekten zihninizi havaya uçurmak istiyorsanız, Code Golf: Fractran'ı okuyun, bazı kişilerin başka bir FRACTRAN programını çalıştırmak için bir FRACTRAN programı yazdı.


2
Ve Brainf * ck'nin garip olduğunu düşündüm.
Robert Harvey

Vektör Ekleme Sistemlerinin herhangi bir Fractran programı VAS olarak yazılabileceğinden kaynaklandığını unutmayın. Ve ayrıca Petri ağları.
Dan D.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.