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.

Jon Purdy
źródło

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 :)λ

cody
źródło