Tipi dipendenti vs tipi di perfezionamento


58

Qualcuno potrebbe spiegare la differenza tra tipi dipendenti e tipi di perfezionamento? A quanto ho capito, un tipo di perfezionamento contiene tutti i valori di un tipo che soddisfano un predicato. Esiste una caratteristica di tipi dipendenti che li distingue?

Se aiuta, mi sono imbattuto in tipi raffinati tramite il progetto Liquid Haskell e tipi dipendenti tramite Coq e Agda. Detto questo, sto cercando una spiegazione di come le teorie differiscono.

Risposte:


33

Le differenze principali riguardano due dimensioni: nella teoria di base e nel modo in cui possono essere utilizzate. Concentriamoci solo su quest'ultimo.

Come utente, la "logica" delle specifiche in LiquidHaskell e nei sistemi di tipo di raffinamento in generale, è limitata ai frammenti decidibili in modo che la verifica (e inferenza) sia completamente automatica, il che significa che non sono necessari "termini di prova" del tipo necessario per intero impostazione dipendente. Ciò porta a un'automazione significativa. Ad esempio, confronta l'ordinamento per inserzione in LH:

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

vs. in Idris

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

Tuttavia, l'automazione ha un prezzo. Non si possono usare funzioni arbitrarie come specifiche come si può nel mondo completamente dipendente, il che limita la classe di proprietà che si possono scrivere.

Pertanto, un obiettivo dei sistemi di raffinamento è quello di estendere la classe di ciò che può essere specificato, mentre quello dei sistemi completamente dipendenti è quello di automatizzare ciò che può essere provato. Forse c'è un terreno di incontro felice dove possiamo ottenere il meglio da entrambi i mondi!


Esiste un modo per mappare in qualche modo meccanicamente dalle specifiche basate sul tipo di perfezionamento alle specifiche basate sul tipo dipendente? O tale "isomorfismo" non è ancora stato studiato abbastanza?
Erik Allik,

1
Un simile "isomorfismo" di AFAIK non è stato studiato molto. C'è qualche lavoro recente, vedi: "Formalizzare i tipi di perfezionamento semplici in Coq" di Lehmann e Tanter (che apparirà presto ... ecco un repository GH: github.com/pleiad/Refinements )
Ranjit Jhala

Che ne dite di tipi dipendenti dal percorso in Scala?
Yang Bo,

1
@RanjitJhala Penso che tu abbia accidentalmente raggiunto i tuoi obiettivi nell'ultimo paragrafo nel modo sbagliato?
Noldorin,

1
@Noldorin Direi che Ranjit ha capito bene il suo ultimo paragrafo. "tipo di raffinamento ... limitato a frammenti decidibili in modo che la verifica (e inferenza) sia completamente automatica" vs "termini di prova ... necessari in ... tipi [dipendenti]". Quindi le persone che lavorano in tipi di raffinamento stanno cercando di estendere quanto può essere specificato in un tipo di raffinamento mentre sono comunque automaticamente inferibili / verificabili, mentre quelli che lavorano in tipi dipendenti stanno cercando di automatizzare la generazione di termini di prova.
Raiph,

22

TPT

{v:T|P(v)}
T

{X:T1T2|P}

Il sistema Liquid Type, descritto in [1] è effettivamente decidibile e Liquid Haskell utilizza solutori SMT. Tuttavia, Liquid Haskell richiede anche termini di prova (o valori, come quelli chiamati in un linguaggio tipicamente non dipendente): se ti siedi per scrivere un programma Liquid Haskell, scrivi le tue funzioni, non solo i tipi.

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


1
sigma può essere codificato con pi usando una codifica simile a una chiesa, ma i tipi di funzione di raffinamento di haskell del liquido AFAIK non sono tipi di pi (funzione dipendente).
fread2281,

15

I tipi dipendenti sono tipi che dipendono dai valori in alcun modo. Un classico esempio è "il tipo di vettori di lunghezza n", dove nè un valore. I tipi di perfezionamento, come dici nella domanda, sono costituiti da tutti i valori di un determinato tipo che soddisfano un dato predicato. Ad esempio il tipo di numeri positivi. Questi concetti non sono particolarmente correlati (di cui sono a conoscenza). Ovviamente, puoi anche ragionevolmente avere tipi di raffinamento dipendenti, come "tipo di tutti i numeri maggiori di n".


3
Uno è un sottoinsieme dell'altro? I tipi di perfezionamento sembrano essere risolvibili con SMT, ma i tipi dipendenti richiedono i propri termini di prova ...
jmite,

4
"L'uno è un sottoinsieme dell'altro?" No. Ecco perché ho fornito gli esempi di un tipo di perfezionamento che non è dipendente e di un tipo dipendente che non è un perfezionamento.
Alexey Romanov,

8
i tipi di raffinamento non possono essere codificati con sigma?
fread2281,

3
Il tuo esempio non sembra dimostrare il tuo punto. I numeri positivi sono definiti come quei numeri maggiori di 0. Questo non significa che "il tipo di numeri positivi" è precisamente "il tipo di tutti i numeri maggiori di 0"?
Akk

2
Non è possibile che esista un predicato di perfezionamento che imponga anche la lunghezza del vettore?
CMCDragonkai,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.