COQ中类型prod和sig之间的关系

时间:2012-12-13 21:23:37

标签: types coq proof-system

在COQ中,类型prod(带有一个构造函数对)对应于笛卡尔积和类型sig(存在一个构造函数)对依赖和,但是如何描述笛卡尔积是特定依赖和的情况?我想知道prod和sig之间有一个联系,例如一些定义相等,但我在参考手册中没有明确地找到它。

2 个答案:

答案 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>