Turing Complete nedir?


Yanıtlar:


324

İşte en kısa açıklama:

Bir Turing Complete sistemi, yanıt bulabilecek bir programın yazılabileceği bir sistem anlamına gelir (çalışma zamanı veya bellek ile ilgili herhangi bir garanti olmaksızın).

Yani, eğer birisi "benim yeni şeyim Turing Complete" ise, prensipte (genellikle pratikte olmasa da) herhangi bir hesaplama problemini çözmek için kullanılabilir.

Bazen bu bir şaka ... Bir adam vi'da bir Turing Machine simülatörü yazdı, bu yüzden vi'nin dünyada şimdiye kadar ihtiyaç duyulan tek hesaplama motoru olduğunu söylemek mümkün.


18
Daha fazla okuma için Açıklamalı Turing'e bakınız. Çok yaklaşılabilir. amazon.com/Annotated-Turing-Through-Tistoric-Computability/dp/…
i_am_jorf

43
"genellikle pratikte değil" yanlıştır. Hiçbir sistem pratikte Turing-tamamlanmamıştır, çünkü gerçekleştirilebilir hiçbir sistem sonsuz bir banda sahip değildir. Gerçekten kastettiğimiz, bazı sistemlerin Turing-bütünlüğünü mevcut belleklerinin sınırlarına kadar tahmin etme yeteneğine sahip olmasıdır.
Shelby Moore III

22
Ama Vi dünyada ihtiyaç duyulan tek hesaplama motorudur ... ;-)
Joe Edgar

4
Emacs da bir Torna Makinesi mi? XD
alem0lars

6
Birisi yakın zamanda PowerPoint'in de Turing Complete olduğunu gösterdi.
Tagc

192

İşte en basit açıklama

Alan Turing, bir program alabilen, o programı çalıştırabilen ve sonuç gösterebilen bir makine yarattı. Ama sonra farklı programlar için farklı makineler yaratmak zorunda kaldı. Böylece HERHANGİ BİR programı alıp çalıştırabilen "Evrensel Turing Makinesi" yarattı.

Programlama dilleri bu makinelere benzer (sanal olmasına rağmen). Program alıp çalıştırıyorlar. Şimdi, bir Turing makinesinin yeterli zaman ve bellek verebileceği herhangi bir programı (dilden bağımsız olarak) çalıştırabiliyorsa, bir programlama diline "Turing complete" adı verilir.

Örneğin: Diyelim ki 10 sayı alan ve ekleyen bir program var. Turing makinesi bu programı kolayca çalıştırabilir. Ancak şimdi, herhangi bir nedenle programlama dilinizin aynı eklentiyi gerçekleştiremeyeceğini hayal edin. Bu "Turing tamamlanmamış" (tabiri caizse). Öte yandan, evrensel Turing makinesinin çalıştırabileceği herhangi bir programı çalıştırabilirse, Turing tamamlandı.

Modern programlama dillerinin çoğu (örn. Java, JavaScript, Perl, vb.) Tamamlanır, çünkü her biri toplama, çarpma, eğer-başka koşul, dönüş ifadeleri, saklama / alma / silme yolları gibi programları çalıştırmak için gerekli tüm özellikleri uygular. veri vb.

Güncelleme: Blog gönderimle ilgili daha fazla bilgi edinebilirsiniz: "JavaScript Tamamlanıyor" - Açıklama


5
Turing ve diğer erken bilgisayar bilimcilerinin belirli bir sorunu çözmek istedikleri her seferinde belirli bir makine inşa edeceklerini hatırladığımda bu tür bir makine için bir terim bile olacağı çok daha mantıklı. Sonsuza kadar yeniden programlanabilen bir makineye alışkınız. Bağlam için teşekkürler, Raja.
Jacob Ford

JavaScript Nasıl Tamamlanabilir? Dosya sistemi, uygun çoklu kullanım API'sı yok. Özellikle tarayıcı güvenlik sanal alanı nedeniyle tonlarca sınırlama vardır. 'Programlama dili' olarak adlandırılamaz. (asm.js burada belirtilmelidir). Java, Python veya C ++ gerçek 'Turing Complete' örnekleridir. Ama js? Ben öyle düşünmüyorum.
Michael IV

2
@MichaelIV Turne makinesinde de bir dosya sistemi / iş parçacığı yoktu. JS kesinlikle tamamlandı.
Bax

@MichaelIV Bax'ın yanıtına eklemek için, bahsettiğiniz tüm güzel şeylere izin vermek için birlikte çalışan birkaç Turing makinesinden oluşan modern bir bilgisayar düşünülebilir . Örneğin CPU, monitörün kullanıcıya "bant" yazabilmesi için monitör için "bant" yazabilmesi için GPU'nun okuması için "bant" üretir. Benzer şekilde, CPU sabit diskler, NIC'ler, ses kartları vb. İçin "bant" üretebilir

86

Gönderen wikipedia :

Alan Turing'in adını alan Turing tamlığı, şimdiye kadar gelişmiş bir bilgi işlem cihazı için her makul tasarımın evrensel bir Turing makinesi tarafından taklit edilebilmesi bakımından önemlidir - bu, Church-Turing tezi olarak bilinen bir gözlemdir. Böylece, evrensel bir Turing makinesi olarak işlev görebilen bir makine, prensip olarak, başka herhangi bir programlanabilir bilgisayarın yapabileceği herhangi bir hesaplamayı yapabilir. Bununla birlikte, bunun, makine için bir program yazmak için gereken çaba, makinenin hesaplamayı gerçekleştirmesi için geçmesi gereken süre veya makinenin hesaplama ile ilgisi olmayan tüm yetenekleri ile ilgisi yoktur.

Gerçekten Turing-complete makineleri, sınırsız depolama alanına ihtiyaç duyduklarından fiziksel olarak imkansızdır, ancak Turing tamlığı, sınırsız depolama alanına sahip olsaydı evrensel olacak fiziksel makinelere veya programlama dillerine genellikle gevşek bir şekilde atfedilir. Tüm modern bilgisayarlar bu anlamda Turing-complete'tur.

"Tam turing '' yeterli zaman ve mekan verildiğinde hesaplanabilir problemi cevaplayabilme '' diyerek bundan daha teknik olmayan olabileceğinizi bilmiyorum.


4
Bu bağlamda, bir "bilgi işlem cihazı" nedir?
dopatraman

30
Çoğu Wikipedia makalesinde olduğu gibi, bu alıntı teknik olarak doğru olmasına rağmen, konuyla ilgili bilgisi olmayan ve anlamaya çalışan bir kişiye değer vermez.
Olayları

76

Gayri resmi Tanım

Turing tam dili, herhangi bir hesaplama yapabilen dildir. Church-Turing Tezi herhangi performable hesaplama Turing makinesi tarafından yapılabileceğini belirtir. Bir Turing makinası sonsuz rasgele erişim bellek ve sonlu 'programında' olan bir makine olduğunu dikte o belli bir sonuçla sona gerektiğini belleğin genelinde yazma ve hareket, ve ne bir sonraki yapmalıyım okumalı zaman. Bir Turing makinesine giriş, başlamadan önce belleğine konur.

Dili YAPAMAYANLAR Tamamlanıyor

Bir Turing makinesi bellekte gördüklerine dayanarak kararlar alabilirsiniz tek destekler işte dil '- +, -, *, ve /onun girişine dayalı bir seçim yapamaz çünkü tamsayılar üzerinde tam Turing değil, bir Turing makinesi can.

Bir Turing makinesi sonsuza kadar çalışabilir - Java, Javascript veya Python'u alıp herhangi bir döngü, GOTO veya işlev çağrısı yapma yeteneğini kaldırsaydık, Turing tamamlanmazdı çünkü rastgele bir hesaplama yapamaz. asla bitmez. Coq , sona ermeyen programları ifade edemeyen bir teorem kanıtlayıcısıdır, bu yüzden Turing tamamlanmamıştır.

Bir Turing makinesi sonsuz bellek kullanabilir - Tam olarak Java'ya benzeyen ancak 4 Gigabayttan fazla bellek kullandığında sona erecek olan bir dil Turing tamamlanmayacaktır, çünkü Turing makinesi sonsuz bellek kullanabilir. Bu yüzden gerçekten bir Turing makinesi inşa edemiyoruz , ancak Java hala bir Turing tam dilidir, çünkü Java dilinin sonsuz bellek kullanmasını engelleyen bir kısıtlaması yoktur. Bu, düzenli ifadelerin Turing'i tamamlamamasının bir nedenidir.

Turing makinesinin rasgele erişim belleği vardır - Yalnızca bellekte çalışmanıza pushve popbir yığının işlemlerine izin veren bir dil Turing tamamlanmayacaktır. Bir dizeyi bir kez okuyan ve yalnızca bir yığından itip haşhaş kullanarak belleği kullanabilen bir 'dilim' varsa (, dizede her birinin )daha sonra gördüğü zaman iterek (ve gördüğünde haşlayarak kendi kendine sahip olup olmadığını söyleyebilir ). Her Ancak, bu söyleyemezsin (kendi vardır )daha sonra ve her [kendi vardır ](not sonradan ([)]bu kriterleri karşılayan ama ([]]does not). Bir Turing makinası izlemek için onun rasgele erişim belleği kullanabilirsiniz ()'s ve[]ayrı olarak, ancak bu dil sadece bir yığın ile olamaz.

Bir Turing makinesi herhangi bir Turing makinesini simüle edebilir - Uygun bir 'program' verildiğinde bir Turing makinesi başka bir Turing makinesinin 'programını' alabilir ve keyfi girişte simüle edebilir. Python tercümanı uygulamaktan yasaklanmış bir diliniz olsaydı, Turing tamamlanmış olmazdı.

Tam dilleri çevirmeye örnekler

Dilinizde sonsuz rasgele erişim belleği, koşullu yürütme ve bir tür tekrarlanan yürütme varsa, muhtemelen Turing tamamlandı. Bir Turing makinesinin yapabileceği her şeyi hala başarabilen daha egzotik sistemler vardır, bu da onları Turing'i de tamamlar:

  • Tipik olmayan lambda hesabı
  • Conway'in yaşam oyunu
  • C ++ Şablonları
  • Prolog

11
SQL kesinlikle tamamlandı. Herhangi bir hesaplamaya izin veren komut dosyası oluşturma yeteneklerine sahiptir.
nzifnab

53
Hayır, SQL'i T-SQL / PL-SQL gibi uzantılarla karıştırıyorsunuz. ANSI SQL, tur tamamlanmadı. Ama TSQL / PLSQL - öyle.
Agnius Vasiliauskas

15
Görünüşe göre SQL tamamlandı: stackoverflow.com/questions/900055/…
Newtang

2
Turing bütünlüğüne göre - herhangi bir tek bantlı Turing makinesini simüle etmek için kullanılabiliyorsa sistem Turing tamamlandı. Ama yukarıdaki örnekte anladığım gibi devs özel olarak inşa edilmişti cyclic tag system, değil universal cyclic tag system. Bu nedenle - makale SQL turing tamlığını kanıtlamaz. (Ya da bir şeyi yanlış anladım)
Agnius Vasiliauskas

2
Turing-complete dilinin gerçekleştirilebilir bir uygulaması yoktur, çünkü sonsuz bant yoktur. Gerçekten kastettiğimiz, bazı dillerin Turing-tamamlayıcılığını ana makinenin kullanılabilir belleğinin sınırlarına kadar tahmin edebilmesidir.
Shelby Moore III

17

Temel olarak, Turing-tamlık sınırsız bir gerekliliktir, sınırsız özyineleme.

Bellek ile sınırlı bile değil.

Bunu bağımsız olarak düşündüm, ama işte iddianın tartışılması . LSP tanımım daha fazla bağlam sağlıyor.

Buradaki diğer cevaplar Turing-tamlığının temel özünü doğrudan tanımlamıyor.


Sonlu durum otomatalarının sınırsız özyineleme yapmasına izin verilir. Tipik bir örnek: a*.

3
@Rhymoid FSM'lerin belleği sınırlıdır (sonlu durum sayısı) - ancak kuyruk optimizasyonu olmadan sınırsız özyineleme sınırsız belleğe sahip olmalıdır. Tanımımı yalnızca kuyruk optimizasyonu ile sınırsız özyineleme alt kümesiyle sınırlandırmadım. Nazikçe oyunuzu kaldırın.
Shelby Moore III

sınırsız özyineleme tanımını sisli tuttunuz. 'İlkel özyineleme' anlamında 'özyineleme' ve 'kısmi' (veya 'genel' veya 'mu-') yaparak 'sınırsız' mı demek istediniz? O zaman haklı olabilirsin. Ancak mevcut formülasyonunuz David Harel'in "Halk Teoremleri" nde eleştirilen ifadelere çok yakın. Matematikte titiz olmak önemlidir ve kesin tanımları dışarıda bırakarak bunu görmezden geliyorsunuz. Bu arada: FSM'ler model etkileşimi için genelleştirilebilir; Onları TM'lerden ayıran şey, ikincisinin ortamının da (bant olarak) modellenmesidir.

@Romoid sayım, hassasiyetin antitezidir, örn. Sınırsız özyineleme, sonsuz bant olmadan imkansız olan her olası özyineleme biçimi anlamına gelir. Tamamen genelleştirilmiş özyineleme (sadece modeldeki genel değil) her zaman Turing-complete'tur. Genel özyineleme ile olası herhangi bir hesaplama yapabilme arasındaki denkliği belirtiyorum. Bu not edilmesi gereken önemli bir eşdeğerdir.
Shelby Moore III

"Sınırsız özyineleme her olası özyineleme biçimi anlamına gelir" Bu sizin okumanız. Çoğu SO kullanıcısı için, 'sınırsız özyineleme' anlamına gelir while (p) { /* ... */ }. "Genel özyineleme ile olası herhangi bir hesaplamayı yapabilme yeteneği arasındaki denkliği belirtiyorum." Kilisenin tezi çok farklı bir konudur ve gerçekten ayrıca tartışılmalıdır.

13

Tam Turing, en az bir Turing Makinesi kadar güçlü olduğu anlamına gelir . Bu, bir Turing Makinesi tarafından hesaplanabilecek her şeyin bir Turing Complete sistemi tarafından hesaplanabileceği anlamına gelir.

Hiç kimse bir Turing Makinesinden daha güçlü bir sistem bulamadı. Şimdilik, bir sistemin Turing Complete olduğunu söylemek, sistemin bilinen herhangi bir hesaplama sistemi kadar güçlü olduğunu söylemekle aynıdır (bkz. Church-Turing Tezi ).


3
Tüm bunların duvar süresini göz ardı ettiğini unutmayın. Sadece "yapılabilir" diyor.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen aslında, fiziksel hesaplanabilirliği tamamen göz ardı ediyor. Sadece evrenin yaşından daha uzun sürmekle kalmaz, aynı zamanda evrendeki tüm fermiyonlar ve bozonlarla inşa edilebileceğinden daha fazla bellek kullanabilir.
Waylon Flinn

Evrendeki bozonların ve fermiyonların miktarında bir sınır yoktur. Bilmiyoruz ve muhtemelen asla bilemeyeceğiz, boyutu. 'Evren'deki X sayısını her okuduğunuzda, insanlar aslında gözlemlenebilir evrenden bahsediyorlar . İlginç olsa da, gerçek bir fiziksel sınır değildir.
Stijn de Witt

9

En basit ifadeyle, Turing-complete sistemi olası herhangi bir hesaplama problemini çözebilir.

Temel gereksinimlerden biri, karalama alanı boyutunun sınırsız olması ve karalama alanına önceki yazma işlemlerine erişmek için geri sarmanın mümkün olmasıdır.

Böylece pratikte hiçbir sistem Turing-tamamlanmış değildir.

Daha ziyade bazı sistemler sınırsız belleği modelleyerek ve sistemin belleğine sığabilecek olası bir hesaplamayı gerçekleştirerek Turing-tamlığı yaklaşık olarak gösterir.


2

"Turing Complete" (Turing Complete) kavramının önemi, süreçlerinin daha basit ve basit olan "basit" talimatlara göre yapılandırılabilmesini sağlayacak bir bilgi işlem makinesini (mutlaka mekanik / elektriksel bir "bilgisayar") tanımlama yeteneğinde olduğunu düşünüyorum. Evrensel makinenin yorumlayabileceği ve çalıştırabileceği talimatlar.

Açıklamalı Turing'i tavsiye ederim

@Mark açıkladığınız şeyin Evrensel Turing Makinesi ile Turing Complete arasındaki bir karışım olduğunu düşünüyorum.

Turing Complete, pratik anlamda, Universal Machine (masaüstü bilgisayar) tarafından yürütülecek, program olarak yazılabilen ve temsil edilebilen bir makine / süreç / hesaplama olacaktır. Diğerleri tarafından belirtildiği gibi, zaman veya depolama için dikkate almasa da.


2

Basit kelimelerle anladıklarım:

Turing Complete: Hesaplama yapabilen bir programlama dili / programı Turing tamamlandı.

Örneğin :

  1. Eğer sadece kullanarak iki numaraları ekleyebilirsiniz HTML . (Ans ' Hayır ', ekleme yapmak için javascript kullanmanız gerekir.) Dolayısıyla HTML Turing Complete değil.

  2. Java, C ++, Python, Javascript, Ethereum için Solidity vb. Diller Tamamlanıyor. Çünkü bu dilleri kullanarak iki sayı eklemek gibi bir hesaplama yapabilirsiniz.

Bu yardımcı olur umarım.


0

Test edip dallayabiliyorsa tam ('if' var)


1
Böyle eski bir soru için, başkalarının zaten benzer veya daha somut katkılarda
bulunup bulunmadığını

Cevabın doğruluğundan emin değilim. Ama bu daha önce hiç görmediğim gerçekten basit bir açıklama. Komik şey: uzun zaman önce (ilk kod parçamı yazdıktan sonra) aynı açıklamayı mümkün olan en basit işlemciyi tanımlamak için de kullandım.
Victor Yarema

Keskin, özlü ve doğru bir operasyonel tanımlamayla mükemmel bir ilk denemedir. Ancak, branşman döngüye izin vermek zorundadır ve makinenin altyordam çağrılarına da izin vermesi gerekmez mi (yani: özyineleme)? Özyinelemeli her program için düzleştirilmiş bir iç içe döngüler programı var mı?
user3673

0

Turing Machine, herhangi bir programın durum testi yapabilmesini gerektirir. Bu temeldir.

Bir oyuncu piyano rulosu düşünün. Oyuncu piyano oldukça karmaşık bir müzik parçası çalabilir, ancak müzikte hiçbir zaman koşullu mantık yoktur. Turing Tamamlandı.

Koşullu mantık, Turing Complete olan bir makinenin hem gücü hem de tehlikesidir.

Piyano rulosunun her seferinde durması garanti edilir. TM için böyle bir garanti yoktur. Buna “durdurma sorunu” denir.


-1

As Waylon Flinn söyledi :

Tam Turing, en az bir Turing Makinesi kadar güçlü olduğu anlamına gelir.

Bunun yanlış olduğuna inanıyorum, Turing Makinesi kadar güçlü ise bir sistem Turing'i tamamlıyor, yani makine tarafından yapılan her hesaplama sistem tarafından yapılabilir, ancak sistem tarafından yapılan her hesaplama Turing makinesi tarafından yapılabilir .


1
Sanırım Church-Turing tezinin bu sonuca varmak için doğru olduğunu varsayıyorsunuz. Henüz kanıtlanmamıştır. Açıkladığınız mülke 'Turing Eşdeğeri' denir.
Waylon Flinn

1
@WaylonFlinn Hayır, haklı. "Bütünlük" her ikisinin de en az bir şey kadar güçlü olduğu, aynı zamanda daha güçlü olmadığı anlamına gelir. "NP-Complete" ile karşılaştırın.
Devin Jeanpierre

3
@DevinJeanpierre Burada bir alev savaşı başlatmak istemiyorum ama tanımladığınız hesaplama sınıfının "Turing Eşdeğeri" olarak adlandırıldığından neredeyse eminim. Turing Complete, NP-Complete ile benzer bir ilişkiye sahiptir. NP-Complete, yalnızca P = NP ise NP'ye eşittir. Aynı şekilde Turing Complete, sadece Church-Turing tezinin doğru olması durumunda Turing Eşdeğeri'ne eşittir.
Waylon Flinn

@Waylon Source? Hiçbir şey ki (örn hemfikir okumak en.wikipedia.org/wiki/Turing_completeness )
Devin jeanpierre

4
@DevinJeanpierre Bağlandığınız wikipedia makalesinde bunu söylüyor. Biçimsel tanımlar bölümünden alıntı: "Her Turing hesaplanabilir fonksiyonunu hesaplayabilen bir hesaplama sistemine Turing tamamlandı" denir, "Hesaplayabildiği her fonksiyon da hesaplanabilir Turing ise Turing tam sistemine Turing eşdeğeri denir"
Waylon Flinn

-2

Çoğu programcıya tanıdık gelen pratik dil terimlerinde, Turing tamlığını tespit etmenin genel yolu, dilin iç içe sınırsız ifadelerin simülasyonuna izin verip vermemesidir (ifadeler için Pascal stilinin aksine, sabit üst sınırları olan).


1
Bir Turing makinesini simüle etmek için tek bir sınırsız while döngüsü yeterlidir.
masterxilo

-8

İlişkisel bir veritabanı yer ve yolların enlem ve boylamlarını girebilir ve aralarındaki en kısa yolu hesaplayabilir - hayır. Bu, SQL'in Turing tamamlanmadığını gösteren bir sorundur.

Ancak C ++ bunu yapabilir ve herhangi bir sorun yapabilir. Böylece öyle.


10
Noktalar arasındaki en kısa yolu hesaplayabilmek, Turing complete'un tanımı değildir. Bunda sadece bir örnekten çok daha fazlası var.
Eva

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.