Apakah ada kriteria minimum untuk bahasa pemrograman Turing yang lengkap?


55

Apakah ada set konstruksi bahasa pemrograman dalam bahasa pemrograman agar Turing Lengkap?

Dari apa yang saya dapat katakan dari wikipedia , bahasa perlu mendukung rekursi, atau, tampaknya, harus dapat berjalan tanpa berhenti. Apakah ini semua yang ada untuk itu?


6
Mungkin pertanyaan Anda harus bertanya, "Apakah ada set minimal konstruk pemrograman ...?", Karena seperti yang diungkapkan, jawabannya adalah "Semua yang dapat dihitung."
Dave Clarke


@DaveClarke, terima kasih, saya telah memperbarui itu. Saya menemukan bahwa komentar Anda agaknya menimbulkan pertanyaan, meskipun saya menganggap itu karena bahasa saya buruk. Saya bermaksud bertanya apakah ada beberapa operasi yang jika suatu bahasa dapat dihitung, itu akan menjadi setara.
Khanzor

Jawaban:


45

Saya selalu meskipun fungsi -recursive dipaku itu. Inilah yang mendefinisikan seluruh rangkaian fungsi yang dapat dihitung; itu adalah sekumpulan fungsi terkecil yang berisi resp. ditutup terhadap:μ

  1. Konstan Fungsi0
  2. Fungsi penerus
  3. Memilih parameter
  4. Komposisi fungsi
  5. Rekursi Primitif
  6. The -operator (mencari terkecil seperti itu ...)xμx

Periksa tautan di atas untuk detailnya; Anda melihat bahwa itu membuat bahasa pemrograman yang sangat kompak. Ini juga mengerikan untuk diprogram - tidak ada makan siang gratis. Jika Anda menjatuhkan salah satu dari itu, Anda akan kehilangan kekuatan penuh, jadi itu adalah set aksioma minimal.

Anda dapat menerjemahkannya secara harfiah ke dalam elemen sintaksis dasar untuk program WHILE , yaitu

  1. Konstan 0
  2. Penambahan _ + 1
  3. Akses variabel x
  4. Rangkaian program / pernyataan _; _
  5. Loop hitung mundur for ( x to 0 ) do _ end
  6. Sementara loop while ( x != 0 ) do _ end

1
Saya pikir sudah jelas bahwa Anda tidak dapat menghapus aturan ke-5 dalam bahasa tersebut. Karena whileloop di 6 dibandingkan dengan nol konstan, variabel hanya dapat ditambahkan dengan aturan 2 dan tidak ada konstanta negatif untuk memulai (aturan 1), whileloop di 6 tidak dimasukkan (x = 0) atau tidak terbatas ( x> 0, dan loop body tidak dapat menguranginya).
MSalters

1
@Malters Saya pikir Anda benar; untuk simulasi saya tampaknya ada dalam pikiran, kita perlu _ - 1dan saya tidak bisa memikirkan cara untuk mengimplementasikannya tanpa for. Terima kasih telah menangkap itu! (Apa itu "lebih baik" - termasuk _ - 1atau for? Hmm.)
Raphael

20

Apakah ada seperangkat perhitungan yang perlu dilakukan dalam bahasa pemrograman agar Turing Lengkap?

Ya, agar dapat dianggap Turing lengkap, bahasa pemrograman harus dapat melakukan perhitungan apa pun yang dapat dilakukan oleh mesin Turing. Jadi sebagai persyaratan minimum yang mungkin dikatakan, Anda harus dapat menerapkan mesin Turing universal - atau penerjemah untuk bahasa lengkap Turing lainnya - di dalamnya.

Dari apa yang saya dapat katakan dari wikipedia, bahasa perlu mendukung rekursi, atau, tampaknya, harus dapat berjalan tanpa berhenti. Apakah ini semua yang ada untuk itu?

Tidak. Misalnya bahasa di mana satu-satunya operasi yang diizinkan adalah rekursi (yaitu satu-satunya fungsi yang dapat Anda tulis adalah f(x) = f(x), bukan Turing yang lengkap karena yang dapat Anda tulis di dalamnya adalah program yang tidak pernah berakhir. Seperti yang saya katakan sebelumnya, bahasa lengkap Turing harus dapat mengimplementasikan perhitungan apa pun yang dapat dilakukan oleh mesin Turing. Jadi jelas itu tidak cukup.

Juga bahasa tidak harus mendukung rekursi dengan cara yang Anda pikirkan. Hanya cara mengekspresikan loop yang tidak dibatasi. Itu mungkin rekursi, tetapi bisa juga berupa loop sementara atau goto. Bahasa yang tidak memiliki fungsi sama sekali masih bisa menjadi Turing lengkap. Dan lagi loop atau fungsi rekursif bukanlah kondisi yang memadai. Anda masih memerlukan cara untuk mengeksekusi kode yang berbeda tergantung pada kondisi dan cara untuk menghitung nilai baru dari yang lama (jika tidak semua loop / rekursi akan menjadi tak terbatas atau tidak berjalan sama sekali).


Adapun apakah ada set minimal operasi yang diperlukan dan cukup, sehingga bahasa apa pun yang mendukung operasi ini Turing lengkap dan bahasa apa pun yang tidak ada: Tidak, tidak ada (kecuali jika Anda mendefinisikan "operasi" dengan samar-samar , sehingga menjadi tidak berarti):

Misalnya seperti yang sudah saya katakan, ada bahasa lengkap Turing yang tidak mendukung fungsi rekursif (atau fungsi apa pun). Itu masih bisa menjadi Turing lengkap jika mereka memiliki gotopernyataan atau whileloop (dan cara untuk menyimpan jumlah data yang sewenang-wenang). Namun bahasa dengan kebutuhan fungsi rekursif tidak whilejuga gotoharus Turing lengkap. Jadi gototidak akan berada di set operasi yang cukup yang diperlukan, tetapi ada bahasa yang tidak lagi lengkap Turing jika Anda menghapus goto. Dengan demikian tidak ada perangkat seperti itu.


Satu-satunya bagian yang saya tidak yakin adalah jawaban Anda untuk set minimal operasi yang diperlukan. Anda tampaknya membatasi definisi operasi Anda ke Struktur Kontrol yang tampaknya jauh lebih sempit daripada yang diminta, dan melampaui persyaratan Anda sendiri untuk tidak mendefinisikannya "dengan sangat samar, sehingga [mereka] menjadi tidak berarti".
Joshua Drake

@ JoshuaDrake Saya tidak yakin apa yang Anda maksud. Saya tidak membatasi operasi untuk mengontrol struktur. Hanya saja saya tidak berbicara tentang operasi apa pun yang tidak mengontrol struktur dalam contoh counter saya karena mereka tidak relevan dengan contoh tersebut. Sebenarnya saya menyebutkan "cara untuk menyimpan jumlah data yang sewenang-wenang" - itu bukan struktur kontrol.
sepp2k

Anda menyatakan bahwa beberapa bahasa mendukung Turing Completeness dengan gototetapi ada yang tidak, sepertinya mengklaim bahwa karena beberapa menggunakannya dan beberapa tidak gotomaka tidak dapat menjadi bagian dari serangkaian operasi yang diperlukan untuk kelengkapan Turing. Maksud saya adalah itu gotohanyalah cara sintaksis untuk mengimplementasikan operasi yang lebih umum, seperti melompat. Oleh karena itu saya percaya bahwa jika Anda hanya mengambil abstrak dari struktur kontrol tertentu Anda akan bergerak lebih dekat ke serangkaian operasi yang setidaknya akan mengarah ke Turing Completeness.
Joshua Drake

@ JoshuaDrake Saya tidak berpikir menggunakan "lompatan" alih-alih membawa kita ke titik di mana kita dapat mendefinisikan satu set operasi yang cukup dan perlu. Mungkin benar bahwa setiap bahasa akan memerlukan semacam operasi lompatan (dan jika itu hanya panggilan fungsi), tetapi saya tidak berpikir Anda akan dapat membuat operasi lebih lanjut untuk membuatnya cukup. Misalnya kalkulus lambda memiliki dua operasi: aplikasi (yaitu operasi lompatan kami) dan abstraksi (yaitu menciptakan fungsi) ...
sepp2k

1
@ JoshuaDrake Saya tidak berpikir artikel ini mencoba untuk mengklaim bahwa bahasa Turing-lengkap perlu memiliki operasi tersebut. Terutama karena secara khusus membatasi pernyataan itu ke bahasa prosedural. Kecuali untuk bentuk goto (yaitu aplikasi fungsi) Lambda Calculus tidak memiliki hal-hal itu. Saya pikir "minimum" di sini hanya berarti bahwa dalam bahasa yang hanya memiliki fitur-fitur itu, Anda tidak dapat menghapus salah satu dari mereka tanpa kehilangan kelengkapan Turing. Bukan berarti tidak ada set minimal operasi lain yang juga cukup untuk kelengkapan Turing.
sepp2k

14

Ada berbagai instruksi tunggal yang mengarah ke Turing bahasa lengkap. Contoh khas adalah "kurangi dan cabang jika nol". Ini dikenal dalam konteks pemrograman bahasa assembly. Lihat artikel Wikipedia untuk detailnya.

Ini mengarah ke karakterisasi: sebuah bahasa Turing lengkap jika dan hanya jika mampu mensimulasikan operasi mengambil dan menyimpan bilangan bulat dalam memori dan melakukan operasi "kurangi dan cabang jika nol" pada mereka.


13

Ini bukan jawaban umum untuk pertanyaan Anda, tetapi oleh teorema pemrograman terstruktur , semua yang dibutuhkan adalah kemampuan untuk melakukan seleksi (misalnya, ifdalam C / C ++) dan pengulangan (misalnya, whiledalam C / C ++). Sunting: seperti yang ditunjukkan oleh Dave Clarke dalam komentar, teorema pemrograman terstruktur juga membutuhkan urutan. Saya awalnya tidak mencantumkan ini karena saya menerima begitu saja pembaca akan mengerti bahwa blok dasar dari instruksi lain, seperti yang disinggung kemudian untuk membaca dari dan menulis ke toko memori, dll, juga diperlukan). Tentu saja, lebih baik eksplisit; Anda harus dapat melakukan hal-hal ini juga.

Karena keduanya dapat diimplementasikan menggunakan instruksi lompat kondisional (misalnya, JNZdalam x86), itu juga cukup untuk kesetaraan Turing.

Perhatikan bahwa hal-hal lain diperlukan, yaitu, kemampuan untuk menulis sejumlah simbol tanpa batas (misalnya, bit ... 0 atau 1) ke semacam penyimpanan memori eksternal. Dalam hal itu, komputer nyata tidak setara dengan Turing, karena tidak ada satu pun dari mereka yang memiliki jumlah penyimpanan tak terbatas. Model Turing masih berguna, karena jumlah memori biasanya besar, dan meskipun masalah apa pun yang dapat diselesaikan oleh komputer nyata dapat diselesaikan dengan otomat terbatas deterministik, menggunakan model perhitungan itu tidak terlalu berguna (karena jumlah negara akan sangat besar).

Perhatikan bahwa ini tidak selalu bertentangan dengan jawaban sepp2k; ini semacam cara yang berbeda untuk memikirkan pertanyaan yang sama.

SUNTING:

Perhatikan juga bahwa Anda tidak benar-benar membutuhkan keduanya ifdan whiledalam C / C ++. Anda dapat mensimulasikan ifmenggunakan whilesebagai berikut:

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

Kode berikut selalu sama:

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

Ya ... konstruksi harusnya berfungsi dan mungkin jika Anda berhati-hati. Perhatikan juga bahwa jika Anda memiliki fungsi rekursif, pada akhirnya Anda juga harus memilih; karena fungsi rekursif tanpa seleksi tidak dapat benar-benar menerapkan kasus dasar, sehingga fungsi rekursif apa pun akan menghasilkan rekursi yang tak terbatas.

SUNTING:

Juga, mengenai pertanyaan Anda, apakah kemampuan untuk menulis program yang tidak berhenti cukup untuk Turing kesetaraan, jawabannya adalah tidak; itu perlu, tetapi tidak cukup. Kita dapat memecahkan masalah penghentian untuk program yang ditulis dalam bahasa yang tidak dapat mengekspresikan program yang gagal dihentikan; jawabannya adalah "program tidak berhenti" untuk semua contoh. Namun, kita dapat mendefinisikan bahasa di mana satu-satunya instruksi menyebabkan mesin memasuki loop tak terbatas ... bahasa seperti itu tidak setara dengan Turing.


13

Combinators dan mana, dan cukup untuk menyatakan istilah lambda (tertutup) apa pun, oleh karena itu setiap fungsi yang dapat dihitung. Lihat halaman wikipedia ini untuk detailnya.K ( S x y z ) = ( x z ( y z ) ) ( K x y ) = xSK(S x y z)=(x z (y z))(K x y)=x

Sebenarnya, istilah lambda adalah dasar yang cukup untuk mengekspresikan semua istilah lambda. Lihat nanti di halaman wikipedia yang sama .X=λx.((x S) K)


5

Konstruk bahasa dapat dipertukarkan

Tidak ada kriteria minimum yang ditetapkan tentang apa konstruksi harus native disediakan oleh bahasa pemrograman. Jika itu memberikan beberapa konstruksi aneh yang entah bagaimana dapat berbelit-belit untuk mengekspresikan sistem Turing-lengkap, maka tampaknya konstruksi itu "sama cocok" dengan yang lain.

Untuk membuktikan ini - bahasa yang hanya menyediakan operasi "kurangi dan cabang jika nol" Turing selesai; ada Turing bahasa lengkap yang tidak menyediakan konstruk "subtract dan branch if zero" yang terpisah, tidak ada konstruk atau seperangkat konstruk yang wajib.

Efek dari konstruksi bahasa TP-lengkap dapat ditiru oleh konstruksi dari bahasa TP-lengkap lainnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.