推断优化类型


11

在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示:

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 }

由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。

但是,在尝试推断以下类型时遇到了障碍:

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

改写为:

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

HM会推断并因此。我想能够推断出的实际类型是:f:IntIntg:(IntInt)Int

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

我已经使用函数依赖,解决超载的类型+操作,所以我想这是一个自然的选择使用它们来解决的类型f之内g。也就是说,f在其所有应用程序中的类型共同唯一地确定的类型g。然而,事实证明,眼底不适适应可变数量的源类型。

无论如何,多态与精炼类型的相互作用是有问题的。那么,有没有一种更好的方法我不见了?我目前正在消化“ ML精炼类型”,希望能有更多文献或其他指导。

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 

Answers:


9

您偶然发现,高阶语言的静态不变量推论在实践中非常困难,除了理论上还不确定。我不确定您的问题的确切答案是什么,但请注意以下几点:

  • 如您所注意到的,多态和精简类型的表现不佳,特别是大多数通用类型的概念丢失了。这样的结果是,在存在多态性的情况下,基于细化类型的分析可能需要在整个程序分析(与成分分析相对)和启发式方法之间进行选择,以决定要为程序分配哪种类型。

  • 推断优化类型与以下各项之间有很强的关系:

    1. 计算程序的抽象解释

    2. 用命令式语言计算循环不变式。

考虑到这一点,这里有一些关于细化类型推断的混乱参考。请注意,细化类型有许多不同的风格:我倾向于对归纳数据类型的细化,因此此列表可能朝该方向倾斜。

  1. 从经典开始:Cousot&Cousot 对高阶功能程序关系抽象解释。这说明了如何使用关系语义将抽象解释扩展到高阶程序。

  2. Rhondon,Kawaguchi和Jhala的液体类型。这是一项非常先进的工作,结合了HM和谓词细化类型以为ML样式程序推断安全注释(例如,数组绑定检查)。推断分两个步骤进行;第一个是类型注释的HM推断,它指导要执行的优化选择。

  3. 我可能还应该提到Fournet,Swarmy,Chen,Strub ...关于,是的扩展,它看起来类似于液体类型方法,但其目的是验证用于以下方面的加密协议和算法分布式计算。在这种情况下,我不确定在注释的推理方面有多少已发表的著作。FF#

  4. Chin和Khoo撰写了一篇不错的论文,介绍了一种特定类型的优化类型:带有大小注释的类型。

  5. ATS编程语言是一个系统,它允许各种改进和为他们编写程序提供服务。但是,注释可能是任意复杂的(因此无法确定),因此可能需要用户交互。我相信这些类型有一种推断的形式,但是我不确定该推荐哪篇文章。

  6. 最后但并非最不重要的一点是由Ole Agesen撰写的笛卡尔乘积算法。尽管没有明确提及优化类型,但这似乎是最能解决您所遇到的问题的工作。不要被抽象中提到的参数多态性所迷惑:它们试图推断具体的类型,它们只是可能的原子类型的元组。强调效率。我建议先阅读本文,看看它是否可以解决您的问题。

注意:在存在交集类型的情况下,类型推断可能非常不确定:以最简单的形式,具有交集类型的 -terms正是严格归一化的术语。轻轻地踩着他们:)λ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.