私はCoqの完全な初心者であり、いくつかのカテゴリー理論のものを演習として実装しようとしています。
私は多くの利用可能なそのような実装(HoTT、AwodeyのCoqコンパニオンなど)のgitリポジトリの中で少しサーフィンしましたが、すべてのプロジェクトがそのようなものを実装しているようです
Record Category : Type :=
mkCategory{
ob : Type ;
mor : ob -> ob -> Type ;
compose : forall x y z : ob,
mor x y -> mor y z -> mor x z ;
identity : forall x, mor x x ;
(* ... axioms ... *)
}.
現代の本のカテゴリーのほとんどの定義を考えると、それは自然なことです。ただし、内部的に実装する方が簡単だと思います(誤解しない限り、グロタンディークの当時の一般的な定義でした)。
定義。カテゴリはのデータです
- セット/クラス オブジェクトの
- セット/クラス 射の
- 機能 、および (略で、ソース、以下のためのターゲット、および以下のためのアイデンティティ)
- 機能 そのドメインはの繊維製品です
いくつかの公理を満たす...
このような定義の利点は、「セット/クラス」を「あるカテゴリのオブジェクト」で置き換え、「関数」を「このカテゴリの射」で置き換えることにより直接一般化され、内部カテゴリの概念につながることです。(その後、トポロジー/差分カテゴリ、またはトポス内のカテゴリなどについて話すことができます。)
私の問題は、ファイバー製品をCoqで形式化することです。私の最初の試みは次のようなことをすることです
Record Category : Type :=
mkCategory{
ob : Type ;
mor : Type ;
s : mor -> ob ;
t : mor -> ob ;
compose : mor -> mor -> option mor ;
i : ob -> mor ;
adequacy : forall f g : mor,
(exists h, (compose f g) = (some h)) -> (t f = s g) ;
(* ... axioms ... *)
}.
しかし、それは後で厄介なコードにつながる可能性があると感じています。たとえば、チェーン構成は読みにくくなります。
内部定義に基づいて実装されたプロジェクトはありますか?Coqで必要な繊維製品をすばやく定義する方法はありますか?
編集。ちなみに、私はたくさん見ます
Ob :> Type
のではなく
Ob : Type
余分な「>」の意味は何ですか?文書から、それはある種の強制であるようです。これはどういう意味ですか?
mor
に依存にs
してt
、例えばmor: forall s t : ob, Type
。
Ob
ません)?