使用Coq定义箭头为参数化函数的类别
Coq是版本8.10.2,我使用jwiegley制作的库 我想定义一个类别,它的对象是欧几里德空间,箭头是对象A和B之间的参数化函数(p->A->B)。参数p是任意的欧几里德空间,但不是类别的对象 我写了这段代码。类别的定义是 错误消息如下所示使用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
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您能否编辑您的问题,以包含一个简短的代码示例,说明您希望执行的操作?这似乎不正确。ASuperEuc
是一个维度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”。