依存型プログラミングでは、データを分解して再帰を実行する主な方法が2つあります。
- 依存パターンマッチング:関数定義は複数の句として指定されます。統一により、すべての省略されたケースが不可能であることが保証され、外部ソルバーが再帰の根拠を確実にします。
- エリミネーター:各帰納的データ型は、帰納原理として、および型値を分解する再帰関数として機能する、関連する定数があります。これらはより冗長ですが、合計であり(すべてのケースはカバーされ)、構造によって終了するという利点があります。
エリミネーターが基本的に数学的帰納であるなどの一般的なデータ型のエリミネーターや、エリミネーターが基本的にフォールドであるを見てきました。
私は依存パターンマッチングに関するいくつかの論文を読んでおり、その多くはデータ型を定義できる型理論に言及しており、エリミネーターは理論によって提供されます。たとえば、依存パターンマッチングの除去では、UTTがエリミネーターに基づいている方法と、公理存在下でパターンマッチングを除去に変換する方法について説明しています。私の理解では、データ型が定義されると、理論はエリミネーターを提供します。
私が見つけていない(または、少なくとも見た場合に認識されていない)ことは、エリミネーター(タイプとセマンティクスの両方)をどのようにして導き出すことができるかについての良い説明です。
誰かが、データ型の定義からエリミネーターを取得する方法を説明する参照を私に指摘できますか?
構造の微積分またはCoqの文献に説明があると思います(厳密に正の型については、より複雑な型のCoqのエリミネーターは完全には一般的ではありません)。
—
Gilles「SO-邪悪なことをやめよう」
@Gilles私の理解では、Coqはエリミネーターを使用せず、代わりに個別の一致演算子と(保護された)修正演算子を使用していました。
—
jmite 2018年
コア言語はエリミネーターを使用しませんが、型を定義すると、Coqは
—
Gilles 'SO-悪をやめる'
fix
およびで定義されるエリミネーターを生成しmatch
ます。手元に参照はありませんが、このエリミネーターがどのようにして生成されるかについて何か読んだことは知っています。cs.stackexchange.com/questions/104/…が興味深いかもしれません。
T
Coqは、任意の誘導型についてT_ind
、従属エリミネーターである誘導原理を定義します。これは、再帰とパターンマッチングの観点から定義されますが、原則として、同じ型(同じセマンティクスを持つ)を持つ新しい定数と見なすことができます。