私は Coq の初心者で、自分の研究に基づいてフレームワークを開発しようとしています。私の仕事は非常に定義が多く、Coq がセットを扱うように見えるため、エンコードに問題があります。
彼らが「並べ替え」と呼ぶ とがType
ありSet
、それらを使用して新しいセットを定義できます。
Variable X: Type.
そして、「Ensembles」として(サブ)セットをエンコードするライブラリがあります。これは、 someType
から aまでの関数Prop
です。つまり、これらは次の述語Type
です。
Variable Y: Ensemble X.
Ensemble
適切な数学的集合のように感じます。さらに、それらは他の多くのライブラリによって構築されています。私はそれらに焦点を合わせようとしました: 1 つのユニバーサル セットU: Set
を定義し、次に自分自身を (サブ)Ensemble
オン に制限しU
ます。しかし、いいえ。Ensemble
s を他の変数の型として使用したり、新しいサブセットを定義したりすることはできません。
Variable y: Y. (* Error *)
Variable Z: Ensemble Y. (* Error *)
今、私はそれを回避する方法がいくつかあることを知っています。質問「サブセットパラメータ」は2つ提供しています。どちらも強制を使用します。最初は s に固執しSet
ます。2 番目は基本的にEnsemble
s を使用します (ただし、名前ではありません)。しかし、どちらも非常に単純なことを達成するにはかなりの機械が必要です。
質問:セットを一貫して (そしてエレガントに) 処理するための推奨される方法は何ですか?
例:これが私がやりたいことの例です: セットDDを仮定します。ペアdm = (D, <)を定義します。ここで、DはDDの有限部分集合であり、<はD上の厳密な半順序です。
強制やその他の構造を十分に調整すれば、それを達成できると確信しています。ただし、特に読みやすい方法ではありません。そして、構造をさらに操作する方法についての優れた直感がありません。たとえば、次の型チェック:
Record OrderedSet {DD: Set} : Type := {
D : (Ensemble DD);
order : (relation {d | In _ D d});
is_finite : (Finite _ D);
is_strict_partial : (is_strict_partial_order order)
}.
しかし、それが私が望んでいるものかどうかはわかりません。そしてそれは確かにあまりきれいに見えません。Set
と の間をEnsemble
、一見恣意的な方法で行ったり来たりしていることに注意してください。
sを使用するライブラリはたくさんあるEnsemble
ので、それらを扱う良い方法があるに違いありませんが、それらのライブラリはあまりよく文書化されていないようです (または... まったく)。
更新:さらに複雑なことに、MSetsなど、他にも多くのセットの実装があるようです。これは完全に別物で、 と互換性がないようEnsemble
です。bool
というよりProp
もなぜか使っています。FSetsもありますが、古いバージョンの MSets のようです。