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.

Jon Purdy
fonte

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.

λ

cody
fonte