Mengapa Coq memiliki Prop?

35

Coq memiliki Prop jenis bukti proposisi tidak relevan yang dibuang selama ekstraksi. Apa alasan untuk memiliki ini jika kita menggunakan Coq hanya untuk bukti. Prop adalah impredikatif, jadi Prop: Prop, bagaimanapun, Coq secara otomatis menyimpulkan indeks alam semesta dan kita dapat menggunakan Tipe (i) sebagai gantinya di mana-mana. Sepertinya Prop menyulitkan semuanya.

Saya membaca bahwa ada alasan filosofis untuk memisahkan Set dan Prop dalam buku Luo, namun, saya tidak menemukannya dalam buku itu. Apakah mereka?

Konstantin Solomatov
sumber
6
"Jika kita menggunakan Coq hanya untuk bukti": Saya pikir Anda telah mengidentifikasi titik kunci di sini. Coq tidak hanya digunakan untuk bukti.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

34

Prop sangat berguna untuk ekstraksi program karena memungkinkan kita untuk menghapus bagian-bagian kode yang tidak berguna. Sebagai contoh, untuk mengekstrak algoritma penyortiran kami akan membuktikan pernyataan "untuk setiap daftar ada daftark sedemikian sehinggak dipesan dank adalah permutatiom dari ". Jika kita menuliskan ini dalam Coq dan ekstrak tanpa menggunakanProp , kita akan mendapatkan:

  1. "untuk semua ada k " akan memberi kita peta sortyang membawa daftar ke daftar,
  2. "sedemikian rupa sehingga dipesan" akan memberikan fungsi yang berjalan melalui k dan memeriksa apakah itu diurutkan, dankverifyk
  3. " adalah permutasi dari " akan memberikan permutasi yang membawa ke k . Perhatikan bahwa ini bukan hanya pemetaan, tetapi juga pemetaan terbalik bersama dengan program yang memverifikasi bahwa kedua peta tersebut benar-benar terbalik.kpikpi

Sementara hal-hal tambahan tidak sepenuhnya tidak berguna, dalam banyak aplikasi kami ingin menyingkirkannya dan tetap adil sort. Hal ini dapat dicapai jika kita menggunakan ke negara " k memerintahkan" dan " k adalah permutasi dari ", tapi tidak "untuk semua ada k ".Propkkk

Secara umum, cara umum untuk mengekstrak kode adalah dengan mempertimbangkan pernyataan bentuk mana x adalah input, y adalah output, dan ϕ ( x , y ) menjelaskan apa artinya bagi y menjadi output yang benar. (Dalam contoh di atas A dan B adalah jenis daftar dan ϕ ( , k ) adalah " k dipesan dan k adalah permutasi dari .") Jika ϕ ada di P r o p maka ekstraksi memberikan peta f :x:A.y:B.ϕ(x,y)xyϕ(x,y)yABϕ(,k)kkϕProp sehingga φ ( x , f ( x ) ) berlaku untuk semua x A . Jika ϕ ada di S e t maka kita juga mendapatkan fungsi g sedemikian sehingga g ( x ) adalah bukti bahwa ϕ ( x , f ( x ) ) berlaku, untuk semua x Af:ABϕ(x,f(x))xAϕSetgg(x)ϕ(x,f(x))xA. Seringkali buktinya tidak berguna secara komputasional dan kami lebih suka membuangnya, terutama ketika itu bersarang jauh di dalam beberapa pernyataan lainnya. memberi kita kemungkinan untuk melakukannya.Prop

Ditambahkan 2015-07-29: Ada pertanyaan apakah kita bisa menghindari sama sekali dengan secara otomatis mengoptimalkan "kode tidak berguna diekstraksi". Hingga taraf tertentu kita dapat melakukan itu, misalnya semua kode yang diekstraksi dari fragmen negatif dari logika (barang-barang yang dibangun dari tipe kosong, tipe unit, produk) tidak berguna karena hanya bergerak di sekitar unit. Tapi ada desain keputusan asli seseorang harus membuat ketika menggunakan P r o p . Berikut ini adalah contoh simpe, di mana Σ berarti bahwa kita berada dalam T y p e dan berarti kita berada dalam P r o p . Jika kita ekstrak dari PropPropΣTypeProp kita akan mendapatkan program yang menguraikan n menjadi bit terendah b dan bit yang tersisa k , yaitu, ia menghitung semuanya. Jika kita mengekstrak dari Π n : N Σ b : { 0 , 1 }k : N

Πn:NΣb:{0,1}Σk:Nn=2k+b
nbk maka program hanya akan menghitung bit terendah b . Mesin tidak dapat menentukan mana yang benar, pengguna harus mengatakan apa yang diinginkannya.
Πn:NΣb:{0,1}k:Nn=2k+b
b
Andrej Bauer
sumber
1
Saya sedikit bingung. Apakah Anda mengatakan bahwa tanpa tidak mungkin untuk mengenali dalam program yang diekstrak bahwa g ( x ) tidak berkontribusi pada output (yaitu hanya memverifikasi saja)? Apakah ada skenario di mana seseorang tidak akan dapat mengeluarkan kode tidak berguna seperti itu melalui cara biasa yang tersedia untuk pengoptimal kode? Propg(x)
pengguna
1
Dari program yang diekstraksi, orang bisa mengatakan, "Saya ingin ," dan mundur dari sana. Saya belum dapat menemukan skenario yang terjerat sehingga kita tidak dapat mengoptimalkan apa pun yang tidak secara langsung berkontribusi untuk menentukan permutasi tanpa itu sebenarnya diperlukan untuk menghitung permutasi tersebut (dari sudut pandang optimasi global, toh ). k
pengguna
1
Anda tidak memiliki informasi "Saya ingin ". Itu adalah asumsi tambahan, dan jelas sekali mereka memberi tahu Anda hasil tertentu yang mereka inginkan, Anda hanya dapat mengoptimalkan kode mati. Sebenarnya, saya pikir dari jawaban yang lebih baik: itu adalah desain pertanyaan yang hal untuk dimasukkan ke dalam P r o p . Anda perlu tahu apa yang diinginkan pengguna, dan ia memberitahu Anda apa yang dia inginkan dengan menggunakan P r o p . Mudah untuk memberikan contoh di mana ada beberapa opsi. Saya akan menambahkan satu ke jawaban saya. kPropProp
Andrej Bauer
2
Sejauh yang saya tahu tidak ada yang bisa benar-benar tahu cara mengekstrak apa pun dari -jenis. Jelas bahwa mereka mengandung beberapa konten komputasi, tetapi tidak seperti ini. (1)
Andrej Bauer
3
Ah, baiklah. Menggunakan sebagai cara menentukan keputusan desain jauh lebih masuk akal bagi saya daripada sebagai cara menghapus kode yang tidak berguna. Prop
pengguna
19

adalahimpredikatif, yang menciptakan sistem bukti yang sangat ekspresif. Namun "terlalu" ekspresif dalam arti berikut:Prop

impredicative Prop+large elimination+excluded middle

tidak konsisten. Biasanya Anda ingin menjaga kemungkinan untuk menambahkan tengah yang dikecualikan, jadi salah satu solusinya adalah menjaga eliminasi besar dan membuat Prop predikatif. Yang lainnya adalah untuk menekan eliminasi besar.

Coq melakukan keduanya! Mereka mengganti nama Prop menjadi Prop untuk Set, dan menonaktifkan eliminasi besar di Prop.

Ekspresi yang diperoleh oleh impredicativity adalah "meyakinkan" dalam arti 99% dari matematika "masuk akal" dapat diformalkan dengannya, dan itu diketahui relatif konsisten dengan teori yang ditetapkan. Ini memungkinkan mereka tidak akan melemahkannya menjadi sesuatu seperti Agda, yang hanya memiliki alam semesta predikatif.

cody
sumber
8
Oh dan saya lupa menyebutkan: bukan itu masalahnya Prop : Prop, itu tidak konsisten. Sebaliknya kuantifikasi atas semua proposisi lagi-lagi merupakan proposisi.
cody
Bisakah Anda mengarahkan saya ke sumber daya lain tentang ini? Semua yang saya dapat temukan tampaknya sangat tersebar.
user833970
1
@ user833970 hal-hal spesifik yang Anda inginkan untuk petunjuk? Saya khawatir sebenarnya tidak ada referensi yang mencakup semua untuk meta teori tipe dependen. Diskusi ini (yang menunjuk ke sini!) Mungkin berguna: github.com/FStarLang/FStar/issues/360
cody
terima kasih, saya sedang mengerjakan makalah paradoks Berardi sekarang, saya pikir itu akan menjernihkan kebingungan saya.
user833970
14

Bahkan jika Anda tidak tertarik untuk mengekstraksi program, fakta bahwa Propimpredikatif memungkinkan Anda membangun beberapa model yang tidak dapat Anda bangun menggunakan menara predikatif alam semesta. IIRC Thorsten Altenkirch memiliki model Sistem F menggunakan impredicativity Coq.

gallais
sumber