Coq 依赖对的Church编码

Coq 依赖对的Church编码,coq,agda,dependent-type,church-encoding,Coq,Agda,Dependent Type,Church Encoding,人们可以很容易地对这样的对进行编码: Definition prod (X Y:Set) : Set := forall (Z : Set), (X -> Y -> Z) -> Z. Definition pair (X Y:Set)(x:X)(y:Y) : prod X Y := fun Z xy => xy x y. Definition pair_rec (X Y Z:Set)(p:X->Y->Z) (xy : prod X Y) : Z := xy

人们可以很容易地对这样的对进行编码:

Definition prod (X Y:Set) : Set := forall (Z : Set), (X -> Y -> Z) -> Z.

Definition pair (X Y:Set)(x:X)(y:Y) : prod X Y := fun Z xy => xy x y.

Definition pair_rec (X Y Z:Set)(p:X->Y->Z) (xy : prod X Y) : Z := xy Z p.

Definition fst (X Y:Set)(xy:prod X Y) : X := pair_rec X Y X (fun x y => x) xy.

Definition snd (X Y:Set)(xy:prod X Y) : Y := pair_rec X Y Y (fun x y => y) xy.
Definition dprod (X:Set)(Y:X->Set) : Set :=
forall (Z : Set), (forall (x:X),Y x->Z)->Z.

Definition dpair (X:Set)(Y:X->Set)(x:X)(y:Y x) : dprod X Y :=
fun Z xy => xy x y.

Definition dpair_rec (X:Set)(Y:X->Set)(Z:Set)(p:forall (x:X),Y x->Z)
(xy : dprod X Y) : Z := xy Z p.

Definition dfst (X:Set)(Y:X->Set)(xy:dprod X Y) : X :=
dpair_rec X Y X (fun x y => x) xy.

Definition dsnd (X:Set)(Y:X->Set)(xy:dprod X Y) : Y (dfst X Y xy) :=
dpair_rec X Y (Y (dfst X Y xy)) (fun x y => y) xy.
然后很容易将其推广到依赖对,如下所示:

Definition prod (X Y:Set) : Set := forall (Z : Set), (X -> Y -> Z) -> Z.

Definition pair (X Y:Set)(x:X)(y:Y) : prod X Y := fun Z xy => xy x y.

Definition pair_rec (X Y Z:Set)(p:X->Y->Z) (xy : prod X Y) : Z := xy Z p.

Definition fst (X Y:Set)(xy:prod X Y) : X := pair_rec X Y X (fun x y => x) xy.

Definition snd (X Y:Set)(xy:prod X Y) : Y := pair_rec X Y Y (fun x y => y) xy.
Definition dprod (X:Set)(Y:X->Set) : Set :=
forall (Z : Set), (forall (x:X),Y x->Z)->Z.

Definition dpair (X:Set)(Y:X->Set)(x:X)(y:Y x) : dprod X Y :=
fun Z xy => xy x y.

Definition dpair_rec (X:Set)(Y:X->Set)(Z:Set)(p:forall (x:X),Y x->Z)
(xy : dprod X Y) : Z := xy Z p.

Definition dfst (X:Set)(Y:X->Set)(xy:dprod X Y) : X :=
dpair_rec X Y X (fun x y => x) xy.

Definition dsnd (X:Set)(Y:X->Set)(xy:dprod X Y) : Y (dfst X Y xy) :=
dpair_rec X Y (Y (dfst X Y xy)) (fun x y => y) xy.
但是,最后一个定义失败,并显示错误消息:

In environment
X : Set
Y : X -> Set
xy : dprod X Y
x : X
y : Y x
The term "y" has type "Y x"
while it is expected to have type 
"Y (dfst X Y xy)".

我理解这里的问题。但解决办法是什么?换句话说,如何对依赖对进行Church编码?

在Coq或Agda中无法对依赖对进行Church编码

好的,当我们想到同质元组时,
AxA
理解为一个函数
2->a
。这也适用于异构系统 像AxB这样的元组使用依赖函数
pix:2.if x则A else B
。 然而,下一个逻辑步骤是
Sigma x:A.B x
,这没有什么好处 表示为函数(除非我们接受非常依赖 在我看来,这些功能与类型理论的精神背道而驰)。 因此,在我看来,从
->
Pi
x
Sigma
是主要的一个,而元组可以 表示为函数是次要的。 --Thorsten Altenkirch博士,Agda邮件列表上的某个地方


Thorsten提到的非常依赖的函数编码可以找到(注意,这不是有效的Agda,只是“疯狂依赖”类型理论的类似Agda的语法)。

没有办法在Coq或Agda中对依赖对进行Church编码

好的,当我们想到同质元组时,
AxA
理解为一个函数
2->a
。这也适用于异构系统 像AxB这样的元组使用依赖函数
pix:2.if x则A else B
。 然而,下一个逻辑步骤是
Sigma x:A.B x
,这没有什么好处 表示为函数(除非我们接受非常依赖 在我看来,这些功能与类型理论的精神背道而驰)。 因此,在我看来,从
->
Pi
x
Sigma
是主要的一个,而元组可以 表示为函数是次要的。 --Thorsten Altenkirch博士,Agda邮件列表上的某个地方


Thorsten提到的非常依赖的函数编码可以找到(请注意,这不是有效的Agda,只是“疯狂依赖”类型理论的类似Agda的语法)。

首先,让我们正确理解术语

您所调用的
dprod
实际上是一个“相依和”,而“相依积”是您可能会尝试调用的“相依函数”。原因是依赖函数泛化了常规乘积,您只需巧妙地使用
Bool

prod:Set->Set->Set
prodab=(B:Bool)->{True->A;False->B;}的情况B
{-
类型理论符号为:
prod A B=∏Bool(\B->{True->A;False->B;}的情况B)
-}
mkPair:(ab:Set)->A->B->prod A B
mkPair A B x y=\B->{True->x;False->y;}
elimProd:(A B Z:设置)->(A->B->Z)->生产A B->Z
elimProd A B Z f p=f(p真)(p假)
本着同样的精神,依赖对(通常表示为
)概括了正则和:

sum:Set->Set->Set
求和AB=∑布尔(\B->{True->A;False->B;}的情况B)
mkLeft:(ab:Set)->A->sum A B
mkLeft A B x=(真,x)
mkRight:(ab:Set)->B->sum A B
mkRight A B y=(假,y)
elimSum:(abz:Set)->(A->Z)->(B->Z)->求和abz->Z
elimSum A B Z f_u2;(真,x)=f x
elimSum A B Z_g(假,y)=g y
这可能令人困惑,但另一方面,
A(\\\->B)
是正则函数的类型,而
A(\\\->B)
是正则对的类型(例如,请参见)

因此,再一次:

  • 相依乘积=相依函数的类型
  • 相依和=相依对的类型

您的问题可以用以下方式重新表述:

通过相依乘积是否存在相依和的Church编码

这已经在Math.StackExchange上被问过了,这里给出了与您的基本相同的编码

然而,阅读对这个答案的评论,你会发现它显然缺乏预期的归纳原则。还有一个类似的问题,但是关于自然数的Church编码,以及(特别是注释)某种程度上解释了为什么Coq或Agda不足以推导归纳原理,您需要额外的假设,例如参数。还有另一种类似的情况,虽然对于Agda/Coq的具体情况,答案没有给出明确的“是”或“否”,但它们暗示这可能是不可能的

最后,我必须提到的是,就像当今许多其他类型的理论问题一样,显然。引用Mike Shulman博客文章的开头:

在这篇文章中,我将指出,在Awodey Frey Speight先前工作的基础上,(更高的)归纳类型可以使用非指示性编码及其完全相关的归纳原则来定义,特别是在普通(非指示性)情况下,在没有任何截断假设的情况下消除到所有类型族中没有任何进一步的铃声或口哨就可以预订HoTT


(虽然您将获得的(非指示性)编码很难称为Church编码。)

首先,让我们正确理解术语

您所调用的
dprod
实际上是一个“相依和”,而“相依积”是您可能会尝试调用的“相依函数”。原因是依赖函数泛化了常规乘积,您只需巧妙地使用
Bool

prod:Set->Set->Set
prodab=(B:Bool)->{True->A;False->B;}的情况B
{-
类型理论符号为:
prod A B=∏Bool(\B->情况B为{True