Apa batas-batas pemrograman fungsional total?

19

Apa keterbatasan pemrograman fungsional total? Ini bukan Turing-complete, tetapi masih mendukung sebagian besar dari program yang mungkin. Apakah ada konstruksi penting yang bisa Anda tulis dalam bahasa Turing-lengkap, tetapi tidak dalam bahasa fungsional total?

Dan apakah benar mengatakan bahwa program yang ditulis dalam bahasa fungsional total dapat sepenuhnya dianalisis secara statis, sementara analisis statis dalam bahasa lengkap Turing dibatasi oleh hal-hal seperti masalah penghentian? Dengan itu saya tidak bermaksud bahwa dalam bahasa fungsional total semuanya dapat ditentukan secara statis, karena beberapa hal hanya diketahui pada saat runtime, tetapi maksud saya bahwa dalam teori, program yang ditulis dalam bahasa pemrograman fungsional total yang ideal, dapat dianalisis sehingga semua yang secara teori bisa ditentukan secara statis dapat ditentukan secara statis. Atau masih ada masalah yang tidak dapat dipastikan mewarisi dalam bahasa fungsional total yang membuat analisis statis tidak lengkap? Beberapa masalah akan selalu tidak dapat diputuskan, tidak peduli dalam bahasa apa mereka ditulis, tetapi saya tertarik dengan masalah yang mewarisi bahasa tersebut,

Matthijs Steen
sumber

Jawaban:

16

Itu tergantung pada bahasa fungsional total .

Jawaban ini terdengar seperti penghalang, tetapi tidak ada yang lebih spesifik yang dapat dikatakan. Setelah semua, pertimbangkan program penting apa pun yang Anda tertarik. Tulis program dalam bahasa lengkap Turing favorit Anda untuk menyelesaikannya. Karena masalah dapat diputuskan, program Anda akan berhenti pada semua input.

(Bisa dibilang, masalah yang tidak dapat diputuskan dapat memiliki program yang menarik, tetapi tidak sedemikian rupa sehingga orang dapat menggunakannya, karena mereka tidak akan pernah bisa menunggu cukup lama untuk mengetahui jawabannya.)

Sekarang, tentukan bahasa baru sehingga hanya memiliki satu program input yang valid: program yang baru saja Anda tulis, dengan semantik yang sama seperti sebelumnya. Ini tentu total, karena semua input ke semua program yang tertulis di dalamnya (yang hanya ada satu) selalu berakhir.

Trik murah ini sebenarnya berguna: bahasa Coq , misalnya, adalah bahasa fungsional total karena tidak ada tanda centang program kecuali ada bukti yang diakhiri. (Jika Anda mengesampingkan persyaratan itu, itu akan menjadi Turing-lengkap, jadi satu-satunya kendala adalah menemukan bukti penghentian.)

Saya tidak yakin apa yang Anda maksud dengan "segala sesuatu yang secara teori dapat ditentukan secara statis dapat ditentukan secara statis"; kedengarannya benar secara tautologis. Meskipun demikian, total bahasa pada dasarnya tidak mudah untuk dianalisis; Anda tahu bahwa tidak ada yang menyimpang, yang merupakan fakta berguna, tetapi hubungan antara input dan output masih kompleks. (Secara khusus, masih ada banyak kemungkinan input yang tak terhingga, sehingga Anda tidak dapat mencoba semuanya secara menyeluruh, bahkan secara teori.)

Paul Stansifer
sumber
Terima kasih atas jawaban anda. Jadi bersikap total agak membantu, tetapi itu tetap merupakan masalah yang sangat sulit. Yang saya maksud dengan "segala sesuatu yang secara teori dapat ditentukan secara statis dapat ditentukan secara statis" adalah apakah mungkin, sangat sulit atau tidak, untuk menganalisis semua hubungan antara input dan output, jika Anda memiliki sumber daya yang cukup untuk melakukannya . Atau apakah alasan mendasar mengapa ini terbatas? Seperti bukti Rice'sorma bahwa ini adalah kasus untuk fungsi parsial. Atau apakah saya salah paham teorema Rice?
Matthijs Steen
Saya pikir itu mungkin tergantung pada apa yang Anda maksud dengan "hubungan". Secara khusus, jika Anda hanya bermaksud "input A pergi ke output B", ini dapat ditentukan secara sepele dalam bahasa fungsional total; jalankan saja programnya. Tetapi Anda mungkin tertarik pada analisis yang mengatakan sesuatu tentang kelas input yang tidak terbatas.
Paul Stansifer
(oops; tekan enter secara tidak sengaja) ... tetapi ini membuka trik konyol lainnya, karena saya dapat mengajukan pertanyaan yang tidak dapat dipastikan tentang fungsi identitas jika saya ingin: "Bagi sebagian orang X, apakah (identity X)Mesin Turing yang berhenti?" Tentu, itu sepertinya bukan tentang identity , tetapi bagaimana Anda mendefinisikan "tentang"?
Paul Stansifer
Ya, saya ingin tahu apakah itu berlaku untuk semua nilai input yang mungkin dari beberapa definisi, bukan untuk input individual. Jadi jika saya mengerti Anda dengan benar, maksud Anda akan selalu ada beberapa pertanyaan yang tidak dapat diputuskan, tidak peduli apa jenis bahasa pemrograman yang digunakan? Meskipun beberapa pertanyaan yang tidak dapat dipastikan ini mungkin dapat dielakkan dengan mencegah masalah tersebut tidak terjadi, seperti bahasa fungsional total untuk Masalah Penghentian? Karena bukankah pertanyaan Anda tentang fungsi identitas dapat dipilih dalam bahasa fungsional total?
Matthijs Steen
Iya; versi modifikasi dari masalah, di mana "Mesin Turing" diganti oleh "Breaks Down Setelah Jaminannya Berakhir Mesin Turing" sepele dipecahkan. Agak merepotkan untuk tujuan ini sehingga masalah penghentian adalah contoh dari masalah yang tidak dapat diputuskan ketika memeriksa program yang penuh dengan ketidakpastian.
Paul Stansifer
16

Apa keterbatasan pemrograman fungsional total? Ini bukan Turing-complete, tetapi masih mendukung sebagian besar dari program yang mungkin. Apakah ada konstruksi penting yang bisa Anda tulis dalam bahasa Turing-lengkap, tetapi tidak dalam bahasa fungsional total?

LLL

  1. LLLLkonsisten. Inilah yang dikesampingkan oleh teorema Goedel, dengan asumsi Anda dapat melakukan aritmatika. Jadi kita tahu bahwa kita tidak bisa menulis penerjemah mandiri dalam bahasa fungsional total.

  2. Sisi lain dari ini adalah batas-batas pada daya ekspresif dari total bahasa pada dasarnya adalah batas-batas pada daya ekspresif matematika itu sendiri . Misalnya, fungsi yang dapat didefinisikan dalam Coq (asisten bukti) adalah fungsi yang dapat dibuktikan menggunakan ZFC, dengan banyak kardinal yang tidak dapat diakses. Jadi pada dasarnya setiap fungsi yang Anda dapat membuktikan total kepuasan seorang matematikawan yang bekerja dapat didefinisikan dalam Coq.

  3. Sisi lain dari sisi lain adalah matematika itu sulit! Jadi tidak ada pengertian yang mudah di mana bahasa total "sepenuhnya dapat dianalisis" - bahkan jika Anda tahu bahwa suatu fungsi berakhir, Anda mungkin masih harus melakukan banyak pekerjaan kreatif untuk membuktikan bahwa ia memiliki properti yang Anda inginkan. Misalnya, hanya mengetahui bahwa fungsi dari daftar ke daftar adalah total, tidak membuat Anda terlalu jauh dalam membuktikan bahwa itu adalah fungsi penyortiran ....

Neel Krishnaswami
sumber
Terima kasih atas jawaban anda. Saya telah membaca posting tentang masalah ini di weblog Lambda the Ultimate , tetapi beberapa orang di komentar menyatakan bahwa meskipun tidak mungkin untuk memiliki evaluator itu sendiri sebagai istilah yang secara eksplisit dapat dibangun, namun dimungkinkan untuk membuat self-working yang berfungsi. evaluator dengan beberapa trik. Jadi saya bertanya-tanya, apakah ada masalah yang tidak dapat diselesaikan (atau diperkirakan) dalam bahasa fungsional total dengan beberapa trik jalan memutar?
Matthijs Steen
Saya akan mengatakan bahwa evaluasi diri tidak dianggap sebagai masalah, karena itu bervariasi tergantung pada bahasa. Masalah "mengevaluasi suatu program dalam bahasa X" adalah masalah yang sama, terlepas dari apakah Anda mencoba menyelesaikannya dalam bahasa X atau Y. Secara khusus, jika bahasa X adalah bahasa fungsional total, masalahnya dapat dipecahkan dalam beberapa bahasa fungsional total , menggunakan trik konyol yang sama yang saya gunakan sebelumnya.
Paul Stansifer
Neel, sepertinya itu seharusnya jauh lebih mudah daripada itu untuk membuktikan bahwa bahasa total tidak dapat mendukung penerjemahnya sendiri. Apakah saya salah paham dengan Anda? Dengan diagonalisasi sederhana, bahasa apa pun dengan fungsi tanpa titik tetap tidak dapat mendukung penerjemahnya sendiri (baik itu mendukung aritmatika atau tidak). Argumen ini dijabarkan oleh Conor McBride di sini: mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis
@ TomEllis: Argumen saya pada dasarnya sama dengan argumen Conor. Bahkan, jabatannya sudah membuat pengamatan ini (dengan karakteristik Conor) ketika ia menyebutnya "argumen Epimenides / Cantor / Russell / Quine / Godel / Turing."
Neel Krishnaswami