Sou totalmente iniciante na Coq e estou tentando implementar algumas coisas da teoria das categorias como um exercício.
Naveguei um pouco entre os repositórios git das muitas implementações disponíveis (HoTT, companhia de Awodey's Coq etc.), parece que todo projeto implementa algo assim
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 ... *)
}.
É meio natural, considerando a maioria das definições de categorias em livros modernos. No entanto, acho que seria mais fácil implementá-lo internamente (se não estiver enganado, era a definição comum na época de Grothendieck):
Definição. Uma categoria são os dados de
- um conjunto / classe de objetos
- um conjunto / classe de morfismos,
- funções , e ( representa fonte , por alvo , e para identidade )
- uma função cujo domínio é o produto de fibra de
satisfazendo alguns axiomas ...
A vantagem dessa definição é que ela generaliza diretamente, substituindo "conjunto / classe" por "objetos de alguma categoria" e "funções" por "morfismos dessa categoria", levando ao conceito de categoria interna . (Então você pode falar de categorias topológicas / diferenciais ou categorias dentro de um topos, etc.)
Meu problema é formalizar o produto de fibra na Coq. Minha primeira tentativa seria fazer algo como
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 ... *)
}.
Mas acho que isso poderia levar a algum código mais tarde. Por exemplo, seria difícil ler composições encadeadas.
Existe um projeto com uma implementação baseada na definição interna? Existe uma maneira rápida de definir o produto de fibra que preciso no Coq?
Editar. A propósito, eu vejo muitos
Ob :> Type
em vez de
Ob : Type
Qual é o significado do ">" extra? Pelo documento, parece que é algum tipo de coerção . O que exatamente isso significa?
mor
dependem em s
e t
, por exemplo mor: forall s t : ob, Type
.
Ob
)?