依存型付けのメタ変数を解決するための制約を生成しますか?


8

依存型では、ミラーパターンの統一を使用して、高次の統一の決定可能なフラグメントを解決します。これにより、依存型付けされた言語にメタ変数または暗黙の引数を含めることができます。

パターンフラグメントに統一問題がある場合、解決策が存在する場合にそれを見つける方法を説明する多くの論文があります。例としては、(Gundry-McBride)(Abel-Pientka)、オリジナルのMillerペーパーなどがあります。

私が不思議に思っているのは、メタ変数(または暗黙の引数)を含む依存型プログラムが与えられた場合、統一ソルバーに渡される問題をどのように生成するのでしょうか。


ノレルの論文を見たことがありますか?cse.chalmers.se/~ulfn/papers/thesis.pdf
アダムス

基本的な考え方は、双方向の型チェックを行うが、大文字小文字を使用する代わりにメタで統一することです。
fread2281

@adamse私は認めますが、それを理解し、実際の制約が生成される場所を確認するのにかなり苦労しました。
jmite 2016

2
eb.host.cs.st-andrews.ac.uk/drafts/impldtp.pdfはイドリスの詳細を説明しており、特にセクション4の一部が必要な場合があります
Edwin Brady

1
インプリシットの場合、判断の認証期間のメタ変数としての穴に対処できる必要がありますG |-t:A.最悪の場合、居住問題に陥ります。en.wikipedia.org/wiki/Type_inhabitation
Mostowski折りたたむ

回答:


8

いいイディオムがあります。これは、タイプとプログラミング言語の第22章で詳しく説明されています(依存型ではなく多相性に使用されますが、考え方は同じです)。イディオムは次のとおりです。

チェックシステムは、規則を線形にして制約を追加することにより、型推論システムに変えることができます

例としてアプリケーションルールを使用します。依存型のチェックルールは次のとおりです。

Γt:Πx:A.BΓu:AΓt u:B[u/x]

このルールを線形化、次のように、の2つのオカレンスの名前を変更する必要があります。A

Γt:Πx:A1.BΓu:A2Γt u:B[u/x]

しかし、これはもう正しくありません!制約 を追加する必要がありますA1A2

Γt:Πx:A1.BΓu:A2Γt u:B[u/x]A1A2

なお、表す等価モジュロコンバージョン関係(だけで、変換ルールのように、一般的に)、それは今で統一制約、あなたの用語でメタ変数を持っている可能性があるためには、。βη

型チェックの過程で、これらのような制約を蓄積して、最後に(または効率上の理由から)すべてを一度に解決する可能性があります。

のタイプ自体がコンテキストでメタ変数になる可能性があるため、状況はさらに複雑になります。したがって、より一般的に適用されるルールはt

Γt:CΓu:A2Γt u:B[u/x] CΠx:A1.B, A1A2

または、以前のルールを保持してルールを追加する

Γ1,x:C,Γ2x:ACA

変数ルックアップ時。

もう1つの便利な注意点は、チェックシステムでは、変換規則は適用の直前に適用するだけでよく、場合によっては導出の最後に一度適用する必要があることです。このルールは推論システムの統一制約に対応しているため、制約を配置する場所がわかります。


これは非常に役立ちます。このための完全なシステムを説明している参考文献を知っていますか?特に、ラムダ式の制約を生成するのに問題があり、Piタイプからの自由変数を処理します。
jmite 2016

1
arXiv に関する論文があり、詳細な詳細が記載されています。おそらく3.5節に最も興味がありますが、私が思うほど教訓的ではありません。
cody 2016

@ j4nbur53:それは正しいです、確かにあなたは確かに一般にそのような制約を解決する必要があります。ただし、ほとんどの場合、の型を -type として取得するのはかなり簡単で、対応するが結果として得られます。この考え方は、双方向型チェックの概念に含まれています。tΠB(x)
cody

私が実際に意味しているのは、それがあなたが探しているものだからです(取得するのは簡単です)。「(=)/ 2導入」の意味がわかりません。最初のリンクでは、制約のあるシステム線形です。B(x)B(u)
cody

この論文では、を含むすべてがメタ変数であると想定しています。この場合、に追加の制約がない場合、問題は制約が不十分であると見なされ、(Coqと同様に)エラーメッセージが表示されます。これは正しい動作だと私は主張します。もちろん、この状況でのの型が、たとえば型クラスの生息地の目撃者である場合、そのような生息地を検索するための特別なルーチンが必要になります。ttt
cody

4

deBruijnインデックスを介してラムダ項をモデル化し、Prolog変数を介してメタ変数をモデル化すると、Prolog制約ソルバーを構築できます。以下は、すでに非常にうまく機能する例です。使用された基本的な制約は次のとおりです。

%shift(+ Indexed、+ Nat、+ Nat、-Indexed)
%subst(+ Indexed、+ Nat、+ Indexed、-Indexed)
%reduce(+ Indexed、+ Indexed、-Indexed)
https://gist.github。 com / jburse / 0ccd12698bfa24ce5c36#file-implicit2-p

機械全体でも、特定の順序でベータ削減を行うという点で、通常の形式を目指していると想定しています。ノーマライザと上記の新しい制約がどのように生成されるかの間には相互作用があります。redexを削減するには、正規化の再評価が必要になる場合があります。

制約ソルバーはすでにいくつかの相互制約の簡略化を実装していますが、これらの簡略化と制約遅延のみがなければ、制約ソルバーはあまりにも馬鹿げており、実用的ではありません。まだ1つまたは2つの簡略化を追加する予定です。簡略化のための山は次の論文です:

λ-calculusA
形式的開発における残差理論、Gerard Huet、1998年
http://pauillac.inria.fr/~huet/PUBLIC/residuals.pdf

この論文では、私たちが使用していた制約の元々の帰納的定義も見つけます。次のセクションを参照してください:
2.2解除
2.3置換
3.1ワンステップβ削減

警告: deBruijn用語は通常の用語と同等に役立ちます。アルファ変換の手順は必要ありません。ただし、非レベルの依存型を使用しているため、たとえば、内部では型と種類の区別はありません。これにより、ベンチャー全体が特にシンプルになりますが、これは非標準です。

バイバイ


したがって、Prologの変数として表されるメタにPrologの統合を使用せず、代わりに独自の制約を解決しますか?
2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.