使用Coq定义箭头为参数化函数的类别

使用Coq定义箭头为参数化函数的类别,coq,category-theory,Coq,Category Theory,Coq是版本8.10.2,我使用jwiegley制作的库 我想定义一个类别,它的对象是欧几里德空间,箭头是对象A和B之间的参数化函数(p->A->B)。参数p是任意的欧几里德空间,但不是类别的对象 我写了这段代码。类别的定义是 错误消息如下所示 The type of this term is a product while it is expected to be (Euc (dim C)). 我想像这样把不同欧几里德空间的两个参数传递给I和J compose := fun A B C I

Coq是版本8.10.2,我使用jwiegley制作的库

我想定义一个类别,它的对象是欧几里德空间,箭头是对象A和B之间的参数化函数(p->A->B)。参数p是任意的欧几里德空间,但不是类别的对象

我写了这段代码。类别的定义是

错误消息如下所示

The type of this term is a product while it is expected to be (Euc (dim C)).
我想像这样把不同欧几里德空间的两个参数传递给I和J

compose := fun A B C I J {P:SuperEuc} (p:Euc (dim P)) (a:Euc (dim A)) {Q:SuperEuc} (q:Euc (dim Q))
                                    => J _ q ((I _ p) a);
compose := fun A B C I J {P:SuperEuc} (p:Euc (dim P)) (a:Euc (dim A))
                                    => J _ p (I _ p a);
但实际上,compose只接受这样一个参数

compose := fun A B C I J {P:SuperEuc} (p:Euc (dim P)) (a:Euc (dim A)) {Q:SuperEuc} (q:Euc (dim Q))
                                    => J _ q ((I _ p) a);
compose := fun A B C I J {P:SuperEuc} (p:Euc (dim P)) (a:Euc (dim A))
                                    => J _ p (I _ p a);
为什么compose只接受一个参数?
如何修复它?

您可能需要用以下内容替换
compose

compose := fun A B C I J {P:SuperEuc} (p:Euc (dim P)) (a:Euc (dim A)) 
                                    => J p ((I p) a);

我相信你真正想要的是这个

Fixpoint split_Euc {n m : nat} (xi : Euc (n + m)) : Euc n * Euc m.
Proof.
  destruct n as [ | n].
  - exact (RO, xi).
  - inversion_clear xi as [ | ? x0 xi'].
    apply split_Euc in xi' as [l r].
    exact (Rn _ x0 l, r).
Defined.
Program Definition Para : Category := {|
  obj := nat;
  hom n m := {p : nat & Euc p -> Euc n -> Euc m};
  homset n m := {| Setoid.equiv := eq |}; (* Using eq requires some axioms (funext, I think) *)
  id n := existT _ 0 (fun _ x => x);
  compose n m l ml nm :=
    let (ml_p, ml) := ml in let (nm_p, nm) := nm in
    existT
      _ (nm_p + ml_p)
      (fun pi xi =>
        let (nm_pi, ml_pi) := split_Euc pi in
        ml ml_pi (nm nm_pi xi));
|}.

obj
不应被视为代表实际对象
obj
应该是您类别中对象的标签类型。每个欧几里德空间
E^n
Para
中出现一次,对应于
nat
n
。另外,我认为你在
hom
中的量词是错误的。你的“任意”一词不是很清楚,但按照你的理解,从
E^n
E^m
的箭头是无限多的函数
Euc p->Euc n->Euc m
,每个
p
对应一个。我认为您实际上希望箭头成为单个
p
的一个函数。然后合成将“额外”参数放大为合成箭头所要求的额外参数的笛卡尔积,并将该参数在它们之间拆分。

我想将不同的参数传递给I和J。@Daisuke您能否编辑您的问题,以包含一个简短的代码示例,说明您希望执行的操作?这似乎不正确。A
SuperEuc
是一个维度
n
:nat
)和欧几里德空间中的一个点
E^n
:Euc n
)。使用
obj:=SuperEuc
,类别的对象集是所有欧几里德空间的点集的不相交并集;i、 e.您有
obj:=列表R
。如果对象被假定为欧几里德空间,那么您是否只需要
obj:=nat
,其中每个对象
n:nat
表示
Euc-n
?还是空格是指向的
P
将是
:nat
hom
中,我认为您需要
sigT
,而不是
对于所有的
,我认为您需要在
组合中进行一些加法/拆分。
中的对象必须是欧几里德空间,而不是自然数。我想将我的分类形式化为对象是欧几里德空间,现在我从SuperEuc中删除了“EucType:>EucDim”。