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?
Jawaban:
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:μ
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
0
_ + 1
x
_; _
for ( x to 0 ) do _ end
while ( x != 0 ) do _ end
sumber
while
loop di 6 dibandingkan dengan nol konstan, variabel hanya dapat ditambahkan dengan aturan 2 dan tidak ada konstanta negatif untuk memulai (aturan 1),while
loop di 6 tidak dimasukkan (x = 0) atau tidak terbatas ( x> 0, dan loop body tidak dapat menguranginya)._ - 1
dan saya tidak bisa memikirkan cara untuk mengimplementasikannya tanpafor
. Terima kasih telah menangkap itu! (Apa itu "lebih baik" - termasuk_ - 1
ataufor
? Hmm.)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.
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
goto
pernyataan atauwhile
loop (dan cara untuk menyimpan jumlah data yang sewenang-wenang). Namun bahasa dengan kebutuhan fungsi rekursif tidakwhile
jugagoto
harus Turing lengkap. Jadigoto
tidak akan berada di set operasi yang cukup yang diperlukan, tetapi ada bahasa yang tidak lagi lengkap Turing jika Anda menghapusgoto
. Dengan demikian tidak ada perangkat seperti itu.sumber
goto
tetapi ada yang tidak, sepertinya mengklaim bahwa karena beberapa menggunakannya dan beberapa tidakgoto
maka tidak dapat menjadi bagian dari serangkaian operasi yang diperlukan untuk kelengkapan Turing. Maksud saya adalah itugoto
hanyalah 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.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.
sumber
Ini bukan jawaban umum untuk pertanyaan Anda, tetapi oleh teorema pemrograman terstruktur , semua yang dibutuhkan adalah kemampuan untuk melakukan seleksi (misalnya,
if
dalam C / C ++) dan pengulangan (misalnya,while
dalam 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,
JNZ
dalam 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
if
danwhile
dalam C / C ++. Anda dapat mensimulasikanif
menggunakanwhile
sebagai berikut:Kode berikut selalu sama:
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.
sumber
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 ) = xS K (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)
sumber
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.
sumber