推論を決定できる最も強力な既知の型システムは何ですか?


22

Hindley-Milner型推論(多型を持つ単純に型付けされた -calculus)には決定可能な型推論があることはよく知られています:注釈なしでプログラムの基本型を再構築できます。λ

Haskellスタイルのタイプクラスを追加すると、この決定可能性が保持されるように見えますが、さらに追加すると、注釈のない推論が決定不能になります(タイプファミリー、GADT、依存タイプ、ランクNタイプ、システムなど)ω

私は疑問に思っています:完全に決定可能な推論を持つ最も強力な既知の型システムは何ですか?Hindley-Milner(完全に決定可能)と依存型(完全に決定不能)の間のどこかにあります。推論の決定可能性を保持する追加可能なDTの側面はありますか?これをどれだけプッシュできるかを調べるために、どのような研究が行われましたか?

単一の最強システムは存在せず、推論を維持しながらHMに追加できる無限の小さな増分的な変更が存在する可能性が高いことを認識しています。しかし、システムの実用的な候補がいくつか発見されている可能性があります。

編集:「最強の」システムがないことを考えると、決定可能な推論でHindley Milnerを拡張する注目すべきシステムの概要を示す回答を受け入れます。例としては、液体タイプ、ランク2などがあります。


4
@jmiteここで他の人に同意します。実際に既知の明確な境界はありません。あるとは思わない。決定可能性タイプの推論は、すべての言語機能に本当に依存しています。たとえば、サブタイピングがあるかどうか。ランクの高いタイプのHMの拡張には、明確な境界が1つあります。ランクk> 2の場合、タイプの推論は決定できません。そうでない場合は決定可能です。
マーティンバーガー

@MartinBerger最強のものはないことを認めますが、あなたが言及したランク2のような注目すべきものを概説する良い答えがまだあると思います。
jmite

1
@jmite型推論のための決定可能性の大要を持つことは素晴らしいことです。そのようなことはありません、それはすべて数百の論文が悲しいかな配布されています。たぶんあなたはそれを書くことができます、それはコミュニティへの素晴らしいサービスでしょう。
マーティンバーガー

質問への回答を書くのは難しいかもしれませんが、確かにディディエレミーによる最近の型推論の研究は(その参考文献とともに)質問者の興味を引くかもしれません。
ejgallego

回答:


2

[編集:それぞれにいくつかの単語を書いてください]

HM型推論を拡張する方法はいくつかあります。私の答えは、それらのいくつかを実装するための多くの、多かれ少なかれ成功した試みに基づいています。私が最初につまずいたのは、パラメトリック多型です。HMをこの方向に拡張しようとする型システムは、System Fに向かう傾向があるため、型注釈が必要です。私が出会ったこの方向の2つの注目すべき拡張機能は次のとおりです。

  • HMFは、すべてのSystem-F型の型推論を可能にします。つまり、型の「中間」で普遍的な数量化を行うことができ、その外観はHM多型のように暗黙的に最高のスコープに位置しません。この論文は、タイプ注釈がいくつ必要で、どこに必要かについて明確なルールが存在しないことを明確に述べています。また、タイプはSystem Fのタイプであり、通常、用語にはプリンシパルタイプはありません。

  • MLFはHMの拡張であるだけでなく、システムFの拡張でもあり、タイプに対する有界な数量化の一種を導入することでHMの主要なタイププロパティを取り戻します。著者によって比較が行われました。MLFはHMFよりも厳密に強力であり、注釈は多態的に使用されるパラメーターにのみ必要です。

HMを拡張する別の方法は、制約ドメインを変更することです。

  • HM(X)は、制約ドメインXでパラメーター化されたHindley-Milnerです。このアプローチでは、HMアルゴリズムはXのドメインソルバーに送信される制約を生成します。通常のHMの場合、ドメインソルバーは統合手順であり、ドメインはタイプおよびタイプ変数から構築される一連の用語。
    Xの別の例は、Presburger算術の言語(この場合、型の推論/チェックが決定可能)またはPeano算術の言語(決定不可能)で表現される制約です。Xはさまざまな理論に沿って変化し、それぞれが必要なタイプアノテーションの量とローカリゼーションに関する独自の要件を持ち、まったくないものからすべてに至るまでさまざまです。

  • Haskellの型クラスは、フォームの型述語を追加することによる制約ドメインの一種の拡張ですMyClass(MyType)(つまり、MyType型のMyClassのインスタンスが存在することを意味します)。
    型クラスは基本的にアドホックポリモーフィズムを実装する(ほぼ)直交する概念であるため、型クラスは型推論を保持します。
    例として、インスタンスなどを持つことができるvalタイプのシンボルを使用します。コード内でそのシンボルを参照するval :: MyClass a => a場合MyClass AMyClass B実際には型推論が既に実行されているため、コンパイラは使用するクラスのインスタンスを推測できます。これは、のタイプvalが使用されるコンテキストに依存することを意味します。また、単一のvalステートメントを実行すると、ambiguous type error :コンパイラは、コンテキストに基づいて型を推測できません。

GADT、タイプファミリ、依存型、システム(F)ωなどのより高度なタイプシステムの場合、タイプはもはや「タイプ」ではなく、複雑な計算オブジェクトになります。たとえば、同じように見えない2つのタイプが必ずしも異なるわけではないことを意味します。したがって、型の平等は自明ではありません(まったく)。

実際の複雑さの例を示すために、リストの依存タイプを考えてみましょう。NList a nここaで、リスト内のオブジェクトのタイプnとその長さです。
append関数にはtypeがappend :: NList a n -> NList a m -> NList a (n + m)あり、zip関数にはがありますzip :: NList a n -> NList b n -> NList (a, b) n
ラムダがあると想像してください\a: NList t n, b: NList t m -> zip (append a b) (append b a)。ここで、zipの最初の引数はtype NList t (n + m)で、2番目の引数はtype NList t (m + n)です。
ほとんど同じですが、型チェッカーが「+」が自然数で交換することを認識していない限り、(n + m)は文字通り(m + n)ではないため、関数を拒否する必要があります。型推論/型チェックについてではなく、定理証明についてです。

液体型は、いくつかの依存型推論を行っているようです。しかし、私が理解しているように、それは実際には依存型ではなく、静的境界を計算するために追加の推論が行われる通常のHM型のようなものです。

これがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.