Turing tamamlandı bir programlama dili için minimum kriterler var mı?


55

Turing Complete olarak kabul edilmesi için bir programlama dilinde bir dizi programlama dili yapısı var mı?

Wikipedia'dan söyleyebileceğimden , dilin özyinelemeyi desteklemesi gerekiyor ya da görünüşte durmadan çalışabilmesi gerekiyor. Hepsi bu kadar mı?


6
Belki de sorunuz “Asgari bir programlama yapıları kümesi var mıdır?” Diye sormalıdır, çünkü cevaplandığı gibi cevap “Tüm hesaplanabilir olanlar” dır.
Dave Clarke


@DaveClarke, teşekkürler, bunu güncelledim. Benim yorumumun biraz soru sorduğunu biliyorum, bununla birlikte benim dilimin zayıf olduğu varsayılıyor. Demek istediğim, bir dil hesaplayabiliyorsa, bunun eşdeğer olacağını gösteren birkaç işlem olup olmadığını sormak istedim.
Khanzor

Yanıtlar:


45

Hep olsa -Recursive fonksiyonlarμ çivilenmiş. İşte tüm hesaplanabilir fonksiyonlar kümesini tanımlar; resp içeren en küçük fonksiyon setidir. karşı kapalı:

  1. Sabit fonksiyonu0
  2. Halefi işlevi
  3. Parametre seçimi
  4. İşlev bileşimi
  5. İlkel Özyineleme
  6. μx

Detaylar için yukarıdaki linke bakınız; Bunun çok kompakt bir programlama dili için yapıldığını görüyorsunuz. Ayrıca ücretsiz öğle yemeği de programlamak korkunçtur. Bunlardan herhangi birini düşürürseniz, tam güç kaybedersiniz, bu yüzden asgari bir aksiyom dizisidir.

Bunları kelimenin tam anlamıyla WHILE programları için temel sözdizimsel öğelerine , yani

  1. Sabit 0
  2. incrementation _ + 1
  3. Değişken erişim x
  4. Program / deyim birleştirme _; _
  5. Geri sayım döngüleri for ( x to 0 ) do _ end
  6. Döngüleri while ( x != 0 ) do _ end

1
Bence 5. kuralı dile bırakamayacağın açık . Bu yana while, 6 döngü sabit sıfıra karşılaştırır, değişkenler sadece, kural 2 ile artırılır ve (kural 1) başlatmak için negatif sabit vardır edilebilir while6 döngü girilmezse ya (X = 0) veya sonsuz var ( x> 0 ve döngü gövdesi bunu azaltamaz).
MSalters

1
@ MSalters haklı olduğunu düşünüyorum; simülasyon için, aklımdaymış gibi görünüyor, ihtiyacımız var _ - 1ve bunu olmadan yapmanın bir yolunu düşünemiyorum for. Onu yakaladığın için teşekkürler! ( "İyi" nedir - dahil _ - 1veya forHmm?.)
Raphael

20

Turing Complete olarak kabul edilmesi için bir programlama dilinde gerçekleştirilmesi gereken bir dizi hesaplama var mı?

Evet, dikkate alınmak için Turing tamamlandı, bir programlama dili, bir Turing makinesi tarafından gerçekleştirilebilecek herhangi bir hesaplama yapabilmelidir. Bu nedenle, asgari bir gereklilik olarak, evrensel bir Turing makinesi veya başka bir Turing dilinin tamamının tercümanı olarak uygulayabilmeniz gerekir.

Wikipedia'dan söyleyebileceğimden, dilin özyinelemeyi desteklemesi gerekiyor ya da görünüşte durmadan çalışabilmesi gerekiyor. Hepsi bu kadar mı?

Hayır. Örneğin, izin verilen tek işlemin özyinelemeye sahip olduğu bir dil (yani yazabildiğiniz tek olası fonksiyon f(x) = f(x)şudur: Tamamlanmadı çünkü tüm yazabildiğiniz hiçbir zaman sonlanmayan programlardır. Bir Turing makinesi tarafından gerçekleştirilebilecek herhangi bir hesaplamayı yapabilmek gerekiyor, bu yüzden açıkça yeterli değil.

Ayrıca bir dil, düşündüğünüz şekilde özyinelemeyi desteklemek zorunda değildir. Sadece döngüleri ifade etmenin sınırsız bir yolu. Bu özyineleme olabilir, ancak bir süre döngüsü veya bir başa dönme olabilir. Hiç fonksiyonu olmayan bir dil hala Turing tamamlanıyor olabilir. Ve tekrar döngüler ya da özyinelemeli fonksiyonlar yeterli bir durum değildir. Bir koşula bağlı olarak farklı kod yürütmek için bir yöntem ve eskilerden yeni değerleri hesaplamak için bir yönteme ihtiyacınız var (aksi halde tüm döngüler / özyineleme sonsuz olacaktır veya hiç çalışmaz).


Bu işlemleri destekleyen herhangi bir dil tamamlandı ve olmayan bir dil grubu olsun, gerekli ve yeterli sayıda işlem kümesi olup olmadığına gelince: Hayır, yok ("işlemi" bu kadar belirsiz bir şekilde tanımlamazsanız) , anlamsız hale gelir):

Örneğin, daha önce de söylediğim gibi, özyinelemeli işlevleri (veya hiçbir işlevi) desteklemeyen tam dilleri Turing vardır. Bunlar, bir gotoifadeleri veya whiledöngüleri (ve isteğe bağlı miktarlarda veri depolamanın bir yolu) varsa, hala Turing olabilir . Ancak özyinelemeli işlevlere sahip bir dilin ne Turing'in eksiksiz olması gerek ne whilede gotoolması gerekir. Bu yüzden goto, gerekli işlemlerin yapılmasına gerek kalmayacak, ancak kaldırırsanız artık tam olarak tamamlanmayan diller var goto. Böylece böyle bir set yoktur.


Emin olamadığım tek parça, gerekli asgari operasyonlara vereceğiniz cevap. Operasyon tanımınızı, istenenden daha dar bir kapsam gibi görünen Kontrol Yapıları ile sınırlıyor gibi görünüyorsunuz ve onları "belirsizce" anlamsız hale getirecek "olarak tanımlamamanızın gerekliliğinin ötesinde.
Joshua Drake

@JoshuaDrake Ne demek istediğinden emin değilim. Yapıları kontrol etmek için operasyonları sınırlamıyorum. Sadece karşı örneğimde kontrol yapıları olmayan herhangi bir işlemden bahsetmiyorum çünkü bunlar örnekle alakalı değil. Aslında "keyfi miktarda veri depolamanın bir yolundan" bahsediyorum - bu pek bir kontrol yapısı değil.
sepp2k

Bazı dillerin Turing Completeness'ı desteklediğini gotoancak bazılarının bunu yapmadığını, bazılarının onu kullandığını ve bazılarının bunu gototamamlamadığı için bir dizi işlemin parçası olamayacağını iddia ettiği iddiasında bulunmadığına dikkat çekiyorsunuz. Benim demek ki gotosadece böyle bir atlama gibi belirli bir daha genel çalışmasını uygulanması sözdizimsel yoludur. Bu nedenle, belirli kontrol yapılarından soyutlanmış olmanız durumunda, en azından Turing Completeness'a işaret edecek bir dizi operasyona yaklaşacağınıza inanıyorum.
Joshua Drake

@JoshuaDrake Gitmek yerine "jump" kullanmanın bizi yeterli ve gerekli bir işlem kümesi tanımlayabileceğimiz bir noktaya getirdiğini sanmıyorum. Her dilin bir çeşit atlama işlemine ihtiyaç duyacağı doğrudur (ve yalnızca işlev çağrılarıysa), ancak yeterli hale getirmek için daha fazla işlem gerçekleştirebileceğinizi düşünmüyorum. Örneğin lambda hesabının iki işlemi vardır: uygulama (yani atlama
işlemimiz

1
@JoshuaDrake Makalenin herhangi bir Turing tamamlanmış dilin bu işlemleri gerçekleştirmesi gerektiğini iddia etmeye çalıştığını sanmıyorum. Özellikle de bu ifadeyi usule ilişkin dillerle kısıtladığından. Bir çeşit goto dışında (yani işlev uygulaması) Lambda Calculus'ta hiçbir şey yok. Bence buradaki "minimum", yalnızca bu özelliklere sahip bir dilde, Turing'in bütünlüğünü kaybetmeden hiçbirini kaldıramayacağınız anlamına gelir. Turingin eksiksizliği için de yeterli olan başka bir işlem yoktur.
sepp2k

14

Tam dilleri Turing'e götüren çeşitli tek talimatlar vardır. Tipik örnek "sıfır ve çıkar". Bunlar assembly dili programlama bağlamında iyi bilinmektedir. Ayrıntılar için Wikipedia makalesine bakın.

Bu, bir karakterizasyona yol açar: Bir dil, sadece tamsayıları alma ve kaydetme işlemlerini simüle edebiliyorsa ve sadece "sıfır ise çıkarma ve dallanma" işlemlerini gerçekleştirebiliyorsa, tamamlanmadır.


13

Bu, sorunuza genel bir cevap değildir, ancak yapılandırılmış programlama teoremine göre, gereken tek şey, seçim yapma (örneğin, ifC / C ++ 'da) ve tekrarlama (örneğin, whileC / C ++' da) yeteneğidir . Düzenleme: Dave Clarke tarafından yorumlarda belirtildiği gibi, yapılandırılmış programlama teoremi de sıralama gerektirir. Bunu okuyucuyu kabul etmedim çünkü okuyucunun daha sonra okudukları ve hafıza deposuna yazıp okudukları gibi diğer talimatların temel bloklarının gerekli olduğunu anlamaları gerektiğini kabul ettim). Tabii ki, açık olması daha iyidir; Bunları da yapabilmelisin.

Bunların her ikisi de koşullu bir sıçrama komutu (örneğin, JNZx86'da) kullanılarak gerçekleştirilebildiğinden, bu, Turing denkliği için de yeterlidir.

Başka şeylerin gerekli olduğunu, yani bir çeşit harici bellek deposuna sınırsız sayıda sembol (örn. Bit ... 0 veya 1) yazma yeteneği gerektiğini unutmayın. Bu anlamda, gerçek bilgisayarlar Turing'e eşdeğer değildir, çünkü hiçbirinde sonsuz miktarda depolama alanı yoktur. Turing modeli hala kullanışlıdır, ancak bellek miktarı tipik olarak çok büyük olduğundan ve gerçek bir bilgisayarın çözebileceği herhangi bir problemin, belirli bir sonlu otomat tarafından çözülebilmesine rağmen, bu hesaplama modelini kullanmak özellikle yararlı değildir. devletlerin sayısı akıl almaz derecede büyük olurdu).

Bunun mutlaka sepp2k'nin cevabı ile alakası olmadığını unutmayın; bu aynı soru hakkında düşünmenin farklı bir yoludur.

DÜZENLE:

Not da gerçekten hem gerek yoktur ifve whileC / C ++ içinde. Aşağıdaki gibi ifkullanarak taklit edebilirsiniz while:

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

Aşağıdaki kod her zaman eşdeğerdir:

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

Peki ... inşaat dikkatli olmalı, mümkün olmalı. Ayrıca özyinelemeli işlevleriniz varsa, sonunda seçim yapmanız gerektiğini de unutmayın; seçimi olmayan özyinelemeli işlevler temel durumları gerçekten uygulayamadığından, özyinelemeli herhangi bir işlev sonsuz özyinelemeyle sonuçlanacaktır.

DÜZENLE:

Ayrıca, Turing denkliği için durmayan bir program yazma yeteneğinin yeterli olup olmadığı konusundaki sorunuzla ilgili cevap hayır; bu gerekli, ancak yeterli değil. Durma problemini, durdurulamayan programları ifade edemeyen bir dilde yazılmış programlar için çözebiliriz; Cevap, tüm örnekler için "program durdu" dur. Ancak, tek komutun makinenin sonsuz bir döngüye girmesine neden olan bir dil tanımlayabiliriz ... böyle bir dil Turing'e eşdeğer değildir.


13

SK(S x y z)=(x z (y z))(K x y)=x

X=λx.((x S) K)


5

Dil yapıları değiştirilebilir

Hangi yapıların yerel olarak bir programlama dili tarafından sağlanması gerektiği konusunda asgari kriterler yoktur . Bir Turing-complete sistemini ifade etmek için bir şekilde kıvrılabilen bazı garip yapılar sağlarsa, görünüşe göre bu yapılar diğerleri kadar "uygun" dur.

Sağlayan bir dil - Bunu kanıtlamak için sadece , bir işlemin tamamlandığını Turing ise "sıfır olursa çıkarma ve şube" ayrı bir "alt çıkarma ve eğer sıfır ise şube" yapı sağlamayan tamamlanmış diller var, ergo hiçbir yapı veya zorunlu bir yapı yok.

Tüm TP-tamamlanmış bir dil yapısının etkileri, diğer herhangi bir TP-tam dilin yapıları ile öykünebilir.

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.