Apakah ada cara untuk membuktikan teorema berikut dalam Coq?
Theorem bool_pirrel : forall (b : bool) (p1 p2 : b = true), p1 = p2.
EDIT : Upaya memberikan penjelasan singkat untuk "apa bukti tidak relevan" (koreksi saya seseorang jika saya salah atau tidak akurat)
Gagasan dasarnya adalah bahwa dalam dunia proposisi (atau Prop
semacamnya dalam Coq), yang benar-benar Anda (dan Anda harus) pedulikan adalah provabilitas proposisi, bukan buktinya, mungkin ada banyak (atau tidak ada). Jika Anda memiliki banyak bukti, dari sudut pandang provabilitas, mereka sama dalam arti bahwa mereka membuktikan proposisi yang sama . Jadi perbedaan mereka tidak relevan. Ini berbeda dari sudut pandang komputasi di mana Anda benar-benar peduli tentang perbedaan dua istilah, misalnya, pada dasarnya, Anda tidak ingin dua penghuni bool
jenis (atau Set
dalam kata-kata Coq), yaitu true
dan false
menjadi sama. Tetapi jika Anda memasukkannya Prop
, mereka diperlakukan sama.
Jawaban:
Bukti tidak relevan secara umum tidak tersirat oleh teori di balik Coq. Bahkan bukti yang tidak relevan untuk kesetaraan tidak tersirat; itu setara dengan Streicher ini aksioma K . Keduanya bisa ditambahkan sebagai aksioma .
Ada perkembangan di mana berguna untuk alasan tentang objek bukti, dan bukti tidak relevan membuat ini hampir mustahil. Bisa dibilang perkembangan ini harus memiliki semua objek yang strukturnya disusun kembali
Set
, tetapi dengan teori Coq dasar kemungkinan ada di sana.Ada subkumpulan bukti penting yang tidak relevan yang selalu berlaku. Aksioma Streicher K selalu berpegang pada domain yang dapat didekati, yaitu bukti kesetaraan pada set yang dapat ditentukan adalah unik. Bukti umum ada di
Eqdep_dec
modul di perpustakaan standar Coq. Inilah teorema Anda sebagai akibat wajar (bukti saya di sini belum tentu paling elegan):Untuk kasus khusus ini, inilah bukti langsung (terinspirasi oleh bukti umum
Eqdep_dec.v
). Pertama, definisikan kita mendefinisikan bukti kanoniktrue=b
(seperti biasa dalam Coq, lebih mudah untuk memiliki konstanta pertama). Kemudian kami menunjukkan bahwa setiap buktitrue=b
harusrefl_equal true
.Jika Anda menambahkan logika klasik ke Coq, Anda mendapatkan bukti yang tidak relevan. Secara intuitif, logika klasik memberi Anda oracle keputusan untuk proposisi, dan itu cukup baik untuk aksioma K. Ada bukti dalam modul perpustakaan standar Coq
Classical_Prop
.sumber