Inferindo tipos de refinamento


11

No trabalho, fui encarregado de deduzir algumas informações de tipo sobre uma linguagem dinâmica. Reescrevo seqüências de instruções em letexpressões aninhadas , da seguinte maneira:

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 }

Como estou começando com informações gerais sobre tipos e tentando deduzir tipos mais específicos, a escolha natural são os tipos de refinamento. Por exemplo, o operador condicional retorna uma união dos tipos de suas ramificações verdadeiras e falsas. Em casos simples, funciona muito bem.

No entanto, encontrei um problema ao tentar inferir o tipo do seguinte:

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

Que é reescrito para:

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

O HM inferiria e, consequentemente, . O tipo real que eu quero poder deduzir é:f:EuntEuntg:(EuntEunt)Eunt

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

Eu já estou usando dependências funcionais para resolver o tipo de +operador sobrecarregado , então achei que era uma escolha natural usá-las para resolver o tipo de fdentro g. Ou seja, os tipos de fem todas as suas aplicações juntos determinam exclusivamente o tipo de g. Entretanto, os fundeps não se prestam muito bem a números variáveis ​​de tipos de fontes.

De qualquer forma, a interação do polimorfismo e da digitação de refinamento é problemática. Então, há uma abordagem melhor que estou perdendo? Atualmente, estou digerindo "Tipos de refinamento para ML" e gostaria de receber mais literatura ou outras dicas.

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 

Respostas:


9

Você tropeçou no fato de que a inferência de invariantes estáticos para linguagens de ordem superior é bastante difícil na prática, além de ser indecidível na teoria. Não sei ao certo qual é a resposta definitiva para sua pergunta, mas observe várias coisas:

  • Os tipos de polimorfismo e refinamento se comportam mal juntos, como você observou, em particular a noção de tipo mais geral é perdida. Uma conseqüência disso é que as análises baseadas em tipos de refinamento na presença de polimorfismo podem precisar escolher entre a análise de todo o programa (em oposição à análise composicional) e o uso de heurísticas para decidir qual tipo você deseja atribuir ao seu programa.

  • Existe uma forte relação entre inferir tipos de refinamento e:

    1. Computando a interpretação abstrata do seu programa

    2. Invariantes de loop de computação em uma linguagem imperativa.

Com isso em mente, aqui estão algumas referências desorganizadas sobre a inferência de tipos de refinamento. Observe que existem muitos tipos diferentes de refinamentos: eu tendem a estar mais interessados ​​em refinamentos de tipos de dados indutivos; portanto, essa lista pode ser inclinada nessa direção.

  1. Comece com os clássicos: Interpretação abstrata relacional de programas funcionais de ordem superior da Cousot & Cousot. Isso explica como estender a interpretação abstrata para programas de ordem superior usando a semântica relacional.

  2. Tipos de líquidos por Rhondon, Kawaguchi e Jhala. Este é um trabalho muito evoluído, que combina o HM e um tipo de refinamento de predicado para inferir anotações de segurança (verificações vinculadas ao array, por exemplo) para programas no estilo ML. A inferência prossegue em 2 etapas; o primeiro é a inferência HM das anotações de tipo, que orientam a escolha dos refinamentos a serem executados.

  3. Provavelmente também devo mencionar o trabalho de Fournet, Swarmy, Chen, Strub ... sobre , uma extensão de que parece semelhante à abordagem de tipos líquidos, mas com o objetivo de verificar protocolos e algoritmos criptográficos para computação distribuída. Não tenho certeza de quanto trabalho publicado existe sobre a inferência de anotações neste caso.FF#

  4. Há um bom artigo de Chin e Khoo sobre a inferência de um tipo específico de tipos de refinamento: tipos com anotações de tamanho.

  5. A linguagem de programação ATS é um sistema que permite vários aprimoramentos e fornece facilidades para gravar programas com eles. No entanto, as anotações podem ser arbitrariamente complexas (e, portanto, indecidíveis) e, portanto, podem exigir interação do usuário. Acredito que exista uma forma de inferência para esses tipos, mas não tenho certeza de qual artigo recomendar.

  6. Por último, mas não menos importante, O algoritmo do produto cartesiano , de Ole Agesen. Embora não mencione explicitamente os tipos de refinamento, este parece ser o trabalho mais próximo de resolver o problema que você parece ter. Não se deixe enganar pela menção do polimorfismo paramétrico no resumo: eles procuram inferir tipos concretos , que são apenas tuplas de possíveis tipos atômicos. A ênfase é dada na eficiência. Eu recomendo ler este artigo primeiro para ver se ele resolve o seu problema.

λ

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.