Wnioskowanie o rodzajach uściślenia


11

W pracy miałem za zadanie wnioskować o pewnych typach informacji o dynamicznym języku. Przepisuję sekwencje instrukcji na letwyrażenia zagnieżdżone , tak jak poniżej:

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 }

Ponieważ zaczynam od ogólnych informacji o typie i staram się wydedukować bardziej szczegółowe typy, naturalnym wyborem są typy wyrafinowania. Na przykład operator warunkowy zwraca sumę typów jego prawdziwych i fałszywych gałęzi. W prostych przypadkach działa bardzo dobrze.

Jednak wpadłem na przeszkodę, próbując wywnioskować, co następuje:

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

Który jest przepisany na:

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

HM wywnioskuje a w konsekwencji . Rzeczywisty typ, który chcę móc wywnioskować, to:fa:jantjantsol:(jantjant)jant

sol:τ1τ2).(jantτ1τ1τ2))τ2)

Już używam zależności funkcjonalnych do rozwiązania typu przeciążonego +operatora, więc doszedłem do wniosku, że naturalnym rozwiązaniem było użycie ich do rozwiązania typu fwewnątrz g. Oznacza to, że typy fwszystkich jego aplikacji razem jednoznacznie określają typ g. Jednak, jak się okazuje, fundeps nie nadają się zbyt dobrze do zmiennej liczby typów źródeł.

W każdym razie wzajemne oddziaływanie polimorfizmu i typowania udoskonalonego jest problematyczne. Czy brakuje mi lepszego podejścia? Obecnie trawię „Typy wyrafinowania dla ML” i doceniłbym więcej literatury lub innych wskazówek.

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 

Odpowiedzi:


9

Natknąłeś się na fakt, że wnioskowanie o niezmiennikach statycznych dla języków wyższego rzędu jest dość trudne w praktyce, a ponadto jest nierozstrzygalne w teorii. Nie jestem pewien, jaka jest ostateczna odpowiedź na twoje pytanie, ale zwróć uwagę na kilka rzeczy:

  • Jak zauważyliście, polimorfizm i typy wyrafinowania zachowują się razem źle, w szczególności utracono pojęcie najbardziej ogólnego typu. Konsekwencją tego jest to, że analizy oparte na typach udoskonalenia w obecności polimorfizmu mogą wymagać wyboru między analizą całego programu (w przeciwieństwie do analizy składu) a wykorzystaniem heurystyki, aby zdecydować, który typ chcesz przypisać do swojego programu.

  • Istnieje silny związek między wnioskującymi typami wyrafinowania a:

    1. Obliczanie abstrakcyjnej interpretacji twojego programu

    2. Niezmienniki pętli obliczeniowej w języku imperatywnym.

Mając to na uwadze, oto kilka niezorganizowanych odniesień na temat wnioskowania o typach zawężenia. Zauważ, że istnieje wiele różnych smaków typów udoskonalania: bardziej interesują mnie udoskonalenia indukcyjnych typów danych, więc ta lista może być przekrzywiona w tym kierunku.

  1. Zacznij od klasyki: Relacyjna abstrakcyjna interpretacja wyższych programów funkcjonalnych Cousot & Cousot. To wyjaśnia, jak rozszerzyć interpretację abstrakcyjną na programy wyższego rzędu przy użyciu semantyki relacyjnej.

  2. Typy płynów : Rhondon, Kawaguchi i Jhala. Jest to bardzo rozwinięta praca, która łączy HM i rodzaj udoskonalenia predykatów, aby wnioskować o adnotacjach dotyczących bezpieczeństwa (na przykład sprawdzeniach związanych z tablicą) dla programów w stylu ML. Wnioskowanie przebiega w 2 krokach; pierwszą jest wnioskowanie HM o adnotacjach typu, które kierują wyborem udoskonaleń do wykonania.

  3. Prawdopodobnie powinienem także wspomnieć o pracy Fourneta, Swarmy'ego, Chena, Strub ... na , rozszerzeniu które wydaje się podobne do podejścia do typów płynnych, ale w celu weryfikacji protokołów kryptograficznych i algorytmów dla przetwarzanie rozproszone. Nie jestem pewien, ile opublikowano pracy na temat wnioskowania w tym przypadku.F #fafa#

  4. Jest ładny artykuł autorstwa Chin i Khoo na temat wnioskowania o konkretnym rodzaju wyrafinowania: typy z adnotacjami rozmiaru.

  5. Język programowania ATS to system, który umożliwia różne udoskonalenia i zapewnia możliwość pisania programów z nimi. Jednak adnotacje mogą być dowolnie złożone (a zatem nierozstrzygalne) i dlatego mogą wymagać interakcji użytkownika. Uważam, że istnieje pewien rodzaj wnioskowania dla tych typów, nie jestem jednak pewien, który artykuł polecić.

  6. Ostatni, ale nie mniej ważny, Algorytm produktu kartezjańskiego autorstwa Ole Agesena. Chociaż nie wspominając wyraźnie o typach udoskonalenia, wydaje się, że jest to praca najbliższa rozwiązaniu problemu, który wydaje się mieć. Nie daj się zwieść wzmiance o abstrakcyjnym polimorfizmie parametrycznym: starają się wywnioskować konkretne typy , które są po prostu krotkami możliwych typów atomowych. Nacisk kładziony jest na wydajność. Zalecam przeczytanie tego artykułu, aby zobaczyć, czy to rozwiąże problem.

Uwaga dodatkowa: wnioskowanie o typie w obecności typów skrzyżowań może być bardzo nierozstrzygalne: w najprostszej formie, -termy z typem przecięcia są dokładnie terminami silnie normalizującymi. Stąpaj delikatnie wokół nich :)λ

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.