Предлагая уточнения типов


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. Однако, как выясняется, fundeps не поддается очень хорошо переменное число типов источников.

Во всяком случае, взаимодействие полиморфизма и уточнения типизации является проблематичным. Так есть ли лучший подход, который я пропускаю? В настоящее время я перевариваю «Типы уточнения для 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 

Ответы:


9

Вы наткнулись на тот факт, что вывод статических инвариантов для языков высшего порядка довольно сложен на практике, в дополнение к неразрешимости в теории. Я не уверен, что окончательный ответ на ваш вопрос, но обратите внимание несколько вещей:

  • Как вы заметили, типы полиморфизма и уточнения ведут себя плохо вместе, в частности, теряется понятие наиболее общего типа. Следствием этого является то, что при анализе на основе типов уточнения при наличии полиморфизма может потребоваться выбор между анализом всей программы (в отличие от композиционного анализа) и использованием эвристики, чтобы решить, какой тип вы хотите назначить своей программе.

  • Существует тесная взаимосвязь между типами умозаключения утончения и:

    1. Вычислительный абстрактную интерпретацию вашей программы

    2. Вычислительные циклические инварианты в императивном языке.

Имея это в виду, вот несколько неорганизованных ссылок на вывод типов уточнения. Обратите внимание, что есть много различных вкусов уточняющих типов: Я, как правило, больше заинтересованы в тонкостях индуктивных типов данных, так что этот список может быть перекосом в этом направлении.

  1. Начнем с классики: реляционная абстрактная интерпретация высших порядков функциональных программ по Cousot и Cousot. Это объясняет , как расширить абстрактную интерпретацию программ высшего порядка с использованием реляционной семантики.

  2. Жидкие типы по Rhondon, Кавагути и Jhala. Это очень развитая работа, в которой сочетаются HM и тип уточнения предикатов для вывода аннотаций безопасности (например, проверок с привязкой к массиву) для программ в стиле ML. Вывод происходит в 2 этапа; Во-первых, это HM-вывод типов аннотаций, которые определяют выбор уточнений, которые необходимо выполнить.

  3. Я, вероятно, также должен упомянуть работу Fournet, Swarmy, Chen, Strub ... по , расширение которое кажется похожим на подход жидких типов, но с целью проверки криптографических протоколов и алгоритмов для распределенных вычислений. Я не уверен, сколько опубликованной работы есть на вывод аннотаций в этом случае.FF#

  4. Есть хорошая статья Чина и Ху о выводе определенного типа типов уточнения: типов с примечаниями размера.

  5. Язык программирования ATS - это система, которая допускает различные усовершенствования и предоставляет возможности для написания с ними программ. Однако аннотации могут быть сколь угодно сложными (и, следовательно, неразрешимыми) и, следовательно, могут потребовать взаимодействия с пользователем. Я считаю, что для этих типов существует какая-то форма вывода, однако я не уверен, какую статью рекомендовать.

  6. И последнее, но не менее важное : алгоритм декартовых произведений Оле Агесена. Не упоминая явно типы уточнения, похоже, это работа, наиболее близкая к решению проблемы, с которой вы, похоже, столкнулись. Не дайте себя одурачить упоминанием параметрического полиморфизма в аннотации: они пытаются вывести конкретные типы , которые являются просто кортежами возможных атомарных типов. Акцент делается на эффективность. Я рекомендую сначала прочитать эту статью, чтобы увидеть, решит ли она вашу проблему.

Дополнительное примечание: вывод типа при наличии типов пересечений может быть очень неразрешимым: в простейшей форме термины с типом пересечения являются в точности строго нормализующими членами. Мягко ступай вокруг них :)λ

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.