Quali sono i sistemi di tipo noto più forti per i quali l'inferenza è decidibile?


22

È risaputo che l'inferenza di tipo Hindley-Milner (il semplice -calculus con polimorfismo) ha un'inferenza di tipo decidibile: è possibile ricostruire i tipi di principio per qualsiasi programma senza alcuna annotazione.λ

L'aggiunta di caratteri tipografici in stile Haskell sembra preservare questa decidibilità, ma ulteriori aggiunte rendono indecidibile l'inferenza senza annotazioni (famiglie di tipi, GADT, tipi dipendenti, tipi N, Sistema , ecc.)ω

Mi chiedo: quali sono i sistemi di tipo più potenti conosciuti con inferenza completamente decidibile? Si troverà a metà strada tra Hindley-Milner (completamente decidibile) e tipi dipendenti (completamente indecidibile). Ci sono aspetti dei DT che possono essere aggiunti per preservare la decidibilità dell'inferenza? Quali ricerche sono state fatte per vedere fino a che punto può essere spinto?

Mi rendo conto che non esiste un singolo sistema più forte, che probabilmente ci sono infiniti piccoli cambiamenti incrementali che possono essere aggiunti a HM mantenendo l'inferenza. Ma ci sono probabilmente alcuni candidati pratici di sistemi che sono stati scoperti.

Modifica: dato che non esiste un sistema "più forte", accetterò una risposta che delinei i sistemi notevoli che estendono Hindley Milner con inferenza decidibile. Esempi potrebbero essere Tipi di liquidi, Rango 2, ecc.


4
@jmite Sono d'accordo con gli altri qui. Non c'è davvero alcun confine noto chiaro. Dubito che ci possa essere. L'inferenza del tipo di decidibilità dipende in realtà da tutte le funzionalità della lingua, ad esempio se hai il sottotipo o no. Un limite netto può essere trovato nelle estensioni di HM con tipi di livello superiore dove sappiamo: per il rango k> 2, l'inferenza di tipo è indecidibile, altrimenti è decidibile.
Martin Berger,

@MartinBerger Accetto che non ci sia il più forte, ma penso che ci sia ancora una buona risposta da delineare quelle degne di nota, come il Rango 2 di cui parli.
jmite,

1
@jmite Sarebbe bello avere un compendio di decidibilità per l'inferenza del tipo. Non esiste nulla del genere, è purtroppo tutto distribuito su centinaia di documenti. Forse puoi scriverne uno, sarebbe un ottimo servizio per la comunità.
Martin Berger,

Mi sembra che scrivere una risposta alla domanda possa essere difficile, ma certamente il recente lavoro sull'inferenza del tipo di Didier Rémy (insieme ai suoi riferimenti) potrebbe interessare l'interrogatore.
ejgallego,

Risposte:


2

[EDIT: Voilà qualche parola su ciascuno]

Esistono diversi modi per estendere l'inferenza del tipo HM. La mia risposta si basa su molti, più o meno riusciti, tentativi di attuazione di alcuni di essi. Il primo su cui mi sono imbattuto è il polimorfismo parametrico . I sistemi di tipo che cercano di estendere l'HM in questa direzione tendono verso il Sistema F e quindi richiedono annotazioni di tipo. Due estensioni notevoli in questa direzione in cui mi sono imbattuto sono:

  • HMF, consente l'inferenza di tipo per tutti i tipi di System-F, il che significa che è possibile avere una quantificazione universale "nel mezzo" di un tipo, il loro aspetto non è implicitamente situato nell'ambito più elevato come per i tipi polimorfici di HM. Il documento afferma chiaramente che non esiste una regola chiara su quante e dove potrebbero essere necessarie le annotazioni dei tipi. Anche i tipi sono quelli del Sistema F, i termini di solito non hanno un tipo principale.

  • MLF non è solo un'estensione di HM, ma è anche un'estensione del Sistema F che riacquista la proprietà del tipo principale di HM introducendo una sorta di quantificazione limitata sui tipi. Un confronto è stato fatto dagli autori, MLF è strettamente più potente di HMF e le annotazioni sono necessarie solo per i parametri utilizzati polimorficamente.

Un altro modo di estendere HM è attraverso la variazione del dominio del vincolo.

  • HM (X) è Hindley-Milner parametrizzato su un dominio di vincolo X. In questo approccio, l'algoritmo HM genera i vincoli inviati a un risolutore di domini per X. Per il solito HM, il risolutore di domini è la procedura di unificazione e il dominio è costituito dell'insieme di termini compilato dai tipi e dalle variabili di tipo.
    Un altro esempio di X potrebbe essere i vincoli espressi nella lingua dell'aritmetica di Presburger (nel qual caso l'inferenza / controllo del tipo è decidibile) o nella lingua dell'aritmetica di Peano (non più decidibile). X varia secondo uno spettro di teorie, ognuna con i propri requisiti per quanto riguarda la quantità e la localizzazione delle annotazioni dei tipi necessarie e che vanno dal non affatto a tutte.

  • Le classi di tipi di Haskell sono anche una sorta di estensione del dominio del vincolo aggiungendo predicati di tipo del modulo MyClass(MyType)(nel senso che esiste un'istanza di MyClass per il tipo MyType).
    Le classi di tipi conservano l'inferenza di tipo perché sono fondamentalmente concetti (quasi) ortogonali che implementano il polimorfismo ad hoc .
    Ad esempio, prendi un simbolo valdi tipo val :: MyClass a => aper il quale puoi avere istanze MyClass A, MyClass Becc. Quando fai riferimento a quel simbolo nel tuo codice, è in realtà perché l'inferenza del tipo è già eseguita che il compilatore può inferire quale istanza della classe usare. Ciò significa che il tipo di valdipende dal contesto in cui viene utilizzato. Questo è anche il motivo per cui l'esecuzione di una singola valistruzione porta a unambiguous type error : il compilatore non può inferire alcun tipo in base al contesto.

Per sistemi di tipo più avanzati come GADT, famiglie di tipi, tipi dipendenti, Sistema (F) ω, ecc., I tipi non sono più "tipi", ma diventano oggetti computazionali complessi. Ad esempio, significa che due tipi che non sembrano uguali non sono necessariamente diversi. Quindi l'uguaglianza dei tipi non diventa affatto banale (per niente).

Per darvi un esempio della complessità effettiva, consideriamo il tipo di elenco dipendente: NList a ndove si atrova il tipo di oggetti nell'elenco e la nsua lunghezza.
La funzione append avrebbe tipo append :: NList a n -> NList a m -> NList a (n + m)e la funzione zip sarebbe zip :: NList a n -> NList b n -> NList (a, b) n.
Immagina ora di avere la lambda \a: NList t n, b: NList t m -> zip (append a b) (append b a). Qui il primo argomento di zip è di tipo NList t (n + m)e il secondo di tipo NList t (m + n).
Quasi lo stesso, ma a meno che il verificatore del tipo non sappia che "+" commuta su numeri naturali, deve rifiutare la funzione perché (n + m) non è letteralmente (m + n). Non si tratta più di inferenza / verifica del tipo, ma di dimostrazione del teorema.

I tipi liquidi sembrano fare un'inferenza di tipo dipendente. Ma a quanto ho capito, non è un tipo realmente dipendente, più qualcosa come i soliti tipi HM su cui viene fatta un'inferenza aggiuntiva per calcolare i limiti statici.

Spero che aiuti.

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.