Turing-complete'u tamamlayan asgari dil özellikleri / yapıları nedir?
Turing-complete'u tamamlayan asgari dil özellikleri / yapıları nedir?
Yanıtlar:
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:
Koşullu tekrarlama ya da koşullu atlama biçimi (örneğin while
, if
+ goto
)
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:
Argümanlar üzerindeki işlevleri soyutlama yeteneği (örneğin, lambda soyutlama, tırnak)
İş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.
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).
</sarcasm>
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:
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.
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 .
.
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.
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.
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
gelecek gel
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