Apa perbedaan antara bukti dan program (atau antara proposisi dan tipe)?

26

Mengingat Curry-Howard Correspondence tersebar begitu luas / meluas, apakah ada perbedaan antara bukti dan program (atau antara proposisi dan tipe)? Bisakah kita benar-benar mengidentifikasi mereka?

hari
sumber
1
Tampaknya lebih cocok untuk cstheory.stackexchange.com
Jika op mau, @ saya dalam komentar dan saya bisa memigrasikannya untuk Anda.
2
John Crossley menulis makalah tentang ini yang kebetulan saya lihat diposting di suatu tempat baru-baru ini: [Apa perbedaan antara bukti dan program?] [ Citeseerx.ist.psu.edu/viewdoc/… - Saya belum membacanya, tetapi itu direkomendasikan ...
TJ Ellis
1
@TJ Ellis, terima kasih atas tautannya, tetapi setelah membaca sebentar, sepertinya makalah itu tidak menjawab pertanyaan yang diajukan dalam judulnya (atau jawabannya adalah "mereka sama").
maks taldykin
@ TJ Ellis, apakah Anda melihatnya memposting di reddid / r / compsci? Saya melakukannya,;) @ Max, saya merasa begitu, itu sebabnya saya memposting pertanyaan ini.

Jawaban:

20

Bahasa pemrograman yang digunakan orang sehari-hari tidak begitu cocok dengan korespondensi Curry-Howard, karena sistem tipenya terlalu lemah. Untuk mengatakan sesuatu yang menarik menggunakan Curry-Howard untuk program-program penting, seseorang perlu memiliki sistem tipe yang lebih canggih. Buku Adapting Proofs-as-programs mendorong sudut ini dengan tujuan mensintesis program-program penting. Dengan tipe dependen menjadi lebih dan lebih populer, tentu saja dalam bahasa fungsional penelitian ( Agda , Epigram ), perbedaannya menjadi lebih blurrier. Tentu saja Anda dapat melakukan sintesa / ekstraksi program dalam prover teorema Coq (dan mungkin yang lain), yang tentu saja didasarkan pada Curry-Howard.

Korespondensi Curry-Howard juga dapat digunakan dalam situasi di mana bukti tidak begitu jelas sesuai dengan program (atau mereka bukan program yang akan dijalankan oleh siapa pun). Salah satu contohnya adalah otorisasi pembawa bukti . Proposisi sesuai dengan pernyataan tentang siapa yang berwenang untuk melakukan apa. Bukti memberikan bukti yang diperlukan yang dimiliki oleh suatu proposisi, sehingga permintaan otorisasi diizinkan. Untuk menyandikan bukti, istilah bukti diperkenalkan (melalui Curry-Howard). Ketentuan bukti dikirim antar pihak sebagai representasi bukti validitas permintaan otorisasi, tetapi tidak dianggap sebagai program.

Dave Clarke
sumber
1
Anda harus menyebutkan bahasa yang diketik secara dependen, karena di dalamnya garis antara bukti dan proposisi menjadi kabur.
Ohad Kammar
1
Memang. Jangan lupa sintesis / ekstraksi program Coq.
Dave Clarke
k T(e,k)¬k T(e,k)Tek
1
@ Kaveh: tanyakan ini sebagai pertanyaan terpisah. Dalam komentar, Anda dapat mengatakan "terjemahan Godel-Gentzen adalah transformasi kelanjutan-lewat" tetapi apa pun yang kurang samar tidak akan cocok. :)
Neel Krishnaswami
10

Dalam Coq, ada 2 jenis (Prop dan Set), mereka digunakan oleh programmer untuk memisahkan apa bukti yang tidak akan menghasilkan kode aktual dan bagian dari bukti yang akan digunakan untuk mengekstrak kode yang sedang berjalan (program Anda).

Itu adalah solusi yang bagus untuk masalah yang Anda tanyakan, bagaimana mengidentifikasi apa yang dimaksudkan untuk menghasilkan kode mesin (program) dan apa yang ada untuk melengkapi bukti proposisi (atau tipe).

AFAIK tidak ada cara otomatis untuk membedakan keduanya. Ini mungkin sesuatu yang menarik untuk penelitian? Atau mungkin seseorang dapat menunjukkan bahwa itu jelas tidak mungkin?

Dengan tipe dependen tidak hanya tidak ada perbedaan yang jelas antara bukti dan program tetapi juga tidak ada perbedaan antara program dan tipe! Satu-satunya perbedaan adalah di mana jenis (atau program) muncul, menjadikannya bagian dari tempat "program" atau tempat "tipe" dari istilah yang diberikan.

Sebuah contoh akan membuatnya lebih jelas, saya harap:

Ketika Anda menggunakan fungsi identitas dengan tipe dependen, Anda harus melewati tipe yang akan digunakan fungsi itu! Jenis ini digunakan sebagai nilai dalam "program" Anda!

Kalkulus Lambda yang tidak diketik:

λx.x

Dengan Jenis Tanggungan:

id: (A: Set) -> A -> A

(λA.(λx.x))

Jika Anda menggunakan fungsi ini, maka Anda akan melakukannya seperti contoh ini:

id Naturals 1

Perhatikan bahwa "tipe" (dalam hal ini Set of Naturals) dilewatkan sebagai nilai yang dibuang sehingga tidak akan pernah dihitung, tetapi tetap berada di bagian "program" dari istilah tersebut. Itu yang juga akan terjadi dengan bagian "bukti", mereka harus ada di sana untuk istilah untuk mengetik-periksa tetapi selama perhitungan mereka akan dibuang.

Flávio Botelho
sumber
6

Saya akan mengambil risiko di sini dan mengatakan bahwa, jika Anda mau sedikit menyipit, bukti dan program terminasi dapat diidentifikasi.

Setiap program penghentian adalah bukti bahwa Anda dapat mengambil inputnya dan menghasilkan outputnya. Ini adalah jenis bukti implikasi yang sangat mendasar.

Tentu saja, untuk membuat implikasi ini membawa informasi lebih bermakna daripada menyatakan yang jelas, Anda harus dapat menunjukkan bahwa program bekerja untuk setiap dan semua contoh input yang diambil dari beberapa kelas dengan makna logis. (Dan juga untuk hasilnya.)

Dari arah lain, bukti apa pun dengan langkah inferensi terbatas adalah program simbolik yang memanipulasi objek dalam beberapa sistem logis. (Jika kita tidak terlalu khawatir tentang apa arti simbol dan aturan logis secara komputasi.)

x:xT

Ini cukup sederhana, tapi saya pikir itu menunjukkan kekokohan ide. (Bahkan jika beberapa orang terikat untuk tidak menyukainya. ;-))

Marc Hamann
sumber
jawaban yang sangat bagus
toto
Seseorang harus berasumsi, tentu saja, bahwa yang Anda maksud adalah bukti yang terbatas dan menghentikan program. Beberapa kelas program yang tidak berhenti bekerja dengan baik sebagai bukti tak terbatas. Ini adalah program non-penghentian non-produktif yang harus Anda perhatikan.
wren romano
Saya pikir ini agak rumit, tergantung pada bagaimana Anda mendefinisikan terbatas dan tak terbatas sehubungan dengan bukti. Secara umum, semua bukti yang kami terima terbatas, karena harus meyakinkan manusia dalam waktu terbatas. Sebuah bukti yang bergantung pada skema induksi (yaitu sebagian besar bukti "tak terbatas") dengan ukuran ini masih terbatas, mereka hanya memiliki langkah-langkah simbolis yang mewakili perhitungan tak terbatas tetapi teratur. Bukti yang benar-benar tidak terbatas, yang saya pikir sebagian besar dari kita akan tolak sebagai bukti yang valid, akan menjadi bukti di mana Anda benar-benar harus mempertimbangkan jumlah fakta berbeda yang tak terbatas untuk divalidasi.
Marc Hamann
5

Bukti tidak relevan?

Ketika Anda menulis beberapa program, Anda tertarik dengan kinerjanya, konsumsi memori, dll.
Misalnya, lebih baik menggunakan beberapa algoritma pengurutan yang pintar daripada bubble sort, bahkan jika implementasinya memiliki tipe yang sama (bahkan dalam pengaturan tipe dependen).

Tetapi ketika Anda membuktikan beberapa teorema, itu hanya keberadaan bukti yang Anda minati.

Tentu saja, dari sudut pandang estetika, beberapa bukti lebih sederhana / indah / inspiratif / dll (misalnya bukti dari Buku).

maks taldykin
sumber
4

Jika Anda menerima korespondensi Curry-Howard maka pertanyaannya adalah pertanyaan filosofis. "Apakah bukti dan program berbeda? Tentu saja. Bagaimana? Yah, kami menyebut bukti sebagai 'bukti' dan kami menyebut program 'program'."

Atau dengan kata lain, jika ada isomorfisme antara bukti dan program — yang tampaknya jelas ada — maka pertanyaan Anda adalah apakah ada oracle yang mampu membedakan keduanya. Manusia mengkategorikan mereka sebagai yang berbeda (untuk sebagian besar), jadi tentu saja dapat diperdebatkan bahwa oracle semacam itu ada. Pertanyaan penting kemudian menjadi apakah ada perbedaan yang berarti di antara mereka, yang cocok untuk debat filosofis. Apa itu "bukti"? Tidak ada definisi formal tentang apa yang merupakan bukti; itu istilah seni, mirip dengan gagasan "dapat dihitung secara efektif" dalam tesis Gereja-Turing. Untuk itu, "program" juga tidak memiliki definisi formal.

Ini adalah kata-kata bahasa alami yang digunakan untuk mengkategorikan berbagai bidang penyelidikan matematika. Apa yang diamati Curry dan Howard adalah bahwa kedua bidang yang berbeda ini ternyata mempelajari hal yang sama. Memperhatikan hubungan ini penting karena dikatakan bahwa para peneliti yang berbeda ini harus berbicara satu sama lain. Tetapi di tingkat lain, memperhatikan hubungan itu dengan mempercayai perbedaan di antara mereka. Saat menangani masalah, terkadang lebih bermanfaat untuk menganggapnya sebagai masalah pemrograman, sedangkan di lain waktu lebih menguntungkan untuk menganggapnya sebagai masalah logis. Perbedaan perspektif ini, saya pikir, perbedaan penting di antara mereka. Tetapi apakah perbedaan perspektif merupakan perbedaan identitas adalah pertanyaan filosofis yang mendalam yang telah dieksplorasi setidaknya sejauh FregeUeber Sinn und Bedeutung .

wren romano
sumber