在COQ中,类型prod(带有一个构造函数对)对应于笛卡尔积和类型sig(存在一个构造函数)对依赖和,但是如何描述笛卡尔积是特定依赖和的情况?我想知道prod和sig之间有一个联系,例如一些定义相等,但我在参考手册中没有明确地找到它。
答案 0 :(得分:7)
事实上,类型prod
更类似于sigT
而不是sig
:
Inductive prod (A B : Type) : Type :=
pair : A -> B -> A * B
Inductive sig (A : Type) (P : A -> Prop) : Type :=
exist : forall x : A, P x -> sig P
Inductive sigT (A : Type) (P : A -> Type) : Type :=
existT : forall x : A, P x -> sigT P
从元理论的角度来看,prod只是sigT的一个特例,你的snd
组件不依赖于你的fst
组件。也就是说,您可以定义:
Definition prod' A B := @sigT A (fun _ => B).
Definition pair' {A B : Type} : A -> B -> prod' A B := @existT A (fun _ => B).
Definition onetwo := pair' 1 2.
但它们在定义上并不相同,因为它们是不同的类型。你可以展示一个双射:
Definition from {A B : Type} (x : @sigT A (fun _ => B)) : prod A B.
Proof. destruct x as [a b]. auto. Defined.
Definition to {A B : Type} (x : prod A B) : @sigT A (fun _ => B).
Proof. destruct x as [a b]. econstructor; eauto. Defined.
Theorem fromto : forall {A B : Type} (x : prod A B), from (to x) = x.
Proof. intros. unfold from, to. now destruct x. Qed.
Theorem tofrom : forall {A B : Type} (x : @sigT A (fun _ => B)), to (from x) = x.
Proof. intros. unfold from, to. now destruct x. Qed.
但那不是很有趣...... :)
答案 1 :(得分:4)
当依赖和与同一产品类型同构时,产品是依赖和的特殊情况。
考虑一系列术语不依赖于索引的传统求和:一系列n
项的总和,所有这些都是x
。由于x
不依赖于索引(通常表示为i
),因此我们将其简化为n*x
。否则,我们会x_1 + x_2 + x_3 + ... + x_n
,其中每个x_i
可能不同。这是描述Coq的sigT
所具有的一种方式:一种类型为x
s的索引族,其中索引是通常与变体类型相关联的不同数据构造函数的泛化。 / p>