私はCoqでかなり新しく、私の研究に基づいてフレームワークを開発しようとしています。私の仕事はかなり定義が重く、Coqがセットを扱うように見えるため、エンコードに問題があります。Coqのセットの一貫した配合?
あり、彼らは「種類」と呼ぶType
とSet
は、ある、と私は新しいセットを定義するためにそれらを使用することができます。
Variable X: Type.
をそしてライブラリのエンコーディング(サブ)セットは「Ensembles」とあります、 Type
からProp
までの機能である。言い換えれば、彼らはType
上の述語です:
Variable Y: Ensemble X.
Ensemble
sがより適切な数学的なセットのように感じます。さらに、それらは多くの他のライブラリによって構築されています。私はそれらに焦点を当ててみました:1つのユニバーサルセットU: Set
を定義し、U
の(サブ)Ensemble
に自分自身を制限する。しかし、いいえ。 Ensemble
sが他の変数の型として使用することはできません、また、新たなサブセットを定義するには:
Variable y: Y. (* Error *)
Variable Z: Ensemble Y. (* Error *)
は今、私はそれを回避するにはいくつかの方法があることを知っています。質問 "Subset parameter"は2つを提供します。どちらも強制変換を使用します。最初はSet
に固執します。 2番目は基本的にEnsemble
を使用します(名前ではありません)。しかし、どちらも簡単なことを達成するためには、どちらもかなりの機械が必要です。
質問:一貫して(エレガントに)ハンドリングセットの推奨方法は何ですか?
例:は、ここで私が何をしたいの例です:セットDDを想定します。一対DがDDの有限の部分集合であり、DM =(D、<)と<が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
の間で前後に行くことに注意してください。
Ensemble
を使用するライブラリはたくさんありますので、それらを扱うには良い方法が必要ですが、それらのライブラリは文書化されていないようです(まったく...)。
更新:さらに問題を複雑にするために、MSetsのように、他の多くの設定実装もあるようです。これは完全に分離しており、Ensemble
と互換性がないようです。何らかの理由でProp
ではなくbool
も使用します。 FSetsもありますが、MSetsの古いバージョンのようです。
こんにちはアダム! 「集合」と「アンサンブル」の一般的な見解を共有します。しかしこれは、(例えば)Ensembleを新しい変数の型として使用して、サブセットとして動作させるための良い方法とは言えません。まあ、強要なしではありません。おそらくその周りに道はありませんか? – mhelvens
*あなたの*質問*のサブセット部分を意味しますか?まあ、あなたの注文はとにかく部分的なものなので、宇宙_DD_の代わりにあなたの注文を定義することを妨げることがありますか?あなたが言及しなかったいくつかの追加の制約がない限り、それはそれを行うより慣習的な方法だろうと思いますか? – akoprowski
さて、私の質問のすべての部分は、実際に。その例はまさにそれでした:例。私は、(サブ)セットと(サブ)タイプを、ケースバイケースで把握することなく、一貫して切り替える方法が必要です。 ---しかし部分的な順序について:それは手動で指定された有限部分順序(有限集合と一緒に行く)です。私がDD上に注文としてそれをタイプすると、セット* D *の外側の要素を注文するかもしれません。私はそれが将来何かの証拠を混乱させるかどうかはわかりませんが、それは特に優雅ではありません。 – mhelvens