Bir dili Turing'in tamamlayıcısı yapan şey nedir?


79

Turing-complete'u tamamlayan asgari dil özellikleri / yapıları nedir?


21
Sadece Google'a gitmek daha iyi olmaz mı? en.wikipedia.org/wiki/Turing_completeness
aml90

2
Merhaba Meraklı Kedi, Programcılara hoş geldiniz! Listeleri yapılan çağrılar burada konuyla ilgili değildir: Bu bölümü sorunuzun dışına çıkardım. Bununla birlikte, bu arayış son derece geniştir: Üzerinde çalıştığınız belirli bir sorun var mıdır?

3
@amalantony: Sadece bir dipnot gibi .
Bobby

Bilgisayar bilimi perspektifi için buraya bakın .
Raphael,

Yanıtlar:


73

Bir Turing tarpit , mümkün olduğu kadar az eleman kullanırken Turing-tamamlamaya çalışan bir tür ezoterik programlama dilidir. Brainfuck belki de en iyi bilinen tarpit, ancak birçok var.

  • Iota ve Jot , SK (I) birleştirici hesabına dayanarak sırasıyla iki ve üç sembollü işlevsel dillerdir .

  • OISC ( Bir Komut Seti Bilgisayarı ), yalnızca bir veya daha fazla argüman için bir talimat gerektiren, genellikle “sıfıra eşit veya sıfıra eşitse çıkarma ve dallanma” veya “ödünç alınma durumunda ters çıkarma ve atlama” gerektiren bir tür zorunlu hesaplama anlamına gelir. X86 MMU önceki talimatı uygular ve böylece Turing-tamamlandı.

Genel olarak, zorunlu bir dilin Turing-tamamlanması için, aşağıdakilere ihtiyacı vardır:

  1. Koşullu tekrarlama ya da koşullu atlama biçimi (örneğin while, if+ goto)

  2. Bir tür depolama biçimini okuyup yazmanın bir yolu (örneğin, değişkenler, teyp)

Bir lambda-matematiğe dayalı işlevsel bir dilin TC olması için:

  1. Argümanlar üzerindeki işlevleri soyutlama yeteneği (örneğin, lambda soyutlama, tırnak)

  2. İşlevleri argümanlara uygulama yeteneği (örneğin, azaltma)

Elbette hesaplamaya bakmanın başka yolları da var, ancak bunlar Turing tarpitleri için ortak modellerdir. Gerçek bilgisayarlar olduğunu unutmayın değil evrensel Turing makineleri onlar sınırsız depolama yok çünkü. Kesinlikle, onlar “sınırlı depolama makineleri” dır. Onlara hafıza eklemeye devam edersen, Turing makinelerinin iktidarında asimptotik olarak yaklaşacaklardı. Bununla birlikte, sınırlı depolama makineleri ve sonlu durum makineleri bile hesaplama için kullanışlıdır; onlar sadece evrensel değillerdir .

Açıkçası, Turing'in eksiksiz olması için G / Ç gerekli değildir; TC sadece bir dilin istediğiniz işlevi hesaplayabileceğini , sonucu gösterebileceğini iddia eder . Uygulamada, her faydalı dilin bir şekilde dünya ile etkileşime girme yolu vardır.


Zorunlu diller için basit değişkenler yeterli mi? Bir çeşit koleksiyonun (örneğin, diziler veya bağlantılı listeler) gerekli olacağı izlenimindeydim.
luiscubal

1
@luiscubal istediğiniz miktarda veri belirtebilmeniz gerekir. Basit değişkenlerle değişkenlerin kendilerinin sahip olduğu veri miktarını temsil edebilirsiniz. N + 1 farklı veri parçasını temsil etmeniz gerekirse. Birisi Fractran gibi hileler ile basit değişkenlerde bile yapabileceğinizi iddia edebilir ... ama tam olarak sorduğunuz şey bu değil.

Dilin SONSUZU döngüleri desteklemesi gerekmiyor mu?
sergiol

Re, "her faydalı dilin dünya ile etkileşime girme yolu vardır." Algol 60 , dünya ile herhangi bir tanımlanmış etkileşim yoluna sahip değildi . Algol 60 programındaki tüm I / O'nuz kütüphane fonksiyonlarını çağırarak yapıldı ve kütüphane fonksiyonları farklı uygulamalarda tamamen farklı olabilir. Ancak, kendimi Algol 60'ın "yararlı" olup olmadığına dair herhangi bir tartışmadan kendimden uzak tutuyorum.
Solomon Yavaş

15

Daha pratik bir bakış açısına göre: Turing-eksiksiz bir dildeki tüm programları kendi dilinize çevirebiliyorsanız, o zaman (bildiğim kadarıyla), dilinizin Turing-tamamlanmış olması gerekir. Bu nedenle, tasarladığınız dilin Turing-complete olup olmadığını kontrol etmek istiyorsanız, bir Brainf *** yazıp YourLanguage derleyicisine yazabilir ve tüm yasal BF programlarını derleyebildiğini ispatlayabilir / gösterebilirsiniz.

Açıklamak gerekirse, YourLanguage için bir tercümana ek olarak, herhangi bir BF programını YourLanguage için derleyebilecek bir derleyici (herhangi bir dilde) yazmanız gerekir (elbette aynı semantiği koruyarak).


11
Evet, bu kesinlikle ona yaklaşmanın en pratik yolu olacaktır. </sarcasm>
Robert Harvey,

13
@RobertHarvey'in bir noktası var, ancak genel fikir oldukça hayati. Brainfuck'un programlama dilleri giderken tamamlanmış ve çok basit olduğu kanıtlanmıştır . Ezoterik olmayan programlama dilleri için, bir beyin hilesi tercümanı uygulamak, hiçbir yerden kesin bir kanıt vermekten çok daha kolay ve daha hızlı olabilir (BF'yi bir çift Python çizgisinde uygulayabilirim, ancak resmi bir yerden başlayacağımdan emin değilim) Python'un eksiksiz çalıştığını ispatlamak; ve onlarca ezoterik beyin hasarı esir diline ait dillerin tam olarak çalıştığı biliniyor, çünkü beyin sapkınlığına nasıl eşleştikleri bilinmektedir.

7
@RobertHarvey: Neden olmasın? Kuşkusuz, kendi dilini tasarlayan biri, kendisine bir BF derleyicisi yazabilir (zorunlu olsaydı ve başka bir uygun dil bulabilirse).
Anton Golov

5
@delnan: Sen olacak senin BF tercüman doğru BF şartname uygulayan Ancak, kanıtlamak zorunda IOW size BF tercüman, aslında, bir BF benzeri bir dil için bir BF tercüman değil, bir tercüman olduğunu kanıtlamak zorunda olacağını Turing-tamamlanmış olabilir veya olmayabilir.
Jörg W Mittag

2
@ DarekNędza, Turing Completeness'ın nasıl tanımlandığının sadece doğal bir sonucudur; Turing Complete dilinin herhangi bir uzantısı hala Turing Complete olacaktır.
Anton Golov

8

Bir sistem ancak Turing'in evrensel bir Turing makinesinin yapabileceği herhangi bir şeyi yapması durumunda tamamlanmış sayılabilir. Üniversal Turing makinesinin verilen herhangi bir hesaplanabilir fonksiyonu çözebileceği söylendiğinden, Turing komple sistemleri de genişletebilir.

Turing'in eksiksiz olup olmadığını kontrol etmek için, içine bir Turing makinesi uygulayıp uygulayamayacağınıza bakın. Başka bir deyişle, aşağıdakileri simüle edip edemediğini kontrol edin:

  1. "Değişkenleri" (veya isteğe bağlı verileri) okuma ve yazma yeteneği : Hemen hemen kendi kendini açıklayıcı.
  2. Okuma / yazma kafasını hareket ettirmeyi simüle etme yeteneği : Sadece değişkenleri alıp saklayabilmek yeterli değildir. Diğer değişkenlere referans vermek için bandın başını hareket ettirme yeteneğini simüle etmek de mümkün olmalıdır. Bu genellikle programlama dilleri içerisinde dizi veri yapılarının (veya eşdeğeri) kullanımıyla veya makine kodu gibi bazı dillerde, "işaretçiler" (veya eşdeğeri) kullanılarak diğer değişkenlere referans verme yeteneği ile simüle edilebilir.
  3. Sonlu durumlu bir makineyi simüle etme kabiliyeti : Sıkça belirtilmemesine rağmen, Turing makineleri aslında AI geliştirmesinde sıklıkla kullanılan sonlu durum makinelerinin bir çeşididir. Alan Turing, devletlerin amacının, bir kişinin "çeşitli problem çözme modlarını" taklit etmek olduğunu söyledi.
  4. Bir "durma" durumu : Sık sık bahsedilmesine rağmen, bir takım kuralların Turing'in eksiksiz olduğunu saymak için kendisini tekrarlayabilmesi gerekir, bu bir algoritmanın durum algoritmaları her zaman ne olması gerektiğinin biçimsel tanımı olduğundan gerçekten iyi bir kriter değildir. sonunda sonuçlandırmak. Bir şekilde sonuçlanamazlarsa, ya Turing tamamlanmadı ya da söz konusu algoritma hesaplanabilir bir işlev değil. Çalışma biçimleri nedeniyle (örneğin oyun konsolları gibi) teknik olarak sonuç alamayan komple sistemleri döndürmek, bir durma halini bir şekilde “simüle edebilmek” ile bu sınırlamayı aşmaktadır. “Durma problemi” ile karıştırılmaması, kanıtlanamayan bir işlev

Bunlar, Turing tamamlandı olarak kabul edilmesi gereken bir sistemin asgari gereklilikleridir. Ne fazla ne eksik. Bunlardan herhangi birini bir şekilde taklit edemezse, Turing tam olmaz. Diğer insanların önerdiği yöntemler, bu özelliklere sahip olmayan birkaç Turing komple sistemi olduğu için sona ermek içindir.

Gerçek bir Turing komple sistemi kurmanın bilinen bir yolu olmadığını unutmayın. Bunun nedeni, Turing makinesinin bandının sınırsızlığını fiziksel alan içinde gerçekten taklit etmenin bilinen bir yolunun bulunmamasıdır.


4

Onunla herhangi bir hesaplama yapabiliyorsanız, bir programlama dili tamamlanmıştır. Yanıtlar döngüler gerekir ya da dilleri olmadığı için değişkenler yanlış ihtiyacı olduğunu söyleyerek böylece dil turing eksiksiz yapan özelliklerden sadece bir set yoktur , ne oldu ama tam turing edilmektedir.

Alan Turing evrensel turing makinesini yaptı ve evrensel makine üzerinde çalışmak üzere tasarlanmış herhangi bir programı kendi dilinizde çalıştırmak için çevirebilirseniz, aynı zamanda Turing tamamlandı. Bu aynı zamanda dolaylı olarak da çalışır, böylece tüm evrensel turing makinesi programları bir Y programına çevrilebildiğinden, tüm Y dili turing için tüm programlar X için çevrilebilirse, X dilinin tamamlanmış olduğunu söyleyebilirsiniz.

Zaman karmaşıklığı, alan karmaşıklığı, giriş / çıkış formatı ve herhangi bir programın yazılması kolay denklemde yer almaz, böylece hesaplamalar güç kaybı veya Dünya tarafından güneş tarafından yutulursa durdurulmazsa tüm hesaplamaları teorik olarak yapabilir.

Genellikle, turingin eksiksiz olduğunu kanıtlamak için, tam bir dili çevirdiği kanıtlanmış herhangi bir tercüman yaparlar, ancak çalışması için bir dilin tamamlanması için gerçekten gerekli olmayan iki şey için giriş ve çıkış araçlarına ihtiyacınız vardır. Programınızın başlangıçta durumunu değiştirmesi ve program durdurulduktan sonra belleği denetlemeniz yeterlidir.

Başarılı bir dil yapmak için, gerçekte tamamlamanın ötesinde bir şey olmasına ihtiyaç duyuyor ve bu da turing tarpları için bile geçerli. BrainFuck'ın, ve olmadan popüler olacağını sanmıyorum ..


2
"Herhangi bir hesaplama yapabiliyorsanız, bir programlama dili tamamlanmıştır." Bu, Turing-tamamlayan bir dil değil, Turing Turing tezi.
Rhymoid

@ Rhymoid Yani bir tercüman yapamazsanız hiçbir şeyin tamamlanmadığını mı demek istiyorsunuz? Yani. lambda matematiği eşit olsa bile tam turing yapmıyor mu?
Sylwester

1
Hala Turing eşdeğeri ve Turing-komple (ve Turing-güçlü) terimlerinin yetkili bir tanımını arıyorum. Mesaj panolarındaki insanlardan, bu terimleri farklı şekilde yorumlayan kendi araştırmacı gazetelerindeki araştırmacılara kadar çok fazla vaka gördüm.
Rhymoid

Her neyse, 'Turing-complete'ı bir Universal Turing Machine'e eşdeğer bir simülasyon olarak yorumluyorum (UTM; sırayla herhangi bir Turing makinesini - dolayısıyla' evrensel '). Turing’in 1936’daki makinelerinde tanıttığı makalesinde bir UTM kavramını tanımladı ve UTM’lerin Church’ün lambda matematiğine eşdeğer bir simülasyon olduğuna dair bir kanıt verdi. Bunu yaparak, aynı hesaplama gücüne sahip olduklarını kanıtladı. Kilise-Turing tezi, basitçe söylemek gerekirse, “alacağınız tüm hesaplama gücü budur”.
Rhymoid

Vikipedi Turing eksiksizlik sayfası için iki resmi tanımı vardır . Biri G / Ç gerektirir, diğeri değildir. Bir Turing ile ilgili tüm fonksiyonları hesaplayabiliyorsa, bir makinenin turing olduğunu söylemediği. Bu, lambda matematiğini tekrar turing işlemine geri döndürür, çünkü lambda matematiğinde herhangi bir turing makinesi programı ile aynı olanı kolayca hesaplayabilirsiniz.
Sylwester

4

Sonsuz döngü yapıp yapmadığını veya duracağını söyleyemezsin.

-------------

Açıklama: Bazı girdiler göz önüne alındığında, her durumda (başka bir Turing makinesi kullanarak) işin sonsuz bir şekilde dönüp dönmeyeceğini, sonunda çalıştırmaktan (durursa cevap verir, ancak size bir cevap verir, ama durmaz) durduğunu söylemek imkansızdır. döngüler varsa!).

Bu, bir şekilde potansiyel olarak sınırsız miktarda veri depolayabilmeniz gerektiği anlamına gelir - ne kadar sarsılmış olursa olsun, sonsuz kasete eşdeğer olmalıdır! (Aksi takdirde, yalnızca sınırlı sayıda durum vardır ve daha sonra bu durumdan geçip geçmediğinizi kontrol edebilir ve sonunda durdurabilirsiniz). Genel olarak, Turing makineleri bazı kontrol edilebilir yollarla durumlarının boyutunu büyütebilir veya daraltabilir.

Turing'in orijinal üniversal Turing makinesi çözülemez bir durma problemine sahip olduğundan, kendi Turing komple makinenizin de çözülemez bir durma problemi olması gerekir.

Tüm sistemlerin Turing'i, diğer tüm Turing sistemlerini taklit edebilir, bu nedenle sisteminizde iyi bilinen bazı Turing sistemlerini taklit edebiliyorsanız, sisteminizin de Turing işleminin tamamlandığını kanıtlar.

Mesela, yılanların ve merdivenlerin Turing'in eksiksiz olduğunu kanıtlamak istediğinizi varsayalım, sürekli tekrarlanan ızgara düzenine sahip bir tahta (üstte ve solda farklı bir sürüm ile) verildi. 2-sayaçlı Minsky makinenin Turing tamamlandığını bilerek (ki bu 2 sınırsız sayıcıya sahiptir ve sonlu sayılardan 1 durumu vardır), ızgaradaki X ve Y pozisyonunun 2 sayıcının geçerli değeri olduğu eşdeğer bir tahta oluşturabilirsiniz. ve mevcut yol mevcut durumdur. Bang! Az önce Yılanlar ve Merdivenlerin tamamlandığını kanıtladınız.


1
Bu tartışmayı satın almıyorum. Sadece Turing makineleri için durma sorununun tespit edilememesi, durma sorununun kesin olarak belirlenemediği bir program belirlemenizi sağlayan her notasyonun doğrudan Turing'in tamamlandığı anlamına gelmez. Sadece tersi açıkça doğrudur: Eğer gösterim tamamlanmışsa, o zaman durma sorununun çözülemeyeceği programları yazmak elbette mümkündür.
5gon12eder

Bu gerekli bir durumdur. Her programın bitip bitmeyeceğine karar verebilirseniz, dil tamamlanmadı.
gnasher729

4

Gerekli bir koşul, yinelemenin önünde belirlenmeyen maksimum yineleme sayısı olan bir döngü veya maksimum yineleme derinliğinin önceden belirlenmemiş olduğu yinelemedir. Bir örnek olarak, için ... lütfen ... döngüler sen birçok yeni dilde onları bulmak olarak değil dil turing eksiksiz yapmak için yeterli (ama diğer araçlara sahip olacaktır). Bunun sınırlı sayıda yineleme veya sınırlı özyineleme derinliği anlamına gelmediğini, ancak maksimum yineleme ve özyineleme derinliğinin önceden hesaplanması gerektiğini unutmayın.

Örneğin, Ackermann işlevi bu özellikler olmadan bir dilde hesaplanamaz. Öte yandan, bu özellikleri gerektirmeksizin oldukça karmaşık ve oldukça kullanışlı bir çok yazılım yazılabilir.

Öte yandan, her yineleme sayısı ve ileride hesaplanan her yineleme derinliği ile birlikte, sadece bir programın durup durmayacağına karar verilemez, aynı zamanda durur.


-1

Bunun biçimsel olarak doğru bir cevap olmadığını biliyorum, ancak 'Turing-complete' dışında 'minimal'i aldığınızda ve' pratik'i 'ait olduğu yere geri koyduğunuzda, bir programlama dilini ayırıcıdan ayıran en önemli özellikleri göreceksiniz. biçimlendirme dili

  • değişkenler
  • şartlamalar (eğer / sonra ...)
  • loopage (loop / break, iken ...)

gelecek gel

  • adsız ve adlandırılmış işlevler

Bu iddiaları test etmek için bir işaretleme dili ile başlayın, örneğin, HTML. HTML değişkenlerini yalnızca değişkenlerle veya yalnızca koşullularla (MS bunu koşullu yorumlarla yaptı) veya bir tür döngü yapısını (koşulsuzların yokluğunda muhtemelen gibi bir şeyle sonuçlanacak şekilde <repeat n='4'>...</repeat>) icat edebiliriz . bunlardan herhangi birini yapmanız, HTML + 'yı düz HTML'den önemli ölçüde (?) daha güçlü hale getirecektir, ancak yine de bir programlama diline göre daha fazla işaretleyici olacaktır; Her yeni özelliğin yanında, onu daha az bildirimsel ve daha çok zorunlu bir dil haline getirirsiniz.

Mantık ve programlamada minimallik arayışı elbette önemli ve ilginç, ancak n00bies'e genç veya yaşlı 'programlama nedir' ve 'programlamayı nasıl öğreneceğimi' öğretmek zorunda kalsaydım, tam genişlik ve genişlikle başlamazdım. Turing'in bütünlüğünün teorik temelleri. yemek pişirme ve programlama tüm özü, doğru sırada, annenin yaptığı gibi, hazır kadar tekrarlayan şeyler yapıyor. bu konuda benim için özetliyor.

sonra tekrar, CS'mi asla bitirmedim


2
Emin değilseniz, önce araştırmanız gerekir. fractran olan Turing tamamlandığında olduğu gibi Brainf * ck . Ayrıca, html 5 + CSS 3'ün Turing tamamlandığını unutmayın, çünkü 110 kuralını uygulayabilir .

1
yesyesyes biliyorum. Ancak verilen tüm örnekler aşağı yukarı ezoteriktir (belki ilginç veya şaşırtıcı olsa da), cevabım pragmatik bir cevaptı ve çok az değil. Bunun belirtilmesinin önemli olduğunu düşünüyorum - bu sayfa google’da Turing eksiksizliği ararken 1 numaraydı, buradaki cevaplar HTML’yi PHP veya Python’dan ayıran şeyin ne olduğunu bilmek isteyen bir n00bie için çok az kullanım için IMHO. Yani, beyinsiz ck sebepsiz yere beyinsiz ck denmez .
akış
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.