いいイディオムがあります。これは、タイプとプログラミング言語の第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]
しかし、これはもう正しくありません!制約 を追加する必要があります。A1≃A2
Γ⊢t:Πx:A1.BΓ⊢u:A2Γ⊢t u:B[u/x]A1≃A2
なお、表す等価モジュロコンバージョン関係(だけで、変換ルールのように、一般的に)、それは今で統一制約、あなたの用語でメタ変数を持っている可能性があるためには、。≃βη
型チェックの過程で、これらのような制約を蓄積して、最後に(または効率上の理由から)すべてを一度に解決する可能性があります。
のタイプ自体がコンテキストでメタ変数になる可能性があるため、状況はさらに複雑になります。したがって、より一般的に適用されるルールはt
Γ⊢t:CΓ⊢u:A2Γ⊢t u:B[u/x] C≃Πx:A1.B, A1≃A2
または、以前のルールを保持してルールを追加する
Γ1,x:C,Γ2⊢x:AC≃A
変数ルックアップ時。
もう1つの便利な注意点は、チェックシステムでは、変換規則は適用の直前に適用するだけでよく、場合によっては導出の最後に一度適用する必要があることです。このルールは推論システムの統一制約に対応しているため、制約を配置する場所がわかります。