Algoritma untuk memecahkan "masalah terputus-" Turing

23

"Alan Turing membuktikan pada tahun 1936 bahwa algoritma umum untuk memecahkan masalah penghentian untuk semua pasangan input-program yang mungkin tidak ada"

Dapatkah saya menemukan algoritma umum untuk menyelesaikan masalah penghentian untuk beberapa pasangan input program yang mungkin?

Dapatkah saya menemukan bahasa pemrograman (atau bahasa), di mana saya untuk setiap jenis program dalam bahasa ini, dapat memutuskan apakah program berakhir atau berjalan selamanya?

Kaveh
sumber
3
CACM memiliki artikel yang sangat menarik pada bulan Mei: Program Pembatalan
Proing
3
"Algoritme umum [...] untuk beberapa pasangan masukan program yang memungkinkan" - itu hampir bertentangan dengan diri sendiri. Saya kira Anda ingin membatasi diri Anda pada subkelas semua program yang tak terbatas?
Raphael

Jawaban:

25

Dapatkah saya menemukan algoritma umum untuk menyelesaikan masalah penghentian untuk beberapa pasangan input program yang mungkin?

Ya tentu. Misalnya, Anda dapat menulis algoritme yang mengembalikan "Ya, itu berakhir" untuk setiap program yang tidak mengandung loop atau rekursi dan "Tidak, itu tidak berakhir" untuk program apa pun yang berisi while(true)loop yang pasti akan dicapai dan tidak mengandung pernyataan istirahat, dan "Tak tahu" untuk yang lainnya.

Dapatkah saya menemukan bahasa pemrograman (atau bahasa), di mana saya untuk setiap jenis program dalam bahasa ini, dapat memutuskan apakah program berakhir atau berjalan selamanya?

Tidak jika bahasa itu Turing-lengkap, tidak.

Namun ada bahasa lengkap non-Turing seperti misalnya Coq , Agda atau Microsoft Dafny yang Masalah Pemutusannya dapat ditentukan (dan sebenarnya diputuskan oleh sistem jenisnya masing-masing, menjadikannya bahasa total (mis. Program yang mungkin tidak berakhir tidak akan berhenti). menyusun)).

sepp2k
sumber
1
Kelas fungsi primitif-rekursif adalah "bahasa pemrograman" yang terkenal di mana masalah penghentian dapat diputuskan dengan mudah.
Raphael
Ada beberapa bahasa " pemrograman fungsional total " di mana semua program terbukti berakhir.
Anderson Green
3

Saya pikir semua jawaban di sini benar-benar dan benar-benar tidak penting. Jawaban atas pertanyaan adalah: dengan asumsi program ini dimaksudkan untuk berhenti, maka ya Anda sebaiknya dapat menghentikannya. Jika Anda tidak dapat menunjukkannya berhenti dengan mudah maka program harus dianggap sangat buruk ditulis dan ditolak oleh Kontrol Kualitas.

Apakah Anda benar-benar dapat menulis algoritma mesin yang sesuai tergantung pada bahasa pemrograman input dan seberapa ambisius Anda. Ini adalah tujuan desain yang masuk akal untuk bahasa pemrograman untuk membuatnya mudah untuk membuktikan penghentian.

Jika bahasanya adalah C ++ Anda mungkin tidak bisa menulis alat, memang tidak mungkin Anda mendapatkan parser, apalagi membuktikan penghentian. Untuk bahasa terstruktur yang lebih baik, Anda harus dapat menghasilkan bukti, atau setidaknya melakukannya dengan asumsi tertentu: dalam kasus terakhir alat harus menampilkan asumsi-asumsi ini. Pendekatan serupa akan mencakup pernyataan pemutusan hubungan kerja dalam bahasa dan menggunakannya dalam situasi kompleks di mana alat akan mempercayai pernyataan tersebut.

Intinya adalah bahwa tidak seorang pun tampaknya memahami bahwa bukti suatu program berhenti memang mungkin karena programmer (baik) yang berniat untuk menulis program penghentian seperti itu selalu melakukannya dengan sengaja dan dengan gambaran mental mengapa mereka berhenti dan bertindak dengan benar: kode semacam itu sengaja dibuat ditulis sehingga jelas bahwa mereka berhenti dan sudah benar dan jika algoritma yang masuk akal tidak dapat membuktikan ini, mungkin dengan beberapa petunjuk, maka program harus ditolak.

Intinya: programmer tidak menulis program yang sewenang-wenang, sehingga tesis tentang teorema berhenti tidak puas dan kesimpulannya tidak berlaku.

Yttrill
sumber
4
Saya pikir Andalah yang benar-benar dan benar-benar melewatkan intinya. Paragraf pertama jawaban Anda tidak berlaku untuk pertanyaan karena pertanyaan tentang algoritma - bukan apa yang bisa atau tidak bisa dibuktikan oleh manusia. Sisa jawaban menjawab paragraf pertama dari pertanyaan, yaitu apakah suatu algoritma dapat membuktikan penghentian untuk beberapa program. Semua orang dari jawaban sebelumnya sudah mengatakan "ya" untuk yang itu.
sepp2k
3
Pernyataan Anda yang memungkinkan untuk menulis algoritme yang dapat membuktikan penghentian setiap program yang ditulis dengan baik dalam bahasa Turing-complete yang cukup sederhana benar-benar salah. Untuk setiap kemungkinan algoritma yang mencoba membuktikan terminasi, ada masalah di mana setiap program yang memecahkan masalah tersebut tidak dapat dibuktikan dihentikan oleh algoritma tersebut. Jadi, kecuali jika Anda mengatakan bahwa setiap program memecahkan masalah itu ditulis dengan buruk oleh definisi (yang akan menggelikan), itu menyangkal pendapat Anda.
sepp2k
1
@ Sam Jika seseorang bertanya kepada saya apakah ada kode yang berhenti, saya akan melihat kode itu dan mencoba mencari tahu. Tapi saya bukan algoritma. Dan ya, mungkin untuk menulis algoritma yang dapat memeriksa apakah suatu program berhenti untuk banyak program. Tapi bukan itu yang dikatakan Yttrill. Yttrill mengatakan itu mungkin untuk semua program yang ditulis dengan baik. Dan seperti yang saya katakan di komentar saya sebelumnya, itu hanya salah kecuali Anda mengklaim bahwa masalah tertentu hanya dapat diselesaikan oleh program yang ditulis dengan buruk (yang lagi-lagi akan menggelikan).
sepp2k
1
@ Sam "Sepertinya langsung bagi saya bahwa program yang sengaja ditulis untuk dihentikan dapat dengan mudah dianalisis untuk menghentikan kondisi" - jika itu masalahnya, mengapa kita tidak memiliki alat seperti itu? Bukannya orang tidak berusaha. (Salah satu penyebabnya adalah metode overriding: pada waktu kompilasi, Anda tidak tahu semua kode yang akan dieksekusi.)
Raphael
1
@ Sam "apakah ada loop tak terbatas" adalah hal yang sulit untuk didekati, bahkan untuk loop dunia nyata. Tentu saja saya diajari cara menemukan loop-invarian, tetapi itu tidak berarti saya dapat menemukan satu (dengan mudah) dalam banyak kasus. Sejauh yang saya tahu, tebak & buktikan adalah standar emas hari ini. Sekali lagi, jika ada yang algoritma cukup umum, saya akan mengharapkan mereka untuk dimasukkan dalam kompilasi besar atau IDE (yang melakukan melakukan beberapa sepele, pemeriksaan sintaksis). Bisakah Anda memberikan referensi ke algoritma yang cukup kuat?
Raphael
3

pertanyaan yang sangat baik dan (mungkin tidak sengaja dalam). memang ada program pendeteksi penghentian yang dapat berhasil pada set input yang terbatas. ini merupakan area penelitian yang aktif. ini memiliki ikatan yang sangat kuat dengan area pembuktian teorema (otomatis).

Namun ilmu komputer tampaknya tidak memiliki istilah yang tepat untuk "program" yang "kadang-kadang" berhasil. kata "algoritma" biasanya disediakan untuk program yang selalu berhenti.

konsep ini tampaknya berbeda dari algoritma probabilistik di mana teoretikus CS menegaskan ada beberapa probabilitas yang diketahui atau dapat dihitung pada keberhasilan mereka.

ada istilah semialgoritma yang digunakan kadang-kadang tetapi tampaknya sinonim untuk dihitung berulang atau tidak bisa dihitung.

jadi untuk keperluan di sini, sebut mereka quasialgorithms . konsepnya berbeda dari decidable vs undecidable.

SEBUAHXBYXYXYBSEBUAH

dalam CS "hierarki algoritma kuasi" ini tampaknya dipelajari sebagian besar hanya secara informal sejauh ini.

itu muncul dalam penelitian berang-berang yang sibuk [1] dan masalah PCP [2]. sebenarnya serangan komputasi berbasis DNA pada PCP dapat dilihat sebagai quasialgorithm. [3] dan itu terlihat di daerah lain yang sudah dicatat seperti pembuktian teorema [4].

[1] Serangan milenium baru pada masalah berang-berang yang sibuk

[2] Mengatasi masalah korespondensi Kiriman oleh Zhao (v2?)

[3] Menggunakan DNA untuk menyelesaikan Masalah Pasca Korespondensi Terikat oleh Kari et al

[4] membuktikan penghentian program oleh Cook et al, Comm. dari ACM

(jadi ini sebenarnya adalah pertanyaan yang sangat mendalam yang layak diterima di TCS.SE imho ... mungkin seseorang dapat bertanya kembali di sana dengan cara yang sesuai & tetap)

ay
sumber
ps sebagai contoh yang mengesankan tentang betapa kuatnya kuasialgoritma, ACM menunjukkan bahwa fungsi akermanen dapat dibuktikan terhenti oleh kuasialgoritma, tetapi lebih besar dari (tidak dapat dihitung oleh) semua fungsi rekursif primitif.
vzn
1
"kata" algoritme "biasanya disediakan untuk program yang selalu berhenti." - Saya tidak yakin itu benar. Ada banyak algoritma penghentian sebagian (terutama verifikasi) dan saya belum pernah mendengar ada yang mengatakan "algoritma".
Raphael
ada penggunaan informal "algoritma". "Mengakhiri sebagian" tidak apa-apa, tetapi mungkin saja tidak berhasil. seperti yang disebutkan, sepertinya belum ada istilah stdized. wikipedia mendefinisikan suatu algoritma sebagai metode yang efektif yaitu decidable dengan karakteristik berikut (1) selalu memberikan jawaban daripada tidak pernah memberikan jawaban; (2) selalu memberikan jawaban yang benar dan tidak pernah memberikan jawaban yang salah; (3) selalu diselesaikan dalam jumlah langkah terbatas, bukan dalam jumlah tak terbatas; (4) bekerja untuk semua contoh masalah kelas.
vzn
dan kemudian dalam artikel yang sama dikatakan "Penjelasan lebih lanjut dari istilah" metode efektif "dapat mencakup persyaratan bahwa, ketika diberi masalah dari luar kelas yang metodenya efektif, metode tersebut dapat berhenti atau berulang selamanya tanpa berhenti. , tetapi tidak boleh mengembalikan hasil seolah-olah itu adalah jawaban untuk masalah. " yaitu hampir bertentangan sendiri!?! begitu jelas, luar biasa, ada beberapa kebingungan nyata pada masalah utama dan terminologi yang ada tidak ketat. perhatikan kata "algoritma" dekat dengan lebih dari satu milenia atau lebih & telah bergeser secara substansial ....
vzn
Itu benar: arti tradisional mungkin adalah "metode efektif" dalam cara Wikipedia mengatakan (tidak ada kontradiksi dalam kalimat yang Anda kutip; meskipun, agak tidak jelas) - orang tidak memahami fungsi / algoritma yang tidak berakhir (untuk beberapa input). Saya pikir ini telah berubah sejak 1950-an; seperti yang saya katakan, saat ini orang dengan jelas menyebut metode penghentian sebagian "algoritma".
Raphael
2

Selama bahasa pemrograman yang dipermasalahkan cukup kompleks (yaitu jika Turing selesai), maka selalu ada program dalam bahasa yang tidak dapat diputus oleh program apa pun.

Karena semua kecuali bahasa yang paling primitif adalah Turing lengkap (hanya membutuhkan sesuatu seperti variabel dan kondisional), Anda benar-benar hanya dapat membangun bahasa mainan yang sangat kecil yang dapat Anda selesaikan dengan masalah penghentian.

Sunting: Sehubungan dengan komentar, izinkan saya menjadi lebih eksplisit: Bahasa apa pun yang mungkin Anda rancang untuk menyelesaikan masalah penghentian harus Turing-tidak lengkap. Ini mengesampingkan bahasa apa pun yang berisi set bahan dasar yang sesuai (misalnya "variabel, kondisional dan lompatan", atau seperti kata @ sepp2k, generik "while" -loop).

Rupanya ada beberapa bahasa "sederhana" praktis seperti itu (misalnya pemecah teorema seperti Coq dan Agda). Jika mereka memenuhi gagasan Anda tentang "bahasa pemrograman", Anda dapat menyelidiki apakah mereka memenuhi semacam kelengkapan, atau apakah masalah penghentian dapat dipecahkan untuk mereka.


sumber
3
"Karena semua kecuali bahasa yang paling primitif adalah Turing lengkap (hanya membutuhkan sesuatu seperti variabel dan kondisional)" Itu tidak benar. Pertama-tama Anda paling tidak akan membutuhkan rekursi atau beberapa bentuk perulangan konstruksi (yang harus sekuat loop-sementara - loop penghitungan sederhana tidak cukup). Kedua, saya tidak berpikir ada banyak orang yang menyebut bahasa seperti Coq atau Agda (yang total dan dengan demikian tidak turing lengkap) bahasa primitif atau mainan.
sepp2k
@ sepp2k: Ya, ya. Aritmatika kacang juga cukup bermanfaat dan tidak Turing lengkap. Pernyataan yang disederhanakan, saya kira. Jika OP cukup memahami masalah ini, ia diharapkan akan dapat mengisi rincian teknis.
3
Ada kesenjangan besar antara menjadi "cukup kompleks" dan menjadi Turing-lengkap. Coq memang kompleks, dan cocok untuk berbagai tugas praktis yang sangat luas.
1
@ Gerrek SB Yah, mungkin saja bahasa lengkap Turing digunakan dengan cara yang tetap dapat dibuktikan untuk penghentian. Jika Anda dapat membuktikan bahwa formula rekursif selalu mendekati kondisi terminating-nya (seperti fungsi faktorial), Anda dapat membuktikannya berakhir meskipun Anda tidak akan mampu menangani setiap jenis rekursi.
@ ArtB: Tentu, selalu ada beberapa program yang dapat dibuktikan untuk berakhir. Pertanyaan pertama OP mungkin mengisyaratkan hal itu, meskipun saya tidak yakin saya mengikutinya sepenuhnya. Misalnya, Anda tidak dapat memiliki "algoritme generik" yang menentukan apakah ada rangkaian program tertentu yang berakhir, sementara sebaliknya Anda mungkin dapat membangun rangkaian fungsi terbatas sehingga dengan asumsi fungsi tersebut milik keluarga itu, Anda dapat mengetahui secara algoritmik apakah itu berakhir. (Tapi saya tidak yakin apakah keluarga itu bisa tidak sepele. Saya kira bisa, tapi saya tidak bisa membuat contoh.)
2

TT

Ini cukup sepele. Jika kita mengambil gabungan dari setiap himpunan bagian dari penghentian TM dan himpunan bagian dari TM yang tidak berhenti, hasilnya akan menjadi himpunan dari TM yang masalah penghentiannya dapat ditentukan (jalankan kedua mesin secara paralel, jika yang pertama menerima TM berhenti, jika yang kedua menerima maka mesin tidak berhenti). Namun ini tidak akan menyebabkan banyak bahasa yang menarik.

SEBUAHL.HaigTsayamecM.

Kaveh
sumber
1

Ya Anda bisa, tetapi saya ragu itu akan berguna. Anda mungkin harus melakukannya dengan analisis kasus dan kemudian Anda hanya dapat mencari kasus yang paling jelas. Misalnya, Anda dapat mengambil file untuk kode while(true){}. Jika file memiliki kode itu, ia tidak akan pernah berakhir ^. Secara lebih umum Anda dapat mengatakan bahwa suatu program tanpa loop atau rekursi akan selalu berakhir dan ada beberapa kasus yang dapat Anda lakukan yang dapat menjamin bahwa suatu program akan atau tidak akan berakhir, tetapi bahkan untuk program menengah sekalipun hal ini akan sangat sulit dan dalam banyak kasus tidak akan bisa memberi Anda jawaban.

tl; dr: Ya, tetapi Anda tidak akan dapat menggunakannya untuk sebagian besar program yang berguna.


^ Ya, secara teknis jika kode itu tidak ada di jalur-kode atau ada utas lain yang masih bisa dihentikan, tapi saya membuat poin umum di sini.


sumber
4
Menurut Anda mengapa Coq dan Agda tidak berguna? Anda melebih-lebihkan nilai kelengkapan Turing.
Saya telah menggunakan Coq, tetapi klaim saya tetap karena sebagian besar perangkat lunak komersial ditulis dalam Java / C ++ / Ruby / C # di mana klaim saya benar. Jenis program yang 90% orang tertarik untuk menulis tidak akan bermanfaat. Pada dasarnya, jika Anda tidak tahu tentang Coq / Agda dll Anda bukan target pasar untuk itu.
5
Saya akan mengatakan 99% dari program dunia nyata akan mendapat manfaat dari penerapan dalam subset bahasa yang tidak lengkap Turing. Anda tidak akan mengimplementasikan, katakanlah, fungsi Ackermann setiap hari. 100% CRUD tidak membutuhkan bahasa "nyata". Pemrosesan data hampir selalu sepele. Lihat proyek Terminator - mereka bahkan melayani sebagian kecil kemungkinan program C ++, yang lebih dari cukup untuk hal-hal dunia nyata (termasuk driver dan kode tingkat rendah lainnya).
Sebagian besar proyek dunia nyata ingin menggunakan kembali pustaka yang ditulis dalam bahasa Turing-complete dan menggunakan IDE, debugger, dan tutorial mereka. Ya, Anda dapat melakukan hal-hal dalam bahasa non-Turing, tetapi saya tidak dapat membayangkan beberapa orang benar-benar mengatakan "Saya ingin melakukan X" dan jawaban saya adalah "Gunakan Coq". ps- terima kasih telah memperkenalkan saya ke The Terminator Project .
4
sebagian besar logika bisnis yang tak terbayangkan diimplementasikan dalam SQL non-Turing-complete. Dan DSL dan eDSL sedang meningkat sekarang. Jadi, segera sebagian besar pemrogram aplikasi bisnis akan melupakan semua bahasa "tujuan umum".