Залежні типи від типів уточнення


57

Чи може хтось пояснити різницю між залежними типами та типами уточнення? Як я розумію, тип уточнення містить усі значення типу, що виконують присудок. Чи є особливість залежних типів, яка їх відрізняє?

Якщо це допомагає, я натрапив на вдосконалені типи через проект Liquid Haskell, та залежні типи через Coq та Agda. Однак, я шукаю пояснення того, як відрізняються теорії.

Відповіді:


33

Основні відмінності полягають у двох вимірах - в базовій теорії та в тому, як вони можуть бути використані. Давайте просто зосередимося на останньому.

Як користувач, "логіка" специфікацій у системах типу LiquidHaskell та вдосконалення обмежується обмежуваними фрагментами, щоб перевірка (і умовивід) була повністю автоматичною, тобто не потрібно "доказів" такого типу, необхідних у повному обсязі. залежна установка. Це призводить до значної автоматизації. Наприклад, порівняйте сортування вставки в LH:

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

проти Ідріса

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

Однак автоматика приходить за ціною. Не можна використовувати довільні функції в якості специфікацій, як це можна в повністю залежному світі, що обмежує клас властивостей, які можна записати.

Таким чином, однією метою систем удосконалення є розширення класу того, що можна вказати, тоді як цілком залежних систем - автоматизувати те, що можна довести. Можливо, є щасливий майданчик для зустрічей, де ми зможемо отримати найкраще з обох світів!


Чи є спосіб якось механічно зіставити зі специфікацій, що базуються на уточненні, до специфікації на основі залежного типу? Або такий «ізоморфізм» ще недостатньо вивчений?
Ерік Аллік

1
AFAIK такий "ізоморфізм" мало вивчений. Однак є деяка нещодавня робота: див. "Формування простих типів уточнення в Coq" Леманна і Тантера (яка з'явиться незабаром ... ось репортаж GH: github.com/pleiad/Refinments )
Ранджіт Джала

Як щодо типів, залежних від шляху в Scala?
Ян Бо

1
@RanjitJhala Я думаю, ви випадково поставили свої цілі в останньому абзаці неправильно?
Нолдорін

1
@Noldorin Я б сказав, що Ранджіт отримав свій останній абзац правильно. "тип уточнення ... обмежується фрагментами, що визначаються, щоб перевірка (і умовивід) була повністю автоматичною" проти "термінів доказування ... потрібних у ... залежних [типах]". Таким чином, люди, що працюють у типах уточнення, намагаються розширити, скільки можна вказати у вдосконалювальному типі, залишаючись автоматично непереборними / перевіреними, тоді як ті, хто працює у залежних типах, намагаються автоматизувати генерацію термінів підтвердження.
raiph

22

TPT

{v:TP(v)}
T

{x:T1T2P}

Система рідкого типу, описана в [1], дійсно рішуча, і рідкий Haskell використовує розв'язувачі SMT. Однак Liquid Haskell також вимагає термінів підтвердження (або значень, як вони називаються мовою, що не залежить від тексту): якщо ви сідаєте написати програму Liquid Haskell, ви пишете власні функції, а не лише типи.

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


1
sigma може бути кодована pi за допомогою церковного кодування, але типи функцій уточнення AFAIK рідкого haskell - це не pi (залежна функція).
fread2281

15

Залежні типи - це типи, які залежать від значень будь-яким чином. Класичний приклад - "тип векторів довжини n", де nє значення. Види уточнення, як ви говорите в запитанні, складаються з усіх значень даного типу, які задовольняють даному предикату. Наприклад, тип додатних чисел. Ці поняття не особливо пов'язані (що я знаю). Звичайно, ви також можете мати залежні типи уточнення, наприклад "тип усіх чисел більше n".


3
Чи є одна підмножина іншої? Типи уточнень, здається, можна вирішити за допомогою SMT, але залежні типи вимагають власних умов підтвердження ...
jmite

4
"Чи є одна підмножина іншої?" Ні. Тому я наводив приклади уточнюючого типу, який не є залежним, і залежного типу, який не є уточненням.
Олексій Романов

8
не можна типи уточнення кодувати сигмою?
fread2281

3
Схоже, ваш приклад не демонструє вашої точки зору. Позитивні числа визначаються як ті числа, що перевищують 0. Чи це не означає, що "тип додатних чисел" є саме "типом усіх чисел, більшим за 0"?
akdom

2
Чи не можливо, що існує предикат уточнення, який також виконує довжину вектора?
CMCDragonkai
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.