Zorunlu bir dilin Turing'in tamamlanması için şunlara sahip olması gerekir:
- Koşullu döngü
- 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.
72
ulaşana kadar ilerleyecektir 11/2
. Daha sonra sayıyı böler 2
ve çarpar 11
(11'deki güç bir değişkendir). Bu verir 396
. 396
33 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:
- Uzunluk döngülerinin net P 1
- Yunanca harfleri (işlevleri) yeni asal sayılarla değiştirme
- 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ı.