支柱和类型

时间:2016-09-25 04:30:58

标签: coq

我注意到Coq合成了Prop和Type相等的不同归纳原则。有没有人对此有解释?

平等定义为

Inductive eq (A : Type) (x : A) : A -> Prop :=  eq_refl : x = x

相关的归纳原理有以下几种类型:

eq_ind
 : forall (A : Type) (x : A) (P : A -> Prop),
   P x -> forall y : A, x = y -> P y

现在让我们定义一个等式的挂件:

Inductive eqT {A:Type}(x:A):A->Type:= eqT_refl: eqT x x.

自动生成的归纳原理是

eqT_ind
 : forall (A : Type) (x : A) (P : forall a : A, eqT x a -> Prop),
   P x (eqT_refl x) -> forall (y : A) (e : eqT x y), P y e

1 个答案:

答案 0 :(得分:4)

注意:我将在所有地方使用_rect原则而不是_ind,因为_ind原则通常是通过_rect实现的的。

eqT_rect

的类型

让我们来看一下谓词P。 处理归纳族时,P的参数数量等于非参数参数(索引)+ 1的数量。

让我举几个例子(可以很容易地跳过它们)。

  • 自然数字根本没有参数:

    Inductive nat : Set :=  O : nat | S : nat -> nat.
    

    因此,谓词P的类型为nat -> Type

  • 列表有一个参数化参数(A):

    Inductive list (A : Type) : Type :=
      nil : list A | cons : A -> list A -> list A.
    

    同样,P只有一个参数:P : list A -> Type

  • 向量是不同的:

    Inductive vec (A : Type) : nat -> Type :=
      nil : vec A 0
    | cons : A -> forall n : nat, vec A n -> vec A (S n).
    

    P有2个参数,因为n中的vec A n是非参数参数:

    P : forall n : nat, vec A n -> Type
    

以上解释了eqT_rect(当然,eqT_ind因此而来),因为(x : A)之后的参数是非参数的,P有2个参数:

P : forall a : A, eqT x a -> Type

证明了eqT_rect的整体类型:

eqT_rect
     : forall (A : Type) (x : A) (P : forall a : A, eqT x a -> Type),
       P x (eqT_refl x) -> forall (y : A) (e : eqT x y), P y e

以这种方式获得的归纳原理称为最大归纳原理

eq_rect

的类型

为归纳谓词(例如eq)生成的归纳原则被简化以表示证明不相关(这个术语是简化归纳原理)。

在定义谓词P时,Coq只删除谓词的最后一个参数(它是被定义的类型,它存在于Prop中)。这就是eq_rect中使用的谓词是一元的原因。这个事实塑造了eq_rect

的类型
eq_rect : 
  forall (A : Type) (x : A) (P : A -> Type),
         P x -> forall y : A, x = y -> P y

如何生成最大归纳原则

我们还可以使Coq为eq生成非简化归纳原理:

Scheme eq_rect_max := Induction for eq Sort Type.

结果类型是

eq_rect_max :
  forall (A : Type) (x : A) (P : forall a : A, x = a -> Type),
         P x eq_refl -> forall (y : A) (e : x = y), P y e

,它与eqT_rect具有相同的结构。

参考

有关详细说明,请参阅教派。 14.1.3 ...... Bertot和Castéran(2004)“交互式定理证明和程序开发(Coq'Art:归纳构造的微积分)”一书中的14.1.6。