Bahasa pemrograman untuk perhitungan yang efisien

32

Tidak mungkin menulis bahasa pemrograman yang memungkinkan semua mesin berhenti pada semua input dan tidak ada yang lain. Namun, sepertinya mudah untuk mendefinisikan bahasa pemrograman seperti itu untuk kelas kompleksitas standar apa pun. Secara khusus, kita dapat mendefinisikan bahasa di mana kita dapat mengekspresikan semua perhitungan yang efisien dan hanya perhitungan yang efisien.

Misalnya, untuk sesuatu seperti : ambil bahasa pemrograman favorit Anda, dan setelah Anda menulis program Anda (sesuai dengan Turing Machine ), tambahkan tiga nilai ke header: integer , dan integer , dan output default . Ketika program dikompilasi, output mesin Turing yang diberikan input ukuran menjalankan on untuk langkah . Jika tidak berhenti sebelum langkah naik, output output defaultPMckdMxnMxcnkMcnkd. Kecuali saya salah, bahasa pemrograman ini akan memungkinkan kami untuk mengekspresikan semua perhitungan dalam dan tidak lebih. Namun, bahasa yang diusulkan ini secara inheren tidak menarik.P

Pertanyaan saya: apakah ada bahasa pemrograman yang menangkap himpunan bagian dari fungsi yang dapat dihitung (seperti semua fungsi yang dapat dihitung secara efisien) dengan cara yang tidak sepele? Jika tidak, apakah ada alasan untuk ini?

Artem Kaznatcheev
sumber
7
Beberapa contoh sederhana bahasa pemrograman yang menangkap himpunan bagian dari fungsi yang dapat dihitung: ekspresi reguler dan tata bahasa bebas konteks.
Jukka Suomela
2
Sebenarnya bahasa yang menangkap kelas kompleksitas seperti (yang didefinisikan dengan cara yang mirip dengan fungsi rekursif primitif dengan rekursi diganti dengan rekursi terbatas) cukup menarik (setidaknya dari sudut pandang teoritis). :)PPV
Kaveh
Pemrograman Linear dan Integer menangkap himpunan bagian yang menarik dari fungsi yang dapat dihitung.
Diego de Estrada
Datalog hanya dapat mengekspresikan algoritma waktu polinomial, tetapi saya tidak tahu apakah itu dapat mengekspresikan semua algoritma waktu polinomial.
Jules
Makalah terkenal "Total fungsional pemrograman" membuat argumen bahwa bahasa pemrograman yang tidak memiliki masalah penghentian diputuskan sebenarnya praktis dan bermanfaat. jucs.org/jucs_10_7/total_functional_programming
none

Jawaban:

32

Satu bahasa yang hanya mencoba untuk mengekspresikan perhitungan waktu polinomial adalah kalkulus lambda lunak . Jenis sistem itu berakar pada logika linier. Tesis baru-baru ini membahas kalkulus waktu polinomial, dan memberikan ringkasan yang bagus tentang perkembangan terkini berdasarkan pendekatan ini. Martin Hofmann telah mengerjakan topik ini selama beberapa waktu. Daftar yang lebih tua dari makalah yang relevan dapat ditemukan di sini ; Banyak dari makalahnya berlanjut ke arah ini.

Pekerjaan lain mengambil pendekatan untuk memverifikasi bahwa program tersebut menggunakan sejumlah sumber daya tertentu, menggunakan Jenis Ketergantungan atau Bahasa Majelis yang Diketik .

Namun pendekatan lain didasarkan pada kalkulus formal terbatas sumber daya , seperti varian kalkulus ambien.

Pendekatan ini memiliki properti yang diketik dengan baik oleh program memenuhi beberapa batasan sumber daya yang ditentukan sebelumnya. Batas sumber daya dapat berupa waktu atau ruang, dan umumnya dapat bergantung pada ukuran input.

Pekerjaan awal di bidang ini adalah pada batu yang sangat normal, yang berarti bahwa semua program yang diketik dengan baik berhenti. Sistem F , alias kalkulus lambda polimorfik, sangat normal. Ia tidak memiliki operator titik tetap, namun tetap cukup ekspresif, meskipun saya tidak berpikir kelas kompleksitas yang terkait dengannya. Menurut definisi, setiap kalkulus yang sangat normal mengungkapkan beberapa kelas penghentian perhitungan.

Bahasa pemrograman Charity adalah bahasa fungsional yang cukup ekspresif yang berhenti pada semua input. Saya tidak tahu kelas kompleksitas apa yang bisa diekspresikan, tetapi fungsi Ackermann dapat ditulis dalam Charity.

Dave Clarke
sumber
Apa yang Anda maksud dengan 'setidaknya' di sini?
nponeccop
'Setidaknya' di sini berarti 'beberapa'. Saya akan mengubah jawaban saya untuk membuatnya sedikit lebih tepat.
Dave Clarke
Saya cukup yakin bahwa kompleksitas fungsi yang dapat didefinisikan dalam sistem F adalah kelas fungsi yang berakhir dalam waktu "beberapa fungsi total yang dapat dibuktikan dari aritmatika orde 2" dari input. Bukan kelas kompleksitas yang sangat konvensional, tapi masih ...
cody
cody: menurut "Teorema gratis" Wadler, Sistem F dapat menyatakan "setiap fungsi rekursif yang dapat dibuktikan total dalam aritmatika Peano orde kedua", dan bahwa "termasuk [...] fungsi Ackermann". Saya tidak yakin apakah itu sama dengan yang Anda gambarkan. Fitur utama Charity adalah dukungannya untuk codata, sementara saya pikir pengecekan penghentian Agda memungkinkan lebih banyak ekspresif daripada Coq dan Sistem F sambil menjamin penghentian.
Blaisorblade
8

Saya juga ingin menyebutkan Teori Kompleksitas Tersirat sebagai pendekatan untuk ini, karena saya telah melihatnya muncul dalam beberapa pertanyaan yang agak terkait. Mengutip jawaban ini oleh Neel Krishnaswami :

Teknik dasarnya adalah mengaitkan kelas kompleksitas dengan subsistem logika linier (yang disebut "logika linier cahaya"), dengan gagasan bahwa cut-elimination untuk sistem logis harus lengkap untuk kelas kompleksitas yang diberikan (seperti LOGSPACE, PTIME, dll). Kemudian melalui Curry-Howard Anda mengeluarkan bahasa pemrograman di mana tepatnya program-program di kelas yang diberikan dapat diekspresikan.

Chris Pressey
sumber
5

Saya terkejut tidak ada yang menyebutkan rekursi primitif. Dengan membatasi loop terikat (yaitu jumlah iterasi untuk setiap loop harus dihitung sebelum loop dimulai) program yang dihasilkan adalah primitif rekursif, dan karenanya total. Douglas Hofstadter mengusulkan bahasa pemrograman, BLOOP, yang memungkinkan semua dan hanya fungsi rekursif primitif.

David Harris
sumber
1
Ini adalah subkelas yang tepat dari semua fungsi, tetapi menyebutnya kelas fungsi "efisien" mungkin sedikit berlebihan.
Raphael
Saya kira Anda dapat memodifikasinya untuk menangkap menggunakan karakterisasi Cobham dari sebagai rekursi terikat secara polinomi. PP
Kaveh
Yang lain menyebutkan Sistem F dan bahasa-bahasa lain yang sangat normal, yang dalam arti hanya mendukung "pengulangan primitif". Namun, karena mereka mendukung fungsi kelas satu, mereka memungkinkan menulis lebih banyak program (seperti fungsi Ackermann).
Blaisorblade