Tüm turing dilleri birbiriyle değiştirilebilir mi


26

Not, nasıl programlandığını bilmeme rağmen, CS teorisinde oldukça yeni bir başlangıç ​​yapıyorum.

Bu cevaba göre

Bütünlüğü tamamlamak, soyut bir hesaplanabilirlik kavramıdır. Eğer bir dil Turing tamamlandıysa, diğer bir Turing tamamlayıcı dilin yapabileceği herhangi bir hesaplama yapabilir.

Ve herhangi Turing tam bir dilde yazılmış herhangi bir program diğerinde tekrar yazılabilir .

Tamam. Bu mantıklı. C'yi Meclis'e çevirebilirim (ve her gün yaparım!) Ve Meclisi C'ye çevirebilirim (C'de sanal bir makine yazabilirsin). Aynı şey diğer diller için de geçerlidir - herhangi bir dili Assembly'de derleyebilir ve sonra başka bir dilde yazılmış bir VM'de çalıştırabilirsiniz.

Ancak Turing'in eksiksiz bir dilinde yazılmış herhangi bir program başka bir dilde tekrar yazılabilir mi?

Meclisimin bir LIGHTBUTTON opcode'u varsa? Fiziksel olarak o dili, ampul olmadan bir sistemde (dilde) taklit edemiyorum.

Tamam. Yani bilgisayar teorisi ile uğraştığımızdan , fiziksel cihaz sınırlamalarını tartışmadığımızı söyleyeceksiniz .

Peki ya çarpımı olmayan bir cihaza? bölünme? Bildiğim kadarıyla en iyisi (bu matematik için daha fazla soru olsa da), kişi toplama ve çıkarma ile çarpımları (ve kesinlikle bölmeme) taklit edemez [1].

Peki bir "turing complete language" (ekleyebilen, çıkarabilen ve zıplayabilen), ekleyebilen, çıkarabilen, çarparak ve zıplayabilen başka bir dili nasıl taklit edersiniz?

DÜZENLE

[1]. Keyfi gerçek sayılar üzerinde.


33
Gerçek sayılar, Hiper-Turing-Hesaplama alemine aittir. Bir Turing Makinesi gerçek sayılarla baş edemez, ergo, Turing'in bütünlüğü ile alakasızlar.
Jörg W Mittag

3
İlgili: sadece bir talimat içeren bir montaj dili talimatı seti, evrensel bir bilgisayar oluşturmak için hala yeterince güçlü: en.wikipedia.org/wiki/One_instruction_set_computer . Örneğin, bellek işlenenlerle "Sıfırdan küçük veya sıfıra eşitse, dalı çıkarın". Modern bir x86'ya kıyasla yavaş olacak , ancak performans oranı herhangi bir program için sınırlı.
Peter Cordes

1
Hiçbir fiziksel (aslında mevcut olan) makine Turing tamamlandı veya olamaz, çünkü Turing bütünlüğü sonsuz depolama gerektirir ve evren sonsuz değildir. Bundan iki soyut makinenin eşdeğer olup olmadığına dair olumlu cevabın, bu makinelerin iki fiziksel yaklaşımının eşdeğer olup olmadığı sorusunu cevaplamanıza yardımcı olmadığı sonucuna varmıştır.
Ben

2
@PeterCordes: Oranın sonlu olduğunu söylerken, sadece sonlu bir zamanda tamamlanan herhangi bir görevin her ikisinde de sonlu bir zamanda yapacağı anlamına gelir - herhangi bir özel makine için (giriş dahil değil) Bazı girdiler için oranın ne kadar yüksek olabileceğine dair sonlu sınırlar. Birinin, oranı rasgele yüksek yapacak girişleri seçebileceği Turing-complete makineleri üretebileceğini düşünüyorum - muhtemelen giriş boyutunun hesaplanabilir bir fonksiyonu bile değil.
supercat,

6
"Bir çarpma ile çarpma işlemine (ve kesinlikle bölme yapmama)" fikrini nereden aldığını bilmiyorum.
Çarpmayı

Yanıtlar:


55

Turing-eksiksizlik, bir şey ve sadece bir şey söyler: bir hesaplama modeli, bir Turing Makinesi tarafından modellenebilecek herhangi bir hesaplama da bu model tarafından modellenebilirse, Turing tamamlanır.

Peki, bir Turing Makinesinin modelleyebileceği hesaplamalar nelerdir? Öncelikle ve en önemlisi, Alan Turing ve tüm meslektaşları sadece doğal sayılardaki işlevlerle ilgilendiler. Bu nedenle, Turing Makinesi (ve λ-hesabı, SK-birleştiricisi hesabı, urs-özyinelemeli fonksiyonlar…) sadece doğal sayılardaki fonksiyonların hesaplanabilirliğinden bahseder. Eğer doğal sayılar üzerindeki bir fonksiyondan bahsetmiyorsanız, Turing-tamlık kavramı mantıklı bile değil, sadece uygulanabilir değil.

Bununla birlikte, birçok ilginç şeyi doğal sayılar olarak kodlayabileceğimizi unutmayın. Dizeleri doğal sayılar olarak kodlayabiliriz, grafikleri doğal sayılar olarak kodlayabiliriz, booleanları doğal sayılar olarak kodlayabiliriz. Turing Makinalarını doğal sayılar olarak kodlayabiliriz , bu da Turing Makinaları hakkında konuşan Turing Makinaları oluşturmamızı sağlar!

Ve tabii ki, doğal sayılardaki tüm işlevler hesaplanabilir değildir. Bir Turing Makinesi yalnızca doğal sayılardaki bazı işlevleri hesaplayabilir , λ-hesabı yalnızca doğal sayılardaki bazı işlevleri hesaplayabilir , SK birleştirici hesaplaması yalnızca doğal sayılardaki bazı işlevleri hesaplayabilir ,…. Şaşırtıcı bir şekilde (ya da değil), her hesaplama modelinin (aslında fiziksel evrenimizde gerçekleşebilir olan) doğal sayılarla (en azından şu ana kadar bulduğumuz tüm modeller için ) aynı işlevleri hesaplayabildiği ortaya çıktı. [Not: Açıkçası, daha zayıf hesaplama modelleri var , ancak henüz daha güçlü olan birini bulamadıkGerçek fiziksel sayıları veya zaman yolculuğunu kullanan modeller gibi fiziksel evrenimizle kesinlikle uyumsuz olanları hariç.]

Bu gerçek, çok sayıda farklı model aramanın uzun bir süresinin ardından, her seferinde tam olarak aynı işlevleri hesaplayabildiklerini görüyoruz (ki bu kabaca) tüm bunları söyleyen Kilise-Turing Tezi'nin temeli. hesaplama modelleri eşit derecede güçlüdür ve hepsinin "hesaplanabilir" olmanın ne anlama geldiğinin "ideal" kavramını yakalaması. (CTT'nin ikinci, daha felsefi bir yönü de vardır, yani bir algoritmayı takip eden bir insan aynı zamanda bir TM'nin hesaplayabileceği ve artık yapamayacağı aynı fonksiyonları hesaplayabilir.)

Ancak , bunların hiçbiri hakkında bir şey söylemiyor

  • çeşitli modellerin ne kadar verimli olduğu
  • nasıl rahat onlar kullanımına vardır
  • Doğal sayılar üzerinde hesaplama fonksiyonlarının yanı sıra başka neler yapabilirler?

Ve bu tam olarak farklı hesaplama modelleri (ve programlama dilleri) arasındaki farkların ortaya çıktığı yerdir.

O(sizearray)O(sizearray2)sizearraysizearray

Farklı kolaylıklara bir örnek olarak, çok yüksek düzeyde bir dilde yazılmış kodu, montajda yazılmış kodu ve aynı sorunu çözmek için bir TM'nin tanımını karşılaştırabilirsiniz.

Işık anahtarınız, üçüncü tür farklara bir örnektir, bazı modellerin doğal sayılar üzerinde çalışmayan ve bu nedenle Turing-bütünlüğü ile ilgisi olmayan şeyler yapabileceği şeyler.

Özel sorularınızı cevaplamak için:

Ancak Turing'in eksiksiz bir dilinde yazılmış herhangi bir program başka bir dilde tekrar yazılabilir mi?

Hayır. Yalnızca program doğal sayılar üzerinde bir Turing-hesaplanabilir işlevi hesaplarsa. Ve o zaman bile, karmaşık bir kodlamaya ihtiyaç duyabilir. Örneğin, λ-calculus bile doğal sayılara sahip değildir, fonksiyonlar kullanılarak kodlanmaları gerekir (çünkü λ-calculus'un sahip olduğu tek şey fonksiyonlardır).

Girdi ve çıkışın bu kodlaması algoritmayı ifade edebildiği gibi çok karmaşık olabilir. Herhangi bir program olduğu doğrudur süre Yani, olabilir yeniden yazılması, yeniden yazılmış bir program çok daha fazla bellek kullanabilir ve çok daha yavaş olması, çok daha karmaşık, çok daha büyük olabilir.

Meclisimin bir LIGHTBUTTON opcode'u varsa? Fiziksel olarak o dili, ampul olmadan bir sistemde (dilde) taklit edemiyorum.

Bir ampul, doğal sayılar üzerinde Turing-hesaplanabilir bir fonksiyon değildir. Gerçekten, bir ampul ne bir işlevdir ne de bir hesaplamadır. Bir ampulü açıp kapatmak, bir G / Ç yan etkisidir. Turing Makineleri G / Ç yan etkilerini modellemez ve Turing-tamamlama kendileri ile ilgili değildir.

Keyfi gerçek sayılar üzerinde.

Turing-eksiksizlik sadece doğal sayılardaki hesaplanabilir fonksiyonlarla ilgilenir, gerçek sayılarla ilgilenmez.

İki nedenden ötürü sizin gibi sorulara gelince, Turing-eksiksizliği çok da ilginç değildir:

  1. Çok yüksek bir engel değil. Eğer ihtiyacımız olan tüm IF, GOTO, WHILEve tek bir tamsayı değişken (değişken varsayarak keyfi büyük tamsayılar tutabilir). Veya, özyineleme. Çok, çok ve çok şey Turing tamamlandı. Kart oyunu Magic: The Gathering tamamlandı. CSS3 Turing tamamlandı. sendmailYapılandırma dosyası Turing-tamamlandı. Intel x86 MMU Turing tamamlandı. Intel x86 MOVtalimatı Turing tamamlandı. PowerPoint animasyonları Turing tamamlandı. Excel (komut dosyası olmadan, yalnızca formülleri kullanarak) Turing tamamlandı. BGP yönlendirme protokolü Turing tamamlandı. sedTuring tamamlandı. Apache mod_rewritekuralları Turing tamamlandı. Google için " (yanlışlıkla VEYA şaşırtıcı şekilde) turing tamamlandı"Başka ilginç örnekler bulmak için. Neredeyse her şey Turing tamamlandıysa, Turing tamamlandı olmak ilginç bir özellik olmayı durdurur.
  2. Yararlı olmak aslında gerekli değildir. Pek çok faydalı şey Turing-tamamlandı değil . Sürüm 3 önce CSS tam Turing-(ve CSS3 gerçeği değil ise aslında herkes tarafından kullanılabilir değildir). 1999'dan önce SQL Turing-tam değildi, henüz, o zaman bile çok yararlı oldu. Ek kütüphaneler olmadan C programlama dili Turing-tamamlanmış gibi görünmüyor . Bağımlı olarak yazılan diller, tanım gereği az ya da çokdır, Turing-complete değildir, ancak onlara işletim sistemleri, web sunucuları ve oyunlar yazabilirsiniz.

İdris'in yazarı Edwin Brady, bu yönlerden bazıları hakkında konuşmak için "Tetris-complete" terimini kullanıyor. Tetris-tam olmak titizlikle tanımlanmamıştır (açıkça "Tetris'i uygulamak için kullanılabilir" dışında), ama delirmeden bir oyun yazabileceğiniz, yeterince yüksek seviyeli ve yeterince etkileyici olmak gibi şeyleri kapsar. dış dünya ile etkileşime girme (girdi ve çıktı), yan etkileri ifade edebilme, bir olay döngüsü yazabilme, reaktif, asenkron ve eşzamanlı programlama ifade edebilme, işletim sistemiyle etkileşime girebilme, yabancı kütüphanelerle etkileşime geçmek (diğer bir deyişle: C kodu ile arayarak ve aranarak). Bunlar genel amaçlı bir programlama dilinin Turing-eksiksizliğinden çok daha ilginç özellikleridir.


Farklı bir soruyu cevaplasa da ilginç noktalara değinen bu soruya cevabımı bulabilirsiniz .


7
Bu cevabı gerçekten beğendim, ancak her türlü ilginç şeyi doğal sayılarla temsil edebileceğimizi belirtmeye değer olduğunu düşünüyorum. Örneğin, dizeleri doğal sayılarla temsil edebiliriz, grafikleri doğal sayılarla temsil edebiliriz, bir bilgisayarın belleğinin bütün halini doğal bir sayıyla temsil edebiliriz. Gerçek sayılar, doğal sayılar üzerindeki fonksiyonlar olarak kodlanabilir ve (birçok) doğal sayılar üzerindeki fonksiyonlar, doğal sayılarla kodlanabilir. Bu nedenle, fonksiyonların doğal sayılardan doğal sayılarla sınırlandırılması büyük bir sınırlama değildir - karanlık olmadıkça ve bilgisayarınızın ışığı açmasını istemezseniz.
Theodore Norvell

3
Güzel cevap, ama bu: "Turing-complete olmak ilginç bir özellik olmayı bırakıyor" sadece yanlış. Eğer bir şey Turing tamamlandıysa, durma problemi, Turing makineleri için durma probleminde hesaplanabilir bir azalma ile Turing tamamlandı. Örneğin, Magic: The Gathering kart oyunu Turing tamamlandı. Bu, kurallarının belirlenemeyeceği anlamına gelir , yani genel durumda, çok ilginç bir özellik olan aşağıdaki oyun durumunun ne olacağını hesaplamak mümkün değildir. Daha ciddi olarak, sorunların tespit edilemez olduğunu kanıtlamak için Turing-eksiksizliğini ve azaltmalarını kullanıyoruz.
quicksort

Turing ve meslektaşları doğal sayılarla ilgileniyorlardı, ancak Turing makineleri sayılarla gerçekten ilgilenmiyor, sembol dizeleriyle uğraşıyorlar. Açıkçası, bilinen sonlu bir alfabedeki sonlu sembol dizgilerini doğal sayılar olarak önemsiz şekilde yorumlayabilirsiniz, ancak TM'ler girişleriyle doğrudan "sayısız" şeyleri yapmazlar, sadece "basamakları" manipüle ederler. Aslında, TM'lerin standart tanımlarından "doğal sayılar üzerinde fonksiyonlara" geçmek için biraz mantık gerekiyor; TM'lerle çalışırken, doğal sayıları sayı olarak değil, sayı olarak kodlarsınız.
Ben

Bu açıkçası harika bir cevap ama OP'nin anlamasının ötesine geçtiğinden korkuyorum. OP, gerçek sayıların (sonlu altkümelerinin) çarpımını uygulama konusunda kafasını karıştırdı. Buna bakıldığında, cevabınız Turing-complete programlama dillerinin aslında saf hesaplama amacıyla değiştirilemez olduğu, gerçekte oldukları zaman (çünkü modern CPU'ların yaptığı her şey - sadece bazı şeyler değil - doğal olarak kodlanabileceğini) ima ediyor gibi görünüyor. sayılar).
Konrad Rudolph

9
@TheodoreNorvell Gerçek sayıların doğal sayılarla kodlanması konusunda. Aslında, neredeyse tüm gerçek sayılar doğal sayılarla kodlanamaz. Doğal sayılarla kodlanabilen gerçek sayılar kümesi, doğal sayılarla kodlanması sayesinde en fazla sınırsızdır. Ve sadece sayılabilir bir şekilde sonsuz olduğu için, küme sıfır ölçüye sahiptir. Genel olarak gerçek sayıları doğal sayılarla temsil edebileceğimizi söylemek biraz yanıltıcıdır, çünkü bunların yalnızca küçük bir kısmını temsil edebiliriz veya daha kesin olmak gerekirse: 0%.
Shufflepants

9

Tabi ki toplama ve çıkarma işlemiyle çarpımı uygulayabilirsiniz:

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

Muhtemelen bunu yapmamanız gerçeği, onu daha az mümkün kılmaz.

Bölünme neredeyse hiç zor değil:

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

Ve çarpma ve bölmenin aslında CPU devresi tarafından yapıldığını nasıl düşünüyorsunuz? İpucu: çok büyük bir arama tablosu değil. Uç kaydırma da kullanıldığından, yukarıdakinden daha verimlidir, ancak toplama ve çıkarma açısından temel olarak uygulanır.


4
2precbensbenOn

7
@ touring: Biliyorsunuz, kayan nokta aritmetiği kayan nokta işlemcilerinden önce mevcuttu.
rici

6

Hiçbir fiziksel (aslında mevcut olan) makine Turing tamamlandı veya olamaz, çünkü Turing bütünlüğü sonsuz depolama gerektirir ve evren sonsuz değildir.

Bundan, iki soyut makinenin eşdeğer olup olmadığına ilişkin olumlu cevabın, bu makinelerin iki fiziksel yaklaşımının eşdeğer olup olmadığı sorusunu cevaplamanıza yardımcı olmadığı sonucuna varmıştır.

Bu nedenle, iki dilin soyut modellerinin Turing denkliği, her birinin diğerinin pratikte hesaplayabileceği her şeyi hesaplayabileceği anlamına gelmez. Biri diğerinden önce fiziksel sınırlamalara karşı koşabilir.


Ancak soru dilleri sordu. Belirli makinelere değiniyor, ancak yalnızca gerçek makinelerde gerçek sayılarda çalışmadığını hemen hemen anlamadığı için.
Shufflepants

3

nm=n+n(m-1)m/n=1+(m-n)/n

Nitekim, "ekleme 1", "çıkarma 1" ve "belirlenmiş bir kayıt sıfırsa koşullu atlama" işlemleri, hesaplamalı bir model Turing-complete yapmak için yeterlidir (bkz. çok az Turing-tamamlandı hesaplama modeli).

22n=n+n2mx2n=2mxnmx(2n+1)=m+2mxn


3

tl; dr - Turing makineleri genel bir mantıksal sistemin çalışması için sadece temel bir mantıksal tanımdır. Uzmanlık kodları çağırmak ve inşa edilmiş matematiksel işlemler de dahil olmak üzere, tarif edebileceğimiz çoğu şeyi yapabilirler.


Meclisimin bir LIGHTBUTTON opcode'u varsa? Fiziksel olarak o dili, ampul olmadan bir sistemde (dilde) taklit edemiyorum.

Bir Turing modelinde, bir LIGHTBUTTONopcode gibi semboller sadece Turing bilgisayarının kullandığı alfabedeki dizelerdir.

Bu nedenle, Turing makinesi dizgenin "LIGHTBUTTON"veya bu opcode'a karşılık gelen bir tamsayı değerinin üretilmesinden sorumlu olacaktır ; Bir dış varlığın buna göre hareket edip etmediği, Turing bilgisayarının işi değildir.

C programları aynı sınırlamaya sahiptir. Bu, bir C programının sadece op kodunu çağırabilir LIGHTBUTTON, ancak CPU'nun gerçekten o opcode ile ilişkili bir işlem yapıp yapmamasının CPU'ya bağlı olup olmadığıdır.


Peki ya çarpımı olmayan bir cihaza? bölünme? Bildiğim kadarıyla (bu matematik için daha fazla bir soru olsa da), bir kişi [rastgele gerçek sayılar] üzerine toplama ve çıkarma ile çarpma işlemine (ve kesinlikle bölme yapmama) benzemez.

Bir Turing makinesi olan Yup, gerçek anlamda bile insan tanımlanabilir herhangi bir mantığın yapabildiği ölçüde bunları yapabilir. Turing makinesi, bir Kural 110 hücresel otomasyonu kadar basit olabilir .

İşin püf noktası, makinenin doğal olarak sahip olduğu fizikten bir mantık sistemi oluşturmaktır. Örneğin, mainstream CPU'lar aritmetik mantık birimlerine (ALU'lar) sahip oldukları için çarpma ve bölme yapabilirler . Fakat ALU’lar sihir değil; Onlar sadece basit mantık kapılarıdır . Ve bu mantık geçitleri transistörlerden yapılmıştır . Ve bu transistörler katkılı kumdan yapılmıştır .

Yani, Turing-komple bir cihazın matematik yapmasını sağlamak için, sadece bu şekilde programlamalısınız.

π-π=0πππ-π=0


3

Ancak Turing'in eksiksiz bir dilinde yazılmış herhangi bir program başka bir dilde tekrar yazılabilir mi?

Programın girişi keyfi olarak uzun bir bit dizisi ise ve çıktı aynı zamanda keyfi olarak uzun bir bit dizisiyse, YES. Yeniden yazmak için zamana ve enerjiye sahip olduğunuzu, performansı önemsemediğinizi ve her iki uygulama için de yeterli fiziksel belleğiniz olduğunu varsayalım.

İki Turing-complete dili anlamına gelen pratik düşünceler birbirinin yerine geçemez.

  • farklı tür giriş ve çıkışları destekler (örneğin, SQL veritabanı erişimi)

  • farklı veri türleri kitaplıklarına sahiptirler (örneğin Unicode dizeleri için destek)

  • farklı görevler için optimize edilmiş farklı programlama paradigmaları sağlarlar (örneğin nesneler, iplikler, koroinler, birinci sınıf fonksiyonlar)

  • farklı işlev kütüphaneleri sağlarlar (örneğin XML ayrıştırma ve serileştirme)


1

Hayır. Turing-bütünlüğünün programlarla ilgisi yok , matematiksel fonksiyonlarla (veya algoritmalarla ) ilgili. Herhangi bir algoritma - herhangi bir hesaplama - C ile yapabilirsiniz, herhangi bir Turing-tamamlayıcı dilde yapabilirsiniz (bu açık olmalıdır). Fakat Turing-eksiksizliği aslında G / Ç yapabileceğinizi söylemez - hiç. Donanım hakkında hiç bir şey konuşmuyor. Sadece hesaplamalar.

Turing-complete dilini istediğiniz herhangi bir donanım işlemi ile genişletebilirsiniz (teknik olarak, bu nasıl fputcve fgetcC cinsinden çalışır). İki Turing-tam dilleri alıp onları uzatmak durumunda özdeş donanıma özgü operasyonlar, daha sonra değiştirilebilir kalır. Bu nedenle, LIGHTBULBçalışmayı sağlayan meclis diliniz Turing-complete'dan daha güçlü ; Turing tamamlandıLIGHTBULB diyebilirsin . Başka herhangi bir dili kendisiyle aynı yapmak için, aynı zamanda Turing-complete LIGHTBULB; Bunu yapmanın en kolay yolu, ona LIGHTBULBilkel / talimat / işlev / vb. eklemektir .

Bu nedenle, C uygulamaları genellikle ya satır içi montajcıyı destekler ya da montajcıda yazılı fonksiyonları çağırmanın bir yolunu gösterir ve diğer dillerin uygulamalarında genellikle C dilinde yazılmış fonksiyonları çağırmanın bir yolunu sağlar.

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.