CoC yang dikatakan puncak dari semua tiga dimensi dari Lambda Cube. Ini sama sekali tidak terlihat bagi saya. Saya pikir saya memahami dimensi individu, dan kombinasi dari dua tampaknya menghasilkan persatuan yang relatif mudah (mungkin saya kehilangan sesuatu?). Tapi ketika saya melihat CoC itu, bukan melihat seperti kombinasi dari ketiganya, sepertinya hal yang sama sekali berbeda. Dimensi manakah tipe, prop, dan tipe kecil / besar berasal? Ke mana produk-produk ketergantungan menghilang? Dan mengapa ada fokus pada proposisi dan bukti bukan jenis dan program? Adakah sesuatu yang setara yang berfokus pada jenis dan program?
Sunting: Jika tidak jelas, saya meminta penjelasan tentang bagaimana CoC setara dengan penyatuan langsung dimensi Lambda Cube. Dan apakah ada persatuan yang sebenarnya dari ketiganya di luar sana yang bisa saya pelajari (yaitu dalam hal program dan tipe, bukan bukti dan proposisi)? Ini sebagai tanggapan terhadap komentar pada pertanyaan, bukan untuk jawaban saat ini.
soft-question
. Saya tidak melihat pertanyaan teknis yang sebenarnya di sini. Mungkin Anda bisa sedikit lebih spesifik dengan apa yang Anda tanyakan?Jawaban:
Pertama, untuk mengulangi salah satu poin cody, Calculus of Inductive Constructions (yang menjadi dasar kernel Coq) sangat berbeda dari Calculus of Constructions. Paling baik dianggap sebagai mulai dari teori tipe Martin-Löf dengan alam semesta, dan kemudian menambahkan Prop semacam di bagian bawah hirarki jenis. Ini adalah binatang yang sangat berbeda dari CoC asli, yang dianggap terbaik sebagai versi dependen F-omega. (Misalnya, CiC memiliki model teori set dan CoC tidak.)
Yang mengatakan, lambda-cube (di mana CoC adalah anggota) biasanya disajikan sebagai sistem tipe murni karena alasan ekonomi dalam jumlah aturan pengetikan. Dengan memperlakukan jenis, jenis, dan istilah sebagai elemen dari kategori sintaksis yang sama, Anda dapat menuliskan lebih sedikit aturan dan bukti Anda menjadi sedikit lebih redundan juga.
Namun, untuk pemahaman, akan sangat membantu untuk memisahkan berbagai kategori secara eksplisit. Kita dapat memperkenalkan tiga kategori sintaksis, jenis (berkisar oleh metavariabel
k
), tipe (berkisar oleh metavariabelA
), dan istilah (berkisar oleh metavariabele
). Kemudian semua delapan sistem dapat dipahami sebagai variasi pada apa yang diizinkan pada masing-masing dari tiga tingkatan.λ → (Kalkulus lambda yang diketik sederhana)
Ini adalah dasar kalkulus lambda yang diketik. Ada satu jenis
∗
, yaitu jenis jenis. Tipe-tipe itu sendiri adalah tipe atomp
dan tipe fungsiA → B
. Istilah adalah variabel, abstraksi atau aplikasi.λω_ (STLC + operator jenis yang lebih tinggi)
STLC hanya mengizinkan abstraksi pada tingkat persyaratan. Jika kita menambahkannya pada level tipe, maka kita menambahkan tipe baru
k → k
yang merupakan tipe fungsi level-level, dan abstraksiλa:k.A
dan aplikasiA B
pada level tipe juga. Jadi sekarang kami tidak memiliki polimorfisme, tetapi kami memiliki operator tipe.Jika memori berfungsi, sistem ini tidak memiliki daya komputasi lebih dari STLC; itu hanya memberi Anda kemampuan untuk menyingkat jenis.
λ2 (Sistem F)
Alih-alih menambahkan operator tipe, kita bisa menambahkan polimorfisme. Pada level type, kami menambahkan
∀a:k. A
yang merupakan tipe mantan polymorphic, dan pada level term, kami menambahkan abstraksi atas tipeΛa:k. e
dan tipe aplikasie [A]
.Sistem ini jauh lebih kuat daripada STLC - ia sekuat aritmatika orde kedua.
λω (Sistem F-omega)
Jika kita memiliki operator tipe dan polimorfisme, kita mendapatkan F-omega. Sistem ini kurang lebih merupakan teori tipe kernel dari kebanyakan bahasa fungsional modern (seperti ML dan Haskell). Ini juga jauh lebih kuat daripada Sistem F - itu setara dalam kekuatan untuk aritmatika tingkat tinggi.
λP (LF)
Alih-alih polimorfisme, kita bisa pergi ke arah ketergantungan dari kalkulus lambda yang diketik sederhana. Jika Anda mengizinkan tipe fungsi untuk membiarkan argumennya digunakan dalam tipe kembali (yaitu, tulis
Πx:A. B(x)
bukanA → B
), maka Anda mendapatkan λP. Untuk membuat ini benar-benar berguna, kita harus memperluas rangkaian jenis dengan jenis operator jenis yang menggunakan istilah sebagai argumenΠx:A. k
, dan karenanya kita harus menambahkan abstraksiΛx:A.B
dan aplikasi yang sesuaiA [e]
di tingkat jenis juga.Sistem ini kadang-kadang disebut LF, atau Edinburgh Logical Framework.
Ia memiliki kekuatan komputasi yang sama dengan kalkulus lambda yang diketik sederhana.
λP2 (tidak ada nama khusus)
Kita juga bisa menambahkan polimorfisme ke λP, untuk mendapatkan λP2. Sistem ini tidak sering digunakan, sehingga tidak memiliki nama tertentu. (Satu makalah yang saya baca yang menggunakannya adalah Induksi Herman Geuvers ' Tidak Turun dalam Teori Tipe Ketergantungan Orde Kedua .)
Sistem ini memiliki kekuatan yang sama dengan Sistem F.
λPω_ (tidak ada nama khusus)
Kita juga bisa menambahkan operator tipe ke λP, untuk mendapatkan λPω_. Ini melibatkan penambahan jenis
Πa:k. k'
untuk operator tipe, dan abstraksi tingkatΛx:A.B
aplikasi dan tipe yang sesuaiA [e]
.Karena tidak ada lagi lompatan dalam kekuatan komputasi atas STLC, sistem ini juga harus membuat dasar yang bagus untuk kerangka kerja logis, tetapi tidak ada yang melakukannya.
λPω (Kalkulus Konstruksi)
Akhirnya, kita sampai ke λPω, Kalkulus Konstruksi, dengan mengambil λPω_ dan menambahkan jenis polimorfik sebelumnya
∀a:k.A
dan abstraksi level-termΛa:k. e
dan aplikasie [A]
untuk itu.Jenis-jenis sistem ini jauh lebih ekspresif daripada di F-omega, tetapi memiliki kekuatan komputasi yang sama.
sumber
Saya sering ingin mencoba dan merangkum setiap dimensi dari kubus dan apa yang mereka wakili, jadi saya akan mencoba yang ini.λ
Tetapi pertama-tama, seseorang mungkin harus mencoba untuk menguraikan berbagai masalah. Prover teorema interaktif Coq didasarkan pada teori tipe yang mendasarinya, kadang-kadang dengan penuh kasih disebut kalkulus konstruksi induktif dengan alam semesta . Anda akan perhatikan bahwa ini lebih dari sekadar “Kalkulus Konstruksi”, dan memang, ada lebih banyak hal di sana daripada hanya CoC. Secara khusus, saya pikir Anda bingung tentang fitur mana yang ada di CoC yang tepat. Secara khusus, pembedaan Set / Prop dan alam semesta tidak muncul dalam CoC.
Saya tidak akan memberikan gambaran lengkap tentang Sistem Jenis Murni di sini, tetapi aturan penting (untuk PTS fungsional seperti CoC) adalah sebagai berikut
di mana adalah elemen dari set tetap S dari macam , dan pasangan ( s , k ) adalah dalam satu set tetap R pasang S , yang disebut aturan .s,k S (s,k) R S
The wawasan penting adalah bahwa pilihan hati-hati dan R membuat perbedaan besar dalam apa jenis produk Π x : A . B sebenarnya mewakili!S R Πx:A.B
Secara khusus, dalam kalkulus konstruksi, himpunan macam adalah { ∗ , ◻ } Sering disebut Prop dan Tipe (meskipun terminologi ini agak membingungkan bagi pengguna Coq karena alasan saya akan bicarakan nanti), dan lengkap seperangkat aturan: R = { ( ∗ , ∗ ) , ( ◻ , ◻ ) , ( ◻ , ∗ ) , ( ∗ , ◻ ) }S
Dan jadi kami memiliki 4 aturan yang sesuai dengan 4 tujuan berbeda:
: Jenis fungsi(∗,∗)
Saya akan menjelaskan masing-masing lebih terinci.
Ketik keluarga : ini memberikan Anda kemampuan untuk berbicara tentang familly sendiri, memang sebagai istilah juga diketik l i s t : * → * , bukan hanya contoh l i s t n al i s t l i s t :*→* l i s tn a t, L i s tb o o l ∗ → ∗ ( □ , □ )
Jenis dependen : Ini adalah bagaimana Anda mendapatkan proposisi-sebagai-jenis0=1
Aturan apa yang kita inginkan untuk ini? Satu aturan alami adalah(□i,□i)
Dengan jenis dan aturan ekstra ini, Anda mendapatkan sesuatu yang bukan PTS, tetapi sesuatu yang dekat. Ini adalah (hampir) Kalkulus Konstruksi yang Diperluas , yang lebih dekat dengan basis Coq. Bagian besar yang hilang di sini adalah tipe induktif, yang tidak akan saya bahas di sini.
Sunting: Ada referensi yang agak bagus yang menggambarkan berbagai fitur bahasa pemrograman dalam kerangka PTS, dengan menjelaskan PTS yang merupakan kandidat yang baik untuk representasi perantara dari bahasa pemrograman fungsional:
Henk: Bahasa Antara yang Diketik , SP Jones & E. Meijer.
sumber