Jenis dependen vs tipe penyempurnaan

58

Bisakah seseorang menjelaskan perbedaan antara tipe dependen dan tipe perbaikan? Seperti yang saya pahami, tipe penyempurnaan berisi semua nilai dari tipe yang memenuhi predikat. Apakah ada fitur tipe dependen yang membedakannya?

Jika itu membantu, saya menemukan tipe Refined melalui proyek Liquid Haskell, dan tipe dependen via Coq dan Agda. Yang mengatakan, saya sedang mencari penjelasan tentang bagaimana teori berbeda.

Ya ampun
sumber

Jawaban:

33

Perbedaan utama ada di sepanjang dua dimensi - dalam teori yang mendasarinya, dan bagaimana mereka dapat digunakan. Mari kita fokus pada yang terakhir.

Sebagai pengguna, "logika" spesifikasi di LiquidHaskell dan sistem penyempurnaan umumnya, dibatasi untuk fragmen yang dapat diurai sehingga verifikasi (dan inferensi) sepenuhnya otomatis, artinya seseorang tidak memerlukan "syarat bukti" dari jenis yang diperlukan secara penuh. pengaturan tergantung. Ini mengarah pada otomatisasi yang signifikan. Misalnya, bandingkan jenis penyisipan di LH:

http://ucsd-progsys.github.io/lh-workshop/04-case-study-insertsort.html#/ordered-lists

vs. di Idris

https://github.com/davidfstr/idris-insertion-sort/blob/master/InsertionSort.idr

Namun, otomasi harganya mahal. Seseorang tidak dapat menggunakan fungsi sewenang-wenang sebagai spesifikasi seperti yang dapat dilakukan di dunia yang sepenuhnya tergantung, yang membatasi kelas properti yang dapat ditulis.

Dengan demikian, salah satu tujuan dari sistem penyempurnaan adalah untuk memperluas kelas dari apa yang dapat ditentukan, sedangkan tujuan dari sistem yang sepenuhnya tergantung adalah untuk mengotomatisasi apa yang dapat dibuktikan. Mungkin ada tempat pertemuan yang menyenangkan di mana kita bisa mendapatkan yang terbaik dari kedua dunia!

Ranjit Jhala
sumber
Apakah ada cara untuk memetakan secara mekanis dari spesifikasi berbasis tipe penyempurnaan menjadi spesifikasi berbasis tipe dependen? Atau apakah "isomorfisme" semacam itu belum cukup dipelajari?
Erik Allik
1
AFAIK "isomorfisme" semacam itu belum banyak dipelajari. Namun ada beberapa karya terbaru, lihat: "Memformalkan Jenis Perbaikan Sederhana dalam Coq" oleh Lehmann dan Tanter (yang akan segera muncul ... inilah repo GH: github.com/pleiad/Refinements )
Ranjit Jhala
Bagaimana dengan tipe path-dependent di Scala?
Yang Bo
1
@RanjitJhala Saya pikir Anda secara tidak sengaja mendapatkan tujuan Anda di paragraf terakhir dengan cara yang salah?
Noldorin
1
@Noldorin saya akan mengatakan Ranjit benar paragraf terakhirnya. "tipe penyempitan ... terbatas pada fragmen yang dapat ditentukan sehingga verifikasi (dan inferensi) sepenuhnya otomatis" vs "istilah bukti ... diperlukan dalam ... [tipe] yang bergantung". Jadi orang-orang yang bekerja dalam jenis penyempurnaan mencoba untuk memperluas berapa banyak yang dapat ditentukan dalam jenis penyempurnaan sementara masih secara otomatis dapat disimpulkan / diverifikasi, sementara mereka yang bekerja dalam jenis penyempurnaan mencoba untuk mengotomatisasi pembuatan istilah bukti.
raiph
22

Jenis perbaikan adalah jenis yang biasa dengan predikat. Yaitu, mengingat bahwa adalah tipe yang biasa dan adalah beberapa predikat padaTPT

{v:TP(v)}
adalah jenis penyempurnaan. dalam hal ini disebut tipe dasar .T

AFAIK, dalam Liquid Haskell, mereka juga memungkinkan beberapa tipe fungsi dependend , yaitu tipe [1]. Perhatikan bahwa tipe yang sepenuhnya tergantung (seperti tipe sigma) tidak diizinkan.{x:T1T2P}

Sistem Jenis Cairan, yang dijelaskan dalam [1] memang dapat dipilih dan Cairan Haskell memang menggunakan pemecah SMT. Namun, Liquid Haskell juga membutuhkan istilah bukti (atau nilai-nilai, seperti yang disebut dalam bahasa yang diketik tidak tergantung): jika Anda duduk untuk menulis program Liquid Haskell, Anda menulis fungsi Anda sendiri, bukan hanya jenis.

[1] http://goto.ucsd.edu/~rjhala/liquid/liquid_types.pdf

Daniil
sumber
1
sigma dapat dikodekan dengan pi menggunakan pengkodean seperti gereja, tetapi jenis fungsi penyempurnaan AFAIK liquid haskell bukanlah tipe pi (fungsi dependen).
fread2281
15

Tipe dependen adalah tipe yang bergantung pada nilai dengan cara apa pun. Contoh klasik adalah "jenis vektor panjang n", di mana nnilainya. Jenis perbaikan, seperti yang Anda katakan dalam pertanyaan, terdiri dari semua nilai dari jenis tertentu yang memenuhi predikat tertentu. Misalnya jenis angka positif. Konsep-konsep ini tidak terlalu terkait (yang saya tahu). Tentu saja, Anda juga dapat memiliki jenis penyempitan yang cukup beralasan, seperti "jenis semua angka yang lebih besar dari n".

Alexey Romanov
sumber
3
Apakah satu bagian dari yang lain? Jenis penyempitan tampaknya dapat diselesaikan dengan menggunakan SMT, tetapi jenis dependen memerlukan syarat bukti Anda sendiri ...
jmite
4
"Apakah satu bagian dari yang lain?" Tidak. Itu sebabnya saya memberikan contoh tipe penyempitan yang tidak tergantung dan tipe dependen yang bukan penyempurnaan.
Alexey Romanov
8
tidak dapatkah jenis penyempurnaan dikodekan dengan sigma?
fread2281
3
Contoh Anda sepertinya tidak menunjukkan maksud Anda. Angka-angka positif didefinisikan sebagai angka-angka yang lebih besar dari 0. Apakah ini tidak berarti bahwa "tipe angka positif" adalah "tipe semua angka yang lebih besar dari 0"?
akdom
2
Apakah tidak mungkin untuk ada predikat perbaikan yang memberlakukan panjang vektor juga?
CMCDragonkai