Brainfuck Turing'i tamamlamak için kaç çift braket yeterlidir?


12

Brainfuck, yalnızca 8 sembol kullanan bir Turing tam programlama dilidir (G / Ç'yi yoksayarsanız 6).

Onu Turing bütünlüğüne iten en önemli iki [ve ]esasen Brainfuck'ın etiketi ve go.

Normalde, Brainfuck'taki programlar birden fazla set kullanır [], ancak Brainfuck Turing'i tamamlamak için bu braketlerden kaç çiftin kullanılması gerektiğini merak ediyordum?

Daha basit olarak, bir n-durumlu Turing Makinesi'ni simüle etmek için ihtiyacınız olan en az sayıda braket nedir (1, 2 ve üç durumlu Turing Makinesi için braket sayısını verin)?

Notlar:

Sonsuz bir bant varsayıyoruz ve hesaplama sınırı yok.

2 Sembollü Turing Makinesi


1
"Bu parantezlerin kaç çifti kullanılmalı?" "Kullanılmalı" diyebilir misiniz? Örneğin, BrainF'den saymasını istersem ne olur 21000000?
John L.

Asgari parantez sayısını girin
MilkyWay90

1
Oh, -state Turing makinesini n'nin bir fonksiyonu olarak simüle etmek için minimum sayıda braket mi demek istediniz ? Her neyse, olabildiğince basit olan önemsiz bir örnek verebilir misiniz? nn
John L.

1
@ Apass.Jack Tamam, ben bir devlet Turing Machine için çalışan bir adamcağız BF programı ile geliyorum
MilkyWay90

@ Apass.Jack Nevermind, benim için çok zor. Temel olarak programlama dili olan Turing Machine But Way Worse için bir BF yorumlayıcısı yapın , yalnızca iki olası sembol (0 ve 1) kullandığında ve G / Ç ve durma yönünü tamamen kaldırın
MilkyWay90

Yanıtlar:


9

Bu, @ ais523'ün cevabının daha da geliştirilmesi, sadece iki küme kümesine indirgenmesi ve ayrıca Golomb cetvel teorisine dayanan daha kompakt bir hücre yerleşimi kullanılmasıdır. ais523, bu yapı için bir derleyici hazırladı ve bu TIO oturumu , TWM sayaçlarının hata ayıklama izlemesiyle çalışan örnek bir BF programını gösteriyor.

Orijinal gibi, bu da Şelale Modeli'nde , genelliği kaybetmeyen bazı kısıtlamalarla bir programla başlar :

  1. Tüm sayaçlar kendi kendine sıfırlama değerine R ; yani TWM tetikleme haritası f , tüm x için f(x,x)=R özelliğine sahiptir .x
  2. Tek bir durdurma sayacı h .
  3. Sayaçların c sayısı , bazı asal sayı p için (p1)/2 .p

Golomb cetveli

Bir Golomb cetvelini gerekli özelliklere sahip kılmak için Erd –s-Turán yapısını Welch-Costas dizisinin permütasyon fonksiyonu ile birleştiriyoruz .

(Bu birleşik yapının yeni bir fikir olamayacağından eminim, ancak bu iki parçayı Wikipedia'dan bulduk ve birleştirdik.)

r , p=2c+1 ilkel kökü olsun . İşlevi tanımlayın

g(k)=4ck-((rk-1)şık(2c+1)),k=0,...,2c-1.

  1. g ,mertebesindebirGolomb hükümdarıdır. Yani,farkı, her farklı sayı çifti i , j { 0 , , 2 c - 1 } için benzersizdir.2cg(i)g(j)i,j{0,,2c1}
  2. g(k)mod(2c) herdeğerini birkez alır.0,,2c1

Bant yapısı

Her bir TWM sayacı iki BF bant hücresi konumu, bir geri dönüş hücresi ve bir değer hücresi atarız :x{0,,c1}u ( x ) v ( x ) u(x) v(x)

u(x)=g(k1)<v(x)=g(k2) with u(x)v(x)x(modc)

İkinci özelliği ile iki farklı tam vardır seçim için değerler.gk1,k2

Bir geri dönüş hücresinin içeriği , sayacının henüz ziyaret edilmediği, olacağı dışında , sayaç kendini sıfırlama değerinin iki katı olarak çoğu zaman tutulur . Bir değer hücresi, karşılık gelen TWM sayacının değerinin iki katında tutulacaktır.02R

BF programının yürütülmesi (sonlu bir sayı) ile erişilebilen diğer tüm hücreler tek değerlerde tutulur, böylece her zaman sıfır olmayan olarak test edilirler. Başlatma işleminden sonra bu otomatiktir, çünkü tüm hücre ayarlamaları eşit miktarlardadır.

İstenirse, başlangıçtaki BF bant konumunun soluna hareket etmemek için tüm hücre konumları bir sabit tarafından sağa kaydırılabilir.

BF program yapısı

Let durdurulması sayacın değeri ve yedek hücreler arasındaki mesafe, ve izin sayıda yeterince büyük olması Tüm sayaçlar için . Sonra temel BF program yapısıH=v(h)u(h)NcN+1v((x+1)modc)u(x)x

başlatma ayarlamaları[ >×(H+cN+1) [ <×c x H] <×H ]

Başlatma

Başlatma fazı, karşı sadece görüntülenmiştir ve sadece bir aktif hücrenin yedek hücre olduğu gibi tüm hücreler bir durumda, başlangıç değerlerine programı ile ulaşılabilir ayarlar :u(c-1)

  1. Değer hücreleri, karşılık gelen TWM sayacının başlangıç ​​içeriğinin iki katı olarak başlatılır, ancak sayaç önceden azaltılır.0
  2. Yedek hücreler ayarlanır hücre dışında olarak ayarlandığında, .0u(c-1)2R,
  3. Program tarafından erişilebilen diğer tüm hücreler (sonlu sayı) olarak ayarlanır .1

Ardından, programın ilkine ulaşmadan önce bant işaretçisi (her zaman sıfır olmayan bir hücre) konumuna getirilir .u(c-1)-'H[

Dış halkanın başlangıcı

Dış halkanın yinelemesinin başlangıcında, teyp işaretçisi bir sayaç için veya olacaktır .u(x)-'Hv(x)-'Hx

Let ziyaret yanında karşı olmak.y=((x+1)şıkc)

hareketi , şerit işaretçisini öğesinin soluna değil getirir .>x('H+cN-+1)y(şıkc)v(y)

İç döngü şimdi sıfır hücre için adımlarında sola doğru arama yapar . sayacı sıfırsa, (sıfır) değer hücresi de durur ; aksi halde geri dönüş hücresini bulur .[ <xc ]cyv(y)u(y)

Hangi hücre bulunursa yeni etkin hücre olur.

Düzeltmeler

Ayar fazlı aktif hücreye kendi pozisyonunda temel bant çeşitli hücreleri ayarlar. Bu bölüm yalnızca +-><komutlar içerir ve bu nedenle bu ayarlamalar koşulsuz gerçekleşir. Bununla birlikte, sayaçla ilişkili tüm hücreler bir Golomb cetvel deseninde olduğundan, mevcut aktif hücre için uygun olmayan herhangi bir ayarlama, tüm önemli hücreleri özleyecek ve bunun yerine bazı tuhaf hücreleri ayarlayacaktır (tuhaf tutarken).

Bu nedenle, aktif hücrenin kendi kendine ayarlaması haricinde , her bir gerekli aktif ve ayarlanmış hücre çifti için ayrı kod programa dahil edilmelidir ; bu, ayarlama yalnızca göreceli konuma dayandığından, bunlar arasında paylaşılmalıdır.

Gerekli ayarlamalar:

  1. Önceki sayacın son çare hücreyi ayarlayın tarafından .u(x)2R
  2. Mevcut sayacın yedek hücre ayarlama göre , ancak mevcut etkin hücre ise, ve durdurmak bu yüzden.u(y)2Rv(h)
  3. Bir sonraki sayaç değeri hücre ayarlama tarafından (sayaç azaltma).v((y+1)modc)2
  4. Aktif hücre, bir değer hücresi olduğu zaman (karşı çok sıfır ulaşmıştır), her değer hücreleri ayarlamak ile TWM tetik haritadan. kendisi ayarlanır .v(y)yv(z)2f(y,z)v(y)2R

Yukarıdaki birinci ve ikinci ayarlamalar, tüm aktif hücrelerin kendilerini , değer hücreleri ve dolayısıyla geri dönüş hücreleri için olan aynı değerle ayarlaması gerektiği için gereklidir . Bu, hem değer hem de geri dönüş dallarında geri dönmelerini sağlamak için yedek hücrelerin hazırlanmasını ve temizlenmesini gerektirir .2R0

Dış ilmeğin sonu

hareketi , ayarlama aşamasının sonunda, şerit imlecinin hareket ettirildiğini aktif hücrenin soluna doğru temsil eder.<×HH

Tüm aktif hücreleri için diğer durdurulması sayaç değeri hücre daha bu alakasız bir cep ve bu nedenle tek ve sıfır olmayan, ve dış döngü bir yineleme için devam eder.v(h)

İçin , işaretçi yerine karşılık gelen yedek hücre yerleştirilir bunun sıfır tutmak için üzerinde bir istisna var olan, ve Program çıkar böylece nihai yoluyla ve durur.v(h)u(h)]


12

Bunu iki küme paranteziyle yapmanın imkansız olduğundan% 100 emin değilim. Bununla birlikte, BF bandının hücreleri sınırsız değerlere izin veriyorsa, üç grup parantez yeterlidir. (Basitlik açısından, bant kafasını başlangıç ​​noktasının ötesine taşıyabileceğimizi varsayacağım, ancak bu yapı bandın sınırlı bir bölgesini kullandığından, bu kısıtlamayı >, başlangıcına yeterince fazla komut ekleyerek kaldırabiliriz . Aşağıdaki yapı, Artin'in varsayımını varsayar.keyfi olarak büyük programları derleyebilme; bununla birlikte, Artin'in varsayımı yanlış olsa bile, aşağıdaki yapıyı kullanarak Turing-complete dilinin bir tercümanını BF'ye çevirerek ve bu tercümana girdi olarak rastgele programlar çalıştırarak Turing-tamlığını dolaylı olarak göstermek mümkün olacaktır.

Sınırsız BF'ye derlediğimiz Turing-complete dili, bilinen en basit hesaplama modellerinden biri olan Şelale Modeli'dir . Zaten bilmeyenler için, bir dizi sayaçtan (ve onlar için başlangıç ​​değerlerinden) ve sayaç çiftlerinden tamsayılara işlevinden oluşur ; programın yürütülmesi her sayaçtan art arda 1 çıkartılmasından oluşur, o zaman herhangi bir sayacı 0 ise, her sayaca ( eklenir (program aynı anda birden fazla sayaçta asla olmayacak şekilde yazılır). Bağlantımın arkasında bu dil için bir Turing-completeness kanıtı var. Genel kayıp olmadan, tüm sayaçların aynı otomatik sıfırlama değerine sahip olduğunu varsayacağız (ör.fxf(x,y)yf(x,x) tüm ) için aynıdır ; bu güvenli bir varsayımdır, çünkü herhangi bir belirli , her aynı sabitin eklenmesi programın davranışını değiştirmez.xxf(x,y)

, sayaç sayısı olsun ; genellik (Artin Hipotezi'ni varsayılarak) kaybı olmadan varsayalım bir sahiptir ilkel kök 2. Bir olduğu , göre 2, daha fazla düşük gücü . Genelliği kaybetmeden, daha az olacaktır ( polinom ile sınırlıdır, katlanarak büyür, bu nedenle yeterince büyük çalışır).ppq p ( 1 + s + s 2 ) s p 2 q 2 p 2 q 2 p pqp(1+s+s2)sp2q2p2q2pp

Bant düzenlemesi aşağıdaki gibidir: her sayacı tamsayısıyla numaralandırırız (ve genelleme kaybı olmadan, tek bir durma sayacı olduğunu varsayarız ve numaralandırırız ). Çoğu sayacın değeri , bant hücresi depolanan sayaç 0 hariç, hücre hücresi depolanır . -1 hücresinden kadar olan her tek numaralı bant hücresi için0i<p22i2q2p+1+2p+1, bant sayacı hemen bir sayacın hemen solunda olmadığı sürece her zaman 1 tutar, bu durumda her zaman 0 tutar. Sayaç olarak kullanılmayan çift sayılı bant hücrelerinin alakasız değerleri vardır (0 olabilir veya olmayabilir) ); ve belirtilen aralığın dışındaki tek sayılı bant hücrelerinin de alakasız değerleri vardır. Bandın uygun bir başlangıç ​​durumuna ayarlanmasının, sabit değerlere yalnızca çok sayıda bant elemanının başlatılmasını gerektirdiğini, yani bunu bir dizi <>+-talimatla yapabileceğimizi (aslında, sadece >+gerekli), dolayısıyla parantez olmadığını unutmayın. Bu başlatmanın sonunda, bant işaretçisini -1 hücresine taşırız.

Programımızın genel şekli şöyle görünecektir:

başlatma ayarı[>>>[ >×(2p1) [ <×(2p) ]>-] <<<]

Başlatma, bandı beklenen şekle ve işaretçi -1 hücresine yerleştirir. Bu, bir sayacın solundaki hücre değildir (0, 2'nin gücü değildir), bu nedenle 1 değerine sahiptir ve döngüye giriyoruz. Bu en dıştaki ilmik için döngü değişmezliği, bant işaretçisinin (her döngü yinelemenin başında ve sonunda) bir sayacın solunda üç hücre olmasıdır; bu nedenle ilmiğin sadece sayaç 2'nin solunda üç hücre olduğumuzda çıkacağı görülebilir (her bir sayacın solunda 1 adet üç hücre vardır, 0 olması için iki sayacın bant konumlarının ima edileceği 2 hücre birbirinden ayrılmıştır; 2'den farklı 2'nin sadece iki gücü ve ve ikili gösterimi s dizelerinden dizelerine değişir2122q01s veya tersi en az dört kez ve bu nedenle 2 güçten 1 uzakta olamaz).

İkinci döngü, sayaçların üzerinde tekrar tekrar döngü yaparak azalır. Döngü değişmezi, bant işaretçisinin her zaman bir sayacı işaret etmesidir; böylece bir sayaç 0 olduğunda döngü çıkacaktır. Azaltma sadece -; bir sayaçtan diğerine geçme şeklimiz daha karmaşıktır. Temel fikir, boşluklarını sağa hareket ettirmenin bizi herhangi bir sayacın ( sağındaki tek numaralı bir hücreye son sayaç, bir için pozitif olan ) pozitif olduğu; modulo , bu değer (Fermat'ın Küçük Teoremi ile) ile uyumludur . En içteki döngü tekrar tekrar sola hareket eder2p12x2p+2x12p2x-1x2p2x+12p2 p 2 x + 1 2 p 2 q - 1 - 1 2 p 2 log 2 , p ( r ) + 1 - 1 2 r - 1 r boşlukları, ayrıca bant hücresi modulo indeksini değiştirmez ve sonunda hücreyi , değerine sahip olan modulo (bazı sayacın solundaki hücre olacak) bulmalıdır ; ilkel kök gereksinimimiz nedeniyle tam olarak böyle bir hücre vardır ( , modulo ve , herhangi biri için diğer , burada , baz 2 modulo ) ' ye ait ayrı logaritmadır . Ek olarak, bant işaretçisi modulo pozisyonunun2p2x+12p2q112p2log2,p(r)+112r1rlog2,pp2porta döngüde her seferinde artar . Böylece, bant işaretçisi tüm sayaçları arasında geçiş yapmalıdır (modulo değerlerine göre ). Böylece, her tekrarında, her sayacı azaltırız (gerektiği gibi). Döngü bir yinelemenin ortasında kırılırsa, döngüye tekrar girdiğimizde azalmaya devam edeceğiz (çünkü en dıştaki döngünün geri kalanı bant işaretçisi konumunda net bir değişiklik yapmaz).2p2pp

Bir sayaç 0'a çarptığında, orta döngü kırılır ve bizi "ayarlama" koduna götürür. Bu temelde sadece kodlamasıdır ; her bir çift , sayaç 's sayacının bant konumu sayaç 'in sol / sağında olduğu gibi, geçerli bant işaretçisinin sol / sağıyla aynı mesafe olan bant öğesine ekler teyp konumu (ve ardından teyp işaretçisini başladığı yere geri kaldırır). Her ne zaman , bu mesafe benzersiz olarak çıkıyor:f(x,y)f(x,y)yxxy

  • 2'nin iki gücü arasındaki fark, 1 veya daha fazla s'lik bir dizeden sonra 0 veya daha fazla s'lik bir dizeden oluşan bir sayıdır (sayının başlangıcının ve dizesinin başlangıcındaki yer değerleriyle) , sırasıyla ve büyük ve küçük olmasına bağlı olarak ); dolayısıyla tüm bu farklılıklar farklıdır. * 2 ve gücünün farkına gelince , s ve s dizeleri arasında en az iki geçiş içermelidir (100xyq10q en az dört bu tür geçiş içerir, çıkarma sadece 2) kaldırabilir, bu nedenle iki iktidarın tüm farklılıklarından farklıdır ve bu farklılıklar açıkça birbirinden farklıdır.

İçin , belli ki hareket mesafesi 0 bulmak Ama için eşittir, sadece mevcut hücre ayarlaması olarak kullanabilir. Ve böylece ayar kodunun her sayaç için "bir sayaç 0'a çarptığında" etkisini uyguladığı görülebilir; gerçekte sayaçları temsil eden tüm hücreler doğru miktarda ayarlanacaktır ve diğer tüm ayarlamalar, programın davranışı üzerinde hiçbir etkisi olmayan sayaç olmayan çift sayılı hücreleri (iki çift sayı arasındaki fark çifttir) etkileyecektir.x=yf(x,y)

Bu nedenle, Şelale Modeli'nde BF'ye (durma davranışı dahil, ancak Turing tamlığı için gerekli olmayan I / O dahil değil) herhangi bir programın sadece üç çift braket ve böylece üç çift kullanılarak çalışan bir derlemesi var. Turing-tamlık için parantezlerin yeterlidir.


İyi iş! TNB'de bunun üzerinde çalıştığını görüyorum!
MilkyWay90

En azından p + 2 olmanız gerektiğini düşünüyorum. S = p + 1 olduğunda, q, 2 gücünden 1 daha azdır.
Ørjan Johansen

Ben sayaç yerleştirme (hiçbir asal sayılar teorisi gerektiren olduğu gibi) ben çok daha basit buldum: 2p*2^i+2i.
Ørjan Johansen

@ ØrjanJohansen: Doğru, sanırım #esoterik yapıdan bahsettim (bu yazıyı yazdıktan bir süre sonra)? Aslında ihtiyacınız olan her şey, elemanların sayısının ayrı modulo olduğu bir Golomb cetveli ve bunları yapılandırmanın çeşitli yolları vardır (en uygun olanları bulmak zor olsa da, bulduğum en uzun (kaba kuvvet yoluyla) [0, 1, 3, 7, 20, 32, 42, 53, 58]p için = 9).
ais523

Öyleyse sen yaptın (beynimin matematik modunda olmayı reddettiğini söylemeden hemen önce, mazeretim var: P). Sanırım k = 0'ın yeterli olduğunu öğrendim. Bence elemanların sadece ilk yarısını (diğer yarı tekrarlar (mod p)) kullanırsanız , Wikipedia'nın Erdős-Turan_construction polinom olarak büyüyen (ve muhtemelen O () - optimal?) Bir verir.
Ørjan Johansen
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.