如何阅读Coq对proj1_sig的定义?

时间:2017-01-04 10:12:50

标签: coq theorem-proving

在Coq中,Inductive sig (A:Type) (P:A -> Prop) : Type := exist : forall x:A, P x -> sig P. 被定义为

proj1_sig

我读作

" sig P是一种类型,其中P是取A并返回Prop的函数。定义类型,使得如果P x成立,则类型A的元素x的类型为sig P. #34;

Definition proj1_sig (e:sig P) := match e with | exist _ a b => a end. 定义为

leave_to

我不知道该怎么做。有人可以提供更直观的理解吗?

1 个答案:

答案 0 :(得分:7)

非依赖对与sig

  

定义类型,如果x成立,A类型的sig P类型为P x

这不完全正确:我们不能说x : sig A Pe类型的居民sig A P基本上是元素x : AP x拥有的证明(这称为{{} 3}})。 xP x被"包裹"一起使用数据构造函数exist

要看到这一点,我们首先考虑非依赖对类型prod,其定义如下:

Inductive prod (A B : Type) : Type :=  pair : A -> B -> A * B

prod的居民是成对的,例如pair 1 true(或使用符号,(1, true)),其中两个组件的类型 彼此

由于Coq中的A -> B只是forall _ : A, B(定义为dependent pair)的语法糖,因此prod的定义可以被移植到

Inductive prod (A B : Type) : Type :=  pair : forall _ : A, B -> prod A B

上面的定义可能有助于看到sig A P的元素是(依赖)对。

我们可以从proj1_sig

的实现和类型中获得什么

从实现中我们可以看到proj1_sig e解包了这对 返回第一个组件,即。 x,丢弃了P x的证明。

here模块包含以下注释:

  

(sig A P)或更具暗示性{x:A | P x},表示A类型的元素子集,它满足谓词P

如果我们查看proj1_sig

的类型
Check proj1_sig.

proj1_sig : forall (A : Type) (P : A -> Prop), {x : A | P x} -> A

我们会看到proj1_sig为我们提供了一种从子集A恢复超集{x : A | P x}元素的方法。

fstproj1_sig

之间的模拟

另外,我们可以说在某种意义上proj1_sig类似于Coq.Init.Specif函数,它返回一对的第一个组成部分:

Check @fst.

fst : forall A B : Type, A * B -> A

fst有一个微不足道的属性:

Goal forall A B (a : A) (b : B),
  fst (a, b) = a.
Proof. reflexivity. Qed.

我们可以为proj1_sig

制定类似的声明
Goal forall A (P : A -> Prop) (x : A) (prf : P x),
  proj1_sig (exist P x prf) = x.
Proof. reflexivity. Qed.