Bağımlı tipler ve arıtma tipleri


57

Birileri bağımlı tipler ile arıtma tipleri arasındaki farkı açıklayabilir mi? Anladığım kadarıyla bir geliştirme türü, bir yüklemeyi yerine getiren bir türün tüm değerlerini içerir. Onları ayıran bağımlı türlerin bir özelliği var mı?

Eğer yardımcı olursa, Liquid Haskell projesi ile Rafine tiplerine ve Coq ve Agda üzerinden bağımlı tiplere rastladım. Bu, teorilerin nasıl değiştiğine dair bir açıklama arıyorum.

Yanıtlar:


33

Temel farklar iki boyut boyuncadır - temel teoride ve nasıl kullanılabilecekleri. Sadece ikincisine odaklanalım.

Bir kullanıcı olarak, genel olarak LiquidHaskell ve arıtma tipi sistemlerindeki spesifikasyonların "mantığı", onaylanabilir fragmanlarla sınırlandırılmıştır, böylece doğrulama (ve sonuç) tamamen otomatiktir, yani tam olarak ihtiyaç duyulan türün "ispat terimlerini" gerektirmez. bağımlı ayar. Bu önemli otomasyona yol açar. Örneğin, LH’deki ekleme düzenini karşılaştırın:

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

İdris'e karşı

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

Ancak, otomasyonun bir bedeli var. Kişi, tamamen bağımlı olan dünyada yazabileceği özellikler sınıfını kısıtlayan, özellikler gibi keyfi işlevleri kullanamaz.

Bu nedenle, arıtma sistemlerinin bir amacı belirtilenin sınıfını genişletmek , tamamen bağımlı sistemlerin ise kanıtlanabilecekleri otomatikleştirmektir . Belki de her iki dünyanın en iyisini alabileceğimiz mutlu bir buluşma alanı var!


Bir şekilde mekanik iyileştirme tipine dayalı özelliklerden bağımlı tip esaslı özelliklere kadar mekanik bir eşleme yapmanın bir yolu var mı? Yoksa böyle bir "izomorfizm" henüz yeterince çalışılmamış mı?
Erik Allik

1
AFAIK böyle bir "izomorfizm" çok çalışılmamıştır. Yine de bazı yeni çalışmalar var, bakınız: Lehmann ve Tanter'in "Yakında Basit Arıtma Tiplerini Biçimlendirmek" konusuna bakın (yakında görünecektir ... işte bir GH repo: github.com/pleiad/Refinements )
Ranjit Jhala

Scala'da yola bağlı türler nasıl?
Yang Bo,

1
@RanjitJhala Son paragrafta yanlışlıkla yanlış bir şekilde hedeflerinizi aldınız mı?
Noldorin

1
@Noldorin, Ranjit'in son paragrafını doğru aldığını söyleyebilirim. "arıtma türü ... doğrulanabilir parçalarla sınırlıdır, böylece doğrulama (ve çıkarım) tamamen otomatiktir" vs "... [tür] 'de gerekli olan kanıt koşulları ...". Bu nedenle, rafine tiplerinde çalışan halk, bir rafine tipinde ne kadarının otomatik olarak çıkarılabilir / doğrulanabilirken tanımlanabileceğini, bağımlı tiplerde çalışan kişiler ise ispat terimlerinin oluşturulmasını otomatikleştirmeye çalışırken genişletmeye çalışıyor.
raiph

22

Arıtma türleri, basitçe, öngörüleri içeren normal türlerdir. Yani göz önüne alındığında bir olağan türüdür ve bazı yüklem olduğuP TTPT

T

{v:TP(v)}
bir ayrıntılandırma türüdür. Bu durumda bir baz tipi olarak adlandırılır .T

AFAIK, Liquid Haskell'de, bazı bağımlı işlev türlerine de izin veriyorlar ; bu, [1] . Tamamen bağımlı tiplere (sigma tipleri gibi) izin verilmediğine dikkat edin.{x:T1T2P}

[1] 'de tarif edilen Sıvı Tip sistemi gerçekten kesindir ve Sıvı Haskell SMT çözücüleri kullanır. Bununla birlikte, Sıvı Haskell ayrıca ispat terimleri (ya da bağımlı olmayan şekilde yazılan bir dilde adlandırıldığı gibi değerler) de gerektirir: Bir Sıvı Haskell programı yazmak için oturuyorsanız, sadece türlerini değil kendi işlevlerinizi de yazarsınız.

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


1
sigma, kilise benzeri bir kodlama kullanarak pi ile kodlanabilir, ancak AFAIK sıvı haskell'in rafine etme fonksiyonu tipleri, pi (bağımlı fonksiyon) tipleri değildir.
fread2281

15

Bağımlı türler, herhangi bir şekilde değerlere bağlı türlerdir. Klasik bir örnek, "uzunluk vektörlerinin türü" dür n, burada nbir değerdir. Arıtımda, soruda söylediğiniz gibi, belirli bir yüklemeyi karşılayan belirli bir türdeki tüm değerlerden oluşur. Pozitif sayılar türü. Bu kavramlar özellikle (bildiğim kadarıyla) ilişkili değil. Tabii ki, ayrıca "büyük olan tüm sayıların türü" gibi bağımlılık arıtma türlerine de sahip olabilirsiniz n.


3
Biri diğerinin altkümesi mi? Arıtma tipleri, SMT kullanılarak çözülebilir gibi görünmektedir, ancak bağımlı türler kendi ispat terimlerinizi gerektirmektedir ...
jmite

4
"Biri diğerinin alt kümesi mi?" Hayır. Bu yüzden bağımlı olmayan bir arıtma tipi ve bir de arıtma olmayan bir bağımlı tip örneği verdim.
Alexey Romanov

8
arıtma türleri sigma ile kodlanamıyor mu?
fread2281

3
Örneğin amacını göstermiyor gibi görünüyor. Pozitif sayılar, 0'dan büyük sayılar olarak tanımlanır . Bu, "pozitif sayılar türünün" tam olarak "tüm sayılar türünden" olduğu anlamına gelmez 0mi?
akdom,

2
Vektörün uzunluğunu da uygulayan bir ayrıntılandırma öngörüsü olması mümkün değil mi?
CMCDragonkai
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.