Inferenza dei tipi di perfezionamento


11

Al lavoro mi è stato assegnato il compito di dedurre alcune informazioni sul tipo di un linguaggio dinamico. Riscrivo sequenze di affermazioni in letespressioni nidificate , in questo modo:

return x; Z            =>  x
var x; Z               =>  let x = undefined in Z
x = y; Z               =>  let x = y in Z
if x then T else F; Z  =>  if x then { T; Z } else { F; Z }

Dal momento che sto partendo da informazioni di tipo generali e provando a dedurne tipi più specifici, la scelta naturale è quella dei tipi di perfezionamento. Ad esempio, l'operatore condizionale restituisce un'unione dei tipi dei suoi rami vero e falso. In casi semplici, funziona molto bene.

Mi sono imbattuto in un intoppo, tuttavia, quando ho cercato di inferire il tipo di quanto segue:

function g(f) {
  var x;
  x = f(3);
  return f(x);
}

Che viene riscritto in:

\f.
  let x = undefined in
    let x = f 3 in
      f x

HM e di conseguenza . Il tipo effettivo che voglio poter inferire è:g : ( I n tI n t ) I n tf:iontiontg:(iontiont)iont

g:τ1τ2.(iontτ1τ1τ2)τ2

Sto già usando dipendenze funzionali per risolvere il tipo di +operatore sovraccarico , quindi ho pensato che fosse una scelta naturale usarle per risolvere il tipo di fdentro g. Cioè, i tipi di fin tutte le sue applicazioni insieme determinano in modo univoco il tipo di g. Tuttavia, a quanto pare, i fundep non si prestano molto bene a numeri variabili di tipi di fonte.

Comunque, l'interazione tra polimorfismo e tipizzazione di raffinamento è problematica. Quindi c'è un approccio migliore che mi manca? Attualmente sto digerendo "Tipi di perfezionamento per ML" e apprezzerei più letteratura o altri suggerimenti.

programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

Risposte:


9

Ti sei imbattuto nel fatto che l'inferenza degli invarianti statici per le lingue di ordine superiore è abbastanza difficile in pratica, oltre ad essere indecidibile in teoria. Non sono sicuro di quale sia la risposta definitiva alla tua domanda, ma nota diverse cose:

  • I tipi di polimorfismo e raffinamento si comportano male insieme, come hai notato, in particolare si perde la nozione di tipo più generale. Una conseguenza di ciò è che le analisi basate sui tipi di raffinamento in presenza di polimorfismo potrebbero dover scegliere tra l'analisi dell'intero programma (al contrario dell'analisi compositiva) e l'uso dell'euristica per decidere quale tipo si desidera assegnare al proprio programma.

  • Esiste una forte relazione tra inferire i tipi di raffinamento e:

    1. Calcolo dell'interpretazione astratta del tuo programma

    2. Invarianti del ciclo di calcolo in un linguaggio imperativo.

Con questo in mente, ecco alcuni riferimenti disorganizzati sull'inferenza dei tipi di raffinamento. Si noti che ci sono molti tipi diversi di tipi di perfezionamento: tendo ad essere più interessato ai perfezionamenti dei tipi di dati induttivi, quindi questo elenco potrebbe essere distorto in quella direzione.

  1. Inizia con i classici: Interpretazione astratta relazionale di programmi funzionali di ordine superiore di Cousot & Cousot. Questo spiega come estendere l'interpretazione astratta ai programmi di ordine superiore usando la semantica relazionale.

  2. Tipi liquidi di Rhondon, Kawaguchi e Jhala. Questo è un lavoro molto evoluto, che combina HM e un tipo di perfezionamento del predicato per inferire le annotazioni di sicurezza (controlli di array array per esempio) per i programmi in stile ML. L'inferenza procede in 2 passaggi; il primo è l'inferenza HM delle annotazioni di tipo, che guidano la scelta dei perfezionamenti da eseguire.

  3. Dovrei probabilmente menzionare anche il lavoro di Fournet, Swarmy, Chen, Strub ... su , un'estensione di che sembra simile all'approccio dei tipi liquidi, ma con l'obiettivo di verificare protocolli e algoritmi crittografici per calcolo distribuito. Non sono sicuro di quanto lavoro pubblicato ci sia sull'inferenza delle annotazioni in questo caso.F #F*F#

  4. C'è un bel documento di Chin e Khoo sull'inferenza di un tipo specifico di tipi di perfezionamento: tipi con annotazioni di dimensioni.

  5. Il linguaggio di programmazione ATS è un sistema che consente vari perfezionamenti e fornisce servizi per scrivere programmi con essi. Tuttavia, le annotazioni possono essere arbitrariamente complesse (e quindi indecidibili) e pertanto potrebbero richiedere l'interazione dell'utente. Credo che ci sia una forma di inferenza per questi tipi, non sono sicuro quale articolo raccomandare comunque.

  6. Ultimo, ma non meno importante, l'algoritmo del prodotto cartesiano , di Ole Agesen. Pur non menzionando esplicitamente i tipi di perfezionamento, questo sembra essere il lavoro più vicino alla risoluzione del problema che sembra avere. Non fatevi ingannare dalla menzione del polimorfismo parametrico in astratto: guardano a inferire tipi concreti , che sono solo tuple di possibili tipi atomici. L'accento è posto sull'efficienza. Ti consiglio di leggere prima questo articolo per vedere se risolve il tuo problema.

λ

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.