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?
Ob
)?mor
dependem ems
et
, por exemplomor: forall s t : ob, Type
.Respostas:
Uma maneira natural de escrever o que você quer é restringir o tipo de composição apenas aos morfismos "composíveis":
adicionando, é claro, as condições:
Isso funciona, pois agora permite apenas funções de composição comprovadamente composíveis. Isso corresponde aproximadamente ao produto com fibra na teoria das categorias que você estava mencionando.
No entanto, é um pouco estranho, pois adiciona obrigações de prova a todas as aplicações do∘ = c o m p o s e
compose
que podem rapidamente se tornar incontroláveis (até mesmo expressar a associatividade é difícil!). Também impede um pouco a adição da notação , uma vez que leva 3 argumentos.compose
Esse é um problema um tanto comum na teoria dos tipos, que resulta da tensão fundamental de ter funções parciais em uma linguagem total.
Outra solução menos elegante é definir composição a ser definida em todos os lugares : e proteger todos os teoremas que envolvem composição com boa definição condições:
Essa abordagem também apresenta desvantagens, principalmente a quantidade gigantesca de obrigações de prova que seguem todas as aplicações dos axiomas básicos.
Receio que você tenha que escolher seu veneno nesse caso, ou inventar uma maneira inteligente de fazer melhor ...
fonte
f
eg
não deve depender da provae
quet(f)=s(g)
...t(f) = s(g)
estar por aí (por exemplo, se a igualdade em objetos é decidível).Depois de alguma luta, acho que a melhor maneira de fazer o que eu quero é realmente codificar o produto de fibra do tipo através de sua propriedade universal.
Ele segue esse tipo de linha:
Então a versão interna da noção de categoria é dada por:
fonte