BlooP ve FlooP - BlooP and FlooP

BlooP ve FlooP basit Programlama dilleri tarafından tasarlandı Douglas Hofstadter kitabındaki bir noktayı göstermek için Gödel, Escher, Bach.[1] BlooP bir Turing olmayan tam programlama dili ana kontrol akış yapısı sınırlı döngü (yani özyineleme izin verilmedi). Dildeki tüm programlar sona ermelidir ve bu dil yalnızca ifade edebilir ilkel özyinelemeli fonksiyonlar.[2]

FlooP, sınırsız döngüleri desteklemesi dışında BlooP ile aynıdır; Turing eksiksiz bir dildir ve her şeyi ifade edebilir hesaplanabilir işlevler. Örneğin, ifade edebilir Ackermann işlevi, hangi (ilkel özyinelemeli değil) BlooP'de yazılamaz. Standart terminolojiden ödünç alma matematiksel mantık,[3][4] Hofstadter, FlooP'un sınırsız döngülerini MU döngülerini çağırır. Tüm Turing-complete programlama dilleri gibi, FlooP de durdurma sorunu: programlar sona ermeyebilir ve genel olarak hangi programların çalışacağına karar vermek mümkün değildir.

BlooP ve FlooP şu şekilde kabul edilebilir: hesaplama modelleri ve bazen hesaplanabilirliği öğretmek için kullanılmıştır.[5]

BlooP örnekleri

Tek değişkenler vardır çıktı (prosedürün dönüş değeri) ve hücre(ben) (sabitler tarafından indekslenmiş doğal sayı değişkenlerinin sınırsız dizisi, Sınırsız Kayıt Makinesi[6]). Tek operatörler vardır (Görev ), + (ilave), × (çarpma işlemi), < (daha az), > (büyüktür) ve = (eşittir).

Her program yalnızca sınırlı sayıda hücre kullanır, ancak hücrelerdeki sayılar rastgele büyük olabilir. Listeler veya yığınlar gibi veri yapıları, bir hücredeki sayının belirli şekillerde yorumlanmasıyla, yani Gödel numaralandırma olası yapılar.

Kontrol akışı yapıları, sınırlı döngüleri içerir, koşullu ifadeler, İPTAL döngülerin dışına atlar ve ÇIK bloklardan dışarı atlar. BlooP, özyinelemeye, kısıtlanmamış sıçramalara veya FlooP'nin sınırsız döngüleriyle aynı etkiye sahip başka herhangi bir şeye izin vermez. Adlandırılmış prosedürler tanımlanabilir, ancak bunlar yalnızca önceden tanımlanmış prosedürleri çağırabilir.[7]

Faktöriyel işlev

TANIMLAMA PROSEDÜRÜ FABRİKA [N]: BLOK 0: ÇIKIŞI BAŞLAT ⇐ 1; HÜCRE (0) <1; EN ÇOK SAYIDA DÖNGÜ: BLOK 1: ÇIKIŞI BAŞLAT ⇐ ÇIKIŞ × HÜCRE (0); HÜCRE (0) ⇐ HÜCRE (0) + 1; BLOK 1: SON; BLOK 0: SON.

Çıkarma işlevi

Bu yerleşik bir işlem değildir ve (doğal sayılar üzerinde tanımlandığı için) asla olumsuz bir sonuç vermez (örneğin 2 - 3: = 0). Bunu not et ÇIKTI 0'dan başlar, hepsi gibi HÜCREs ve bu nedenle başlatma gerektirmez.

TANIMLAMA PROSEDÜRÜ EKSİ [M, N]: BLOK 0: M 

FlooP örneği

Aşağıdaki örnek, Ackermann işlevi, kullanarak bir yığını simüle etmeye dayanır Gödel numaralandırma: yani önceden tanımlanmış sayısal fonksiyonlarda İT, POP, ve ÜST doyurucu İTME [N, S]> 0, ÜST [İTME [N, S]] = N, ve POP [PUSH [N, S]] = G. Sınırsız olduğundan beri MU DÖNGÜSÜ kullanılırsa, bu yasal bir BlooP programı değildir. BLOKTAN ÇIK bu durumda talimatlar bloğun sonuna atlar ve döngüyü tekrar eder. İPTALdöngüden çıkan.[3]

TANIMLAMA PROSEDÜRÜ ACKERMANN [M, N]: BLOK 0: HÜCRE BAŞLANGICI (0) ⇐ M; ÇIKIŞ ⇐ N; HÜCRE (1) ⇐ 0; MU-DÖNGÜSÜ: BLOK 1: HÜCRE (0) = 0 İSE BAŞLAYIN, SONRA: BLOK 2: ÇIKIŞI BAŞLAT ⇐ ÇIKIŞ + 1; EĞER HÜCRE (1) = 0, SONRA: DURDURMA DÖNGÜ 1; HÜCRE (0) ⇐ ÜST [CELL (1)]; HÜCRE (1) ⇐ POP [CELL (1)]; BLOK 1'DEN ÇIK; BLOK 2: ÇIKIŞ = 0 ise SONLANDIR, SONRA: BLOK 3: ÇIKIŞI BAŞLAT ⇐ 1; HÜCRE (0) ⇐ EKSİ [CELL (0), 1]; BLOK 1'DEN ÇIK; BLOK 3: SON ÇIKIŞ ⇐ EKSİ [ÇIKIŞ, 1]; HÜCRE (1) PUSH [EKSİ [HÜCRE (0), 1], HÜCRE (1)]; BLOK 1: SON; BLOK 0: SON.

Ayrıca bakınız

Referanslar

  1. ^ Douglas Hofstadter (1979), Gödel, Escher, Bach, Temel Kitaplar, Bölüm XIII.
  2. ^ Stanford Encyclopedia of Philosophy: Hesaplanabilirlik ve Karmaşıklık
  3. ^ a b Hofstadter (1979), s. 424.
  4. ^ Thomas Forster (2003), Mantık, Tümevarım ve Kümeler, Cambridge University Press, s. 130.
  5. ^ David Mix Barrington (2004), CMPSCI 601: Hesaplama Teorisi, Massachusetts Amherst Üniversitesi, Ders 27.
  6. ^ Hofstadter, bu hücrelere bir "yardımcı değişkenler" kümesi olarak başvurur.
  7. ^ Hofstadter (1979), s. 413.

Dış bağlantılar